lwp_gcc.S 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-12-10 Jesven first version
  9. */
  10. #define Mode_USR 0x10
  11. #define Mode_FIQ 0x11
  12. #define Mode_IRQ 0x12
  13. #define Mode_SVC 0x13
  14. #define Mode_MON 0x16
  15. #define Mode_ABT 0x17
  16. #define Mode_UDF 0x1B
  17. #define Mode_SYS 0x1F
  18. #define A_Bit 0x100
  19. #define I_Bit 0x80 @; when I bit is set, IRQ is disabled
  20. #define F_Bit 0x40 @; when F bit is set, FIQ is disabled
  21. #define T_Bit 0x20
  22. .cpu arm9
  23. .syntax unified
  24. .text
  25. /*
  26. * void lwp_user_entry(args, text, data);
  27. */
  28. .global lwp_user_entry
  29. .type lwp_user_entry, % function
  30. lwp_user_entry:
  31. mrs r9, cpsr
  32. mov r8, r9
  33. bic r9, #0x1f
  34. orr r9, #Mode_USR
  35. orr r8, #I_Bit
  36. msr cpsr_c, r8
  37. msr spsr, r9
  38. /* set data address. */
  39. mov r9, r2
  40. movs pc, r1
  41. /*
  42. * void SVC_Handler(void);
  43. */
  44. .global SVC_Handler
  45. .type SVC_Handler, % function
  46. SVC_Handler:
  47. push {lr}
  48. mrs lr, spsr
  49. push {r4, r5, lr}
  50. mrs r4, cpsr
  51. bic r4, #I_Bit
  52. msr cpsr_c, r4
  53. push {r0 - r3, r12}
  54. and r0, r7, #0xff
  55. bl lwp_get_sys_api
  56. cmp r0, #0 /* r0 = api */
  57. mov r4, r0
  58. pop {r0 - r3, r12}
  59. beq svc_exit
  60. ldr lr, = svc_exit
  61. bx r4
  62. svc_exit:
  63. mrs r4, cpsr
  64. orr r4, #I_Bit
  65. msr cpsr_c, r4
  66. pop {r4, r5, lr}
  67. msr spsr_cxsf, lr
  68. pop {lr}
  69. movs pc, lr