syscall_c.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-02-03 lizhirui first version
  9. * 2021-07-27 JasonHu port to i386
  10. */
  11. #include <rthw.h>
  12. #include <rtthread.h>
  13. #include <rtconfig.h>
  14. //#define DBG_LEVEL DBG_WARNING
  15. //#define DBG_LEVEL DBG_INFO
  16. #include <rtdbg.h>
  17. #ifdef RT_USING_USERSPACE
  18. #include <stdint.h>
  19. #include <mmu.h>
  20. #include <page.h>
  21. #include <lwp_mm_area.h>
  22. #include <lwp_user_mm.h>
  23. #include <lwp_arch.h>
  24. #include "stackframe.h"
  25. #ifdef RT_USING_SIGNALS
  26. #include <lwp_signal.h>
  27. #endif /* RT_USING_SIGNALS */
  28. 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);
  29. syscallfunc_t lwp_get_sys_api(uint32_t);
  30. void rt_hw_syscall_dispath(struct rt_hw_stack_frame *frame)
  31. {
  32. if(frame->eax == 0)
  33. {
  34. dbg_log(DBG_ERROR, "[syscall] thread %s called syscall id = 0!\n", rt_thread_self()->name);
  35. #ifdef RT_USING_SIGNALS
  36. lwp_thread_kill(rt_thread_self(), SIGSYS);
  37. #else
  38. for(;;)
  39. {
  40. }
  41. #endif
  42. }
  43. if(frame->eax == 0xdeadbeef)
  44. {
  45. dbg_log(DBG_ERROR, "[syscall] thread %s called syscall id = 0xdeadbeef!\n", rt_thread_self()->name);
  46. #ifdef RT_USING_SIGNALS
  47. lwp_thread_kill(rt_thread_self(), SIGSYS);
  48. #else
  49. for(;;)
  50. {
  51. }
  52. #endif
  53. }
  54. #ifdef RT_USING_SIGNALS
  55. if(frame->eax == SIGNAL_RETURN_SYSCAL_ID) /* signal return */
  56. {
  57. lwp_signal_do_return(frame);
  58. return;
  59. }
  60. #endif /* RT_USING_SIGNALS */
  61. syscallfunc_t syscallfunc = (syscallfunc_t)lwp_get_sys_api(frame->eax);
  62. if(syscallfunc == RT_NULL)
  63. {
  64. dbg_log(DBG_ERROR, "[syscall] thread %s called unsupported syscall %d!\n",
  65. rt_thread_self()->name, frame->eax);
  66. #ifdef RT_USING_SIGNALS
  67. lwp_thread_kill(rt_thread_self(), SIGSYS);
  68. #else
  69. for(;;)
  70. {
  71. }
  72. #endif
  73. }
  74. /* TODO: support arg6 */
  75. LOG_I("\033[36msyscall id = %d,arg0 = 0x%p,arg1 = 0x%p,arg2 = 0x%p,arg3 = 0x%p,arg4 = 0x%p,"
  76. "arg5 = 0x%p,arg6 = 0x%p(unsupport)\n\033[37m",
  77. frame->eax, frame->ebx, frame->ecx, frame->edx, frame->esi, frame->edi, frame->ebp, 0);
  78. frame->eax = syscallfunc(frame->ebx, frame->ecx, frame->edx, frame->esi, frame->edi, frame->ebp, 0);
  79. LOG_I("\033[36msyscall deal ok,ret = 0x%p\n\033[37m",frame->eax);
  80. }
  81. #endif /* RT_USING_USERSPACE */