context_gcc.S 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2013-7-14 Peng Fan sep6200 implementation
  9. */
  10. /**
  11. * \addtogroup sep6200
  12. */
  13. /*@{*/
  14. #define NOINT 0xc0
  15. /*
  16. * rt_base_t rt_hw_interrupt_disable();
  17. */
  18. .globl rt_hw_interrupt_disable
  19. .type rt_hw_interrupt_disable, %function
  20. rt_hw_interrupt_disable:
  21. stw.w r1, [sp-], #4
  22. mov r0, asr
  23. or r1, r0, #NOINT
  24. mov.a asr, r1
  25. ldw.w r1, [sp]+, #4
  26. mov pc, lr
  27. /*
  28. * void rt_hw_interrupt_enable(rt_base_t level);
  29. */
  30. .globl rt_hw_interrupt_enable
  31. .type rt_hw_interrupt_disable, %function
  32. rt_hw_interrupt_enable:
  33. mov.a asr, r0
  34. mov pc, lr
  35. /*
  36. * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
  37. * r0 --> from
  38. * r1 --> to
  39. */
  40. .globl rt_hw_context_switch
  41. .type rt_hw_interrupt_disable, %function
  42. rt_hw_context_switch:
  43. stm.w (lr), [sp-]
  44. stm.w (r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, lr), [sp-]
  45. stm.w (r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15), [sp-]
  46. mov r4, asr
  47. stm.w (r4), [sp-]
  48. mov r4, bsr
  49. stm.w (r4), [sp-]
  50. stw sp, [r0+]
  51. ldw sp, [r1+]
  52. ldm.w (r4), [sp]+
  53. mov.a bsr,r4
  54. ldm.w (r4), [sp]+
  55. mov.a asr, r4
  56. ldm.w (r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15), [sp]+
  57. ldm.w (r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, lr, pc), [sp]+
  58. /*
  59. * void rt_hw_context_switch_to(rt_uint32 to);
  60. * r0 --> to
  61. */
  62. .globl rt_hw_context_switch_to
  63. rt_hw_context_switch_to:
  64. ldw sp, [r0+]
  65. ldm.w (r4), [sp]+
  66. mov.a bsr, r4
  67. ldm.w (r4), [sp]+
  68. mov.a asr, r4
  69. ldm.w (r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15), [sp]+
  70. ldm.w (r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, lr, pc), [sp]+
  71. /*
  72. * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
  73. */
  74. .globl rt_thread_switch_interrupt_flag
  75. .globl rt_interrupt_from_thread
  76. .globl rt_interrupt_to_thread
  77. .globl rt_hw_context_switch_interrupt
  78. rt_hw_context_switch_interrupt:
  79. ldw r2, =rt_thread_switch_interrupt_flag
  80. ldw r3, [r2+]
  81. cmpsub.a r3, #1
  82. beq _reswitch
  83. mov r3, #1
  84. stw r3, [r2+]
  85. ldw r2, =rt_interrupt_from_thread
  86. stw r0, [r2+]
  87. _reswitch:
  88. ldw r2, =rt_interrupt_to_thread
  89. stw r1, [r2+]
  90. mov pc, lr