lwp_gcc.S 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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 cortex-a9
  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. bic r9, #0x1f
  33. orr r9, #Mode_USR
  34. cpsid i
  35. msr spsr, r9
  36. /* set data address. */
  37. mov r9, r2
  38. movs pc, r1
  39. /*
  40. * void SVC_Handler(void);
  41. */
  42. .global vector_swi
  43. .type vector_swi, % function
  44. vector_swi:
  45. push {lr}
  46. mrs lr, spsr
  47. push {r4, r5, lr}
  48. cpsie i
  49. push {r0 - r3, r12}
  50. and r0, r7, #0xff
  51. bl lwp_get_sys_api
  52. cmp r0, #0 /* r0 = api */
  53. mov lr, r0
  54. pop {r0 - r3, r12}
  55. beq svc_exit
  56. blx lr
  57. svc_exit:
  58. cpsid i
  59. pop {r4, r5, lr}
  60. msr spsr_cxsf, lr
  61. pop {lr}
  62. movs pc, lr