Browse Source

[libcpu/virt64] improve syscall tracing feature

wangxiaoyao 2 years ago
parent
commit
ae72d0239d
1 changed files with 177 additions and 19 deletions
  1. 177 19
      libcpu/risc-v/virt64/syscall_c.c

+ 177 - 19
libcpu/risc-v/virt64/syscall_c.c

@@ -12,7 +12,7 @@
 #include <rtthread.h>
 
 #define DBG_TAG "syscall"
-#define DBG_LVL DBG_INFO
+#define DBG_LVL DBG_WARNING
 #include <rtdbg.h>
 
 #include <stdint.h>
@@ -26,35 +26,193 @@
 #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);
+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);
 syscallfunc_t lwp_get_sys_api(uint32_t);
 
+static char *syscall_name[256];
+
 void syscall_handler(struct rt_hw_stack_frame *regs)
 {
-    if(regs -> a7 == 0)
+    int syscallid = regs->a7;
+    if (syscallid == 0)
     {
         LOG_E("syscall id = 0!\n");
-        while(1);
+        while (1)
+            ;
     }
 
-    if(regs -> a7 == 0xdeadbeef)
-    {
-        LOG_E("syscall id = 0xdeadbeef\n");
-        while(1);
-    }
+    syscallfunc_t syscallfunc = (syscallfunc_t)lwp_get_sys_api(syscallid);
 
-    syscallfunc_t syscallfunc = (syscallfunc_t)lwp_get_sys_api(regs -> a7);
-
-    if(syscallfunc == RT_NULL)
+    if (syscallfunc == RT_NULL)
     {
         LOG_E("unsupported syscall!\n");
-        while(1);
+        sys_exit(-1);
     }
 
-    LOG_D("syscall id = %d,arg0 = 0x%p,arg1 = 0x%p,arg2 = 0x%p,arg3 = 0x%p,arg4 = 0x%p,arg5 = 0x%p,arg6 = 0x%p",regs -> a7,regs -> a0,regs -> a1,regs -> a2,regs -> a3,regs -> a4,regs -> a5,regs -> a6);
-    LOG_D("%p", syscallfunc);
-    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_D("syscall deal ok,ret = 0x%p",regs -> a0);
+    LOG_I("[0x%lx] %s(0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx)", rt_thread_self(), syscall_name[syscallid],
+        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[syscallid], regs->a0);
 }
+
+static char *syscall_name[] = {
+    "UNDEFINED",
+    "sys_exit",
+    "sys_read",
+    "sys_write",
+    "sys_lseek",
+    "sys_open",
+    "sys_close",
+    "sys_ioctl",
+    "sys_fstat",
+    "sys_poll",
+    "sys_nanosleep",
+    "sys_gettimeofday",
+    "sys_settimeofday",
+    "sys_exec",
+    "sys_kill",
+    "sys_getpid",
+    "sys_getpriority",
+    "sys_setpriority",
+    "sys_sem_create",
+    "sys_sem_delete",
+    "sys_sem_take",
+    "sys_sem_release",
+    "sys_mutex_create",
+    "sys_mutex_delete",
+    "sys_mutex_take",
+    "sys_mutex_release",
+    "sys_event_create",
+    "sys_event_delete",
+    "sys_event_send",
+    "sys_event_recv",
+    "sys_mb_create",
+    "sys_mb_delete",
+    "sys_mb_send",
+    "sys_mb_send_wait",
+    "sys_mb_recv",
+    "sys_mq_create",
+    "sys_mq_delete",
+    "sys_mq_send",
+    "sys_mq_urgent",
+    "sys_mq_recv",
+    "sys_thread_create",
+    "sys_thread_delete",
+    "sys_thread_startup",
+    "sys_thread_self",
+    "sys_channel_open",
+    "sys_channel_close",
+    "sys_channel_send",
+    "sys_channel_send_recv_timeout",
+    "sys_channel_reply",
+    "sys_channel_recv_timeout",
+    "sys_enter_critical",
+    "sys_exit_critical",
+    "sys_brk",
+    "sys_mmap2",
+    "sys_munmap",
+    "sys_shmget",
+    "sys_shmrm",
+    "sys_shmat",
+    "sys_shmdt",
+    "sys_device_init",
+    "sys_device_register",
+    "sys_device_control",
+    "sys_device_find",
+    "sys_device_open",
+    "sys_device_close",
+    "sys_device_read",
+    "sys_device_write",
+    "sys_stat",
+    "sys_thread_find",
+    "sys_accept",
+    "sys_bind",
+    "sys_shutdown",
+    "sys_getpeername",
+    "sys_getsockname",
+    "sys_getsockopt",
+    "sys_setsockopt",
+    "sys_connect",
+    "sys_listen",
+    "sys_recv",
+    "sys_recvfrom",
+    "sys_send",
+    "sys_sendto",
+    "sys_socket",
+    "sys_closesocket",
+    "sys_getaddrinfo",
+    "sys_gethostbyname2_r",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_select",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_tick_get",
+    "sys_exit_group",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_thread_mdelay",
+    "sys_sigaction",
+    "sys_sigprocmask",
+    "sys_tkill",
+    "sys_thread_sigprocmask",
+    "sys_cacheflush",
+    "sys_notimpl",
+    "sys_notimpl",
+    "sys_waitpid",
+    "sys_timer_create",
+    "sys_timer_delete",
+    "sys_timer_start",
+    "sys_timer_stop",
+    "sys_timer_control",
+    "sys_getcwd",
+    "sys_chdir",
+    "sys_unlink",
+    "sys_mkdir",
+    "sys_rmdir",
+    "sys_getdents",
+    "sys_get_errno",
+    "sys_set_thread_area",
+    "sys_set_tid_address",
+    "sys_access",
+    "sys_pipe",
+    "sys_clock_settime",
+    "sys_clock_gettime",
+    "sys_clock_getres",
+    "sys_clone",
+    "sys_futex",
+    "sys_pmutex",
+    "sys_dup",
+    "sys_dup2",
+    "sys_rename",
+    "sys_fork",
+    "sys_execve",
+    "sys_vfork",
+    "sys_gettid",
+    "sys_prlimit64",
+    "sys_getrlimit",
+    "sys_setrlimit",
+    "sys_setsid",
+    "sys_getrandom",
+    "sys_notimpl",
+    "sys_mremap",
+    "sys_madvise",
+    "sys_sched_setparam",
+    "sys_sched_getparam",
+    "sys_sched_get_priority_max",
+    "sys_sched_get_priority_min",
+    "sys_sched_setscheduler",
+    "sys_sched_getscheduler",
+    "sys_setaffinity",
+    "sys_fsync",
+    [255] = "sys_log"
+};