64 lines
1.6 KiB
C
64 lines
1.6 KiB
C
/*
|
|
* Copyright (c) 2006-2021, RT-Thread Development Team
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
* 2021-02-03 lizhirui first version
|
|
* 2022-11-10 WangXiaoyao Add readable syscall tracing
|
|
*/
|
|
|
|
#include <rthw.h>
|
|
#include <rtthread.h>
|
|
|
|
#ifdef RT_USING_SMART
|
|
|
|
#define DBG_TAG "syscall"
|
|
#define DBG_LVL DBG_WARNING
|
|
#include <rtdbg.h>
|
|
|
|
#include <stdint.h>
|
|
#include <mmu.h>
|
|
#include <page.h>
|
|
#include <lwp_mm_area.h>
|
|
#include <lwp_user_mm.h>
|
|
|
|
#include "riscv_mmu.h"
|
|
#include "stack.h"
|
|
|
|
typedef rt_size_t (*syscallfunc_t)(rt_size_t, rt_size_t, rt_size_t, rt_size_t, rt_size_t, rt_size_t, rt_size_t);
|
|
|
|
void syscall_handler(struct rt_hw_stack_frame *regs)
|
|
{
|
|
const char *syscall_name;
|
|
int syscallid = regs->a7;
|
|
|
|
if (syscallid == 0)
|
|
{
|
|
LOG_E("syscall id = 0!\n");
|
|
while (1)
|
|
;
|
|
}
|
|
|
|
syscallfunc_t syscallfunc = (syscallfunc_t)lwp_get_sys_api(syscallid);
|
|
|
|
if (syscallfunc == RT_NULL)
|
|
{
|
|
LOG_E("unsupported syscall!\n");
|
|
sys_exit(-1);
|
|
}
|
|
|
|
#if DBG_LVL >= DBG_INFO
|
|
syscall_name = lwp_get_syscall_name(syscallid);
|
|
#endif
|
|
|
|
LOG_I("[0x%lx] %s(0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx)", rt_thread_self(), syscall_name,
|
|
regs->a0, regs->a1, regs->a2, regs->a3, regs->a4, regs->a5, regs->a6);
|
|
regs->a0 = syscallfunc(regs->a0, regs->a1, regs->a2, regs->a3, regs->a4, regs->a5, regs->a6);
|
|
regs->a7 = 0;
|
|
regs->epc += 4; // skip ecall instruction
|
|
LOG_I("[0x%lx] %s ret: 0x%lx", rt_thread_self(), syscall_name, regs->a0);
|
|
}
|
|
#endif /* RT_USING_SMART */
|