1
0

lwp_gcc.S 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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-7-14 JasonHu first version
  9. */
  10. #include "rtconfig.h"
  11. .section .text.lwp
  12. /*
  13. * void lwp_switch_to_user(frame);
  14. */
  15. .global lwp_switch_to_user
  16. lwp_switch_to_user:
  17. movl 0x4(%esp), %esp
  18. addl $4,%esp // skip intr no
  19. popal
  20. popl %gs
  21. popl %fs
  22. popl %es
  23. popl %ds
  24. addl $4, %esp // skip error_code
  25. iret // enter to user mode
  26. .extern arch_syscall_exit
  27. .global sys_fork
  28. .global sys_vfork
  29. .global arch_fork_exit
  30. sys_fork:
  31. sys_vfork:
  32. jmp _sys_fork
  33. arch_fork_exit:
  34. jmp arch_syscall_exit
  35. .global sys_clone
  36. .global arch_clone_exit
  37. sys_clone:
  38. jmp _sys_clone
  39. arch_clone_exit:
  40. jmp arch_syscall_exit
  41. /**
  42. * rt thread return code
  43. */
  44. .align 4
  45. .global lwp_thread_return
  46. lwp_thread_return:
  47. movl $1, %eax // eax = 1, sys_exit
  48. movl $0, %ebx
  49. int $0x80
  50. .align 4
  51. .global lwp_thread_return_end
  52. lwp_thread_return_end:
  53. #ifdef RT_USING_SIGNALS
  54. /**
  55. * signal return code
  56. */
  57. .align 4
  58. .global lwp_signal_return
  59. lwp_signal_return:
  60. movl $0xe000, %eax // special syscall id for return code
  61. int $0x80
  62. .align 4
  63. .global lwp_signal_return_end
  64. lwp_signal_return_end:
  65. #endif /* RT_USING_SIGNALS */