asmmacro.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #ifndef _ASM_SCORE_ASMMACRO_H
  2. #define _ASM_SCORE_ASMMACRO_H
  3. #include <asm/asm-offsets.h>
  4. #ifdef __ASSEMBLY__
  5. .macro SAVE_ALL
  6. mfcr r30, cr0
  7. mv r31, r0
  8. nop
  9. /* if UMs == 1, change stack. */
  10. slli.c r30, r30, 28
  11. bpl 1f
  12. la r31, kernelsp
  13. lw r31, [r31]
  14. 1:
  15. mv r30, r0
  16. addri r0, r31, -PT_SIZE
  17. sw r30, [r0, PT_R0]
  18. .set r1
  19. sw r1, [r0, PT_R1]
  20. .set nor1
  21. sw r2, [r0, PT_R2]
  22. sw r3, [r0, PT_R3]
  23. sw r4, [r0, PT_R4]
  24. sw r5, [r0, PT_R5]
  25. sw r6, [r0, PT_R6]
  26. sw r7, [r0, PT_R7]
  27. sw r8, [r0, PT_R8]
  28. sw r9, [r0, PT_R9]
  29. sw r10, [r0, PT_R10]
  30. sw r11, [r0, PT_R11]
  31. sw r12, [r0, PT_R12]
  32. sw r13, [r0, PT_R13]
  33. sw r14, [r0, PT_R14]
  34. sw r15, [r0, PT_R15]
  35. sw r16, [r0, PT_R16]
  36. sw r17, [r0, PT_R17]
  37. sw r18, [r0, PT_R18]
  38. sw r19, [r0, PT_R19]
  39. sw r20, [r0, PT_R20]
  40. sw r21, [r0, PT_R21]
  41. sw r22, [r0, PT_R22]
  42. sw r23, [r0, PT_R23]
  43. sw r24, [r0, PT_R24]
  44. sw r25, [r0, PT_R25]
  45. sw r25, [r0, PT_R25]
  46. sw r26, [r0, PT_R26]
  47. sw r27, [r0, PT_R27]
  48. sw r28, [r0, PT_R28]
  49. sw r29, [r0, PT_R29]
  50. orri r28, r0, 0x1fff
  51. li r31, 0x00001fff
  52. xor r28, r28, r31
  53. mfcehl r30, r31
  54. sw r30, [r0, PT_CEH]
  55. sw r31, [r0, PT_CEL]
  56. mfcr r31, cr0
  57. sw r31, [r0, PT_PSR]
  58. mfcr r31, cr1
  59. sw r31, [r0, PT_CONDITION]
  60. mfcr r31, cr2
  61. sw r31, [r0, PT_ECR]
  62. mfcr r31, cr5
  63. srli r31, r31, 1
  64. slli r31, r31, 1
  65. sw r31, [r0, PT_EPC]
  66. .endm
  67. .macro RESTORE_ALL_AND_RET
  68. mfcr r30, cr0
  69. srli r30, r30, 1
  70. slli r30, r30, 1
  71. mtcr r30, cr0
  72. nop
  73. nop
  74. nop
  75. nop
  76. nop
  77. .set r1
  78. ldis r1, 0x00ff
  79. and r30, r30, r1
  80. not r1, r1
  81. lw r31, [r0, PT_PSR]
  82. and r31, r31, r1
  83. .set nor1
  84. or r31, r31, r30
  85. mtcr r31, cr0
  86. nop
  87. nop
  88. nop
  89. nop
  90. nop
  91. lw r30, [r0, PT_CONDITION]
  92. mtcr r30, cr1
  93. nop
  94. nop
  95. nop
  96. nop
  97. nop
  98. lw r30, [r0, PT_CEH]
  99. lw r31, [r0, PT_CEL]
  100. mtcehl r30, r31
  101. .set r1
  102. lw r1, [r0, PT_R1]
  103. .set nor1
  104. lw r2, [r0, PT_R2]
  105. lw r3, [r0, PT_R3]
  106. lw r4, [r0, PT_R4]
  107. lw r5, [r0, PT_R5]
  108. lw r6, [r0, PT_R6]
  109. lw r7, [r0, PT_R7]
  110. lw r8, [r0, PT_R8]
  111. lw r9, [r0, PT_R9]
  112. lw r10, [r0, PT_R10]
  113. lw r11, [r0, PT_R11]
  114. lw r12, [r0, PT_R12]
  115. lw r13, [r0, PT_R13]
  116. lw r14, [r0, PT_R14]
  117. lw r15, [r0, PT_R15]
  118. lw r16, [r0, PT_R16]
  119. lw r17, [r0, PT_R17]
  120. lw r18, [r0, PT_R18]
  121. lw r19, [r0, PT_R19]
  122. lw r20, [r0, PT_R20]
  123. lw r21, [r0, PT_R21]
  124. lw r22, [r0, PT_R22]
  125. lw r23, [r0, PT_R23]
  126. lw r24, [r0, PT_R24]
  127. lw r25, [r0, PT_R25]
  128. lw r26, [r0, PT_R26]
  129. lw r27, [r0, PT_R27]
  130. lw r28, [r0, PT_R28]
  131. lw r29, [r0, PT_R29]
  132. lw r30, [r0, PT_EPC]
  133. lw r0, [r0, PT_R0]
  134. mtcr r30, cr5
  135. rte
  136. .endm
  137. #endif /* __ASSEMBLY__ */
  138. #endif /* _ASM_SCORE_ASMMACRO_H */