entry.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
  3. #ifndef __ASM_CSKY_ENTRY_H
  4. #define __ASM_CSKY_ENTRY_H
  5. #include <asm/setup.h>
  6. #include <abi/regdef.h>
  7. #define LSAVE_PC 8
  8. #define LSAVE_PSR 12
  9. #define LSAVE_A0 24
  10. #define LSAVE_A1 28
  11. #define LSAVE_A2 32
  12. #define LSAVE_A3 36
  13. #define EPC_INCREASE 4
  14. #define EPC_KEEP 0
  15. #define KSPTOUSP
  16. #define USPTOKSP
  17. #define usp cr<14, 1>
  18. .macro INCTRAP rx
  19. addi \rx, EPC_INCREASE
  20. .endm
  21. .macro SAVE_ALL epc_inc
  22. subi sp, 152
  23. stw tls, (sp, 0)
  24. stw lr, (sp, 4)
  25. mfcr lr, epc
  26. movi tls, \epc_inc
  27. add lr, tls
  28. stw lr, (sp, 8)
  29. mfcr lr, epsr
  30. stw lr, (sp, 12)
  31. mfcr lr, usp
  32. stw lr, (sp, 16)
  33. stw a0, (sp, 20)
  34. stw a0, (sp, 24)
  35. stw a1, (sp, 28)
  36. stw a2, (sp, 32)
  37. stw a3, (sp, 36)
  38. addi sp, 40
  39. stm r4-r13, (sp)
  40. addi sp, 40
  41. stm r16-r30, (sp)
  42. #ifdef CONFIG_CPU_HAS_HILO
  43. mfhi lr
  44. stw lr, (sp, 60)
  45. mflo lr
  46. stw lr, (sp, 64)
  47. #endif
  48. subi sp, 80
  49. .endm
  50. .macro RESTORE_ALL
  51. psrclr ie
  52. ldw tls, (sp, 0)
  53. ldw lr, (sp, 4)
  54. ldw a0, (sp, 8)
  55. mtcr a0, epc
  56. ldw a0, (sp, 12)
  57. mtcr a0, epsr
  58. ldw a0, (sp, 16)
  59. mtcr a0, usp
  60. #ifdef CONFIG_CPU_HAS_HILO
  61. ldw a0, (sp, 140)
  62. mthi a0
  63. ldw a0, (sp, 144)
  64. mtlo a0
  65. #endif
  66. ldw a0, (sp, 24)
  67. ldw a1, (sp, 28)
  68. ldw a2, (sp, 32)
  69. ldw a3, (sp, 36)
  70. addi sp, 40
  71. ldm r4-r13, (sp)
  72. addi sp, 40
  73. ldm r16-r30, (sp)
  74. addi sp, 72
  75. rte
  76. .endm
  77. .macro SAVE_SWITCH_STACK
  78. subi sp, 64
  79. stm r4-r11, (sp)
  80. stw r15, (sp, 32)
  81. stw r16, (sp, 36)
  82. stw r17, (sp, 40)
  83. stw r26, (sp, 44)
  84. stw r27, (sp, 48)
  85. stw r28, (sp, 52)
  86. stw r29, (sp, 56)
  87. stw r30, (sp, 60)
  88. .endm
  89. .macro RESTORE_SWITCH_STACK
  90. ldm r4-r11, (sp)
  91. ldw r15, (sp, 32)
  92. ldw r16, (sp, 36)
  93. ldw r17, (sp, 40)
  94. ldw r26, (sp, 44)
  95. ldw r27, (sp, 48)
  96. ldw r28, (sp, 52)
  97. ldw r29, (sp, 56)
  98. ldw r30, (sp, 60)
  99. addi sp, 64
  100. .endm
  101. /* MMU registers operators. */
  102. .macro RD_MIR rx
  103. mfcr \rx, cr<0, 15>
  104. .endm
  105. .macro RD_MEH rx
  106. mfcr \rx, cr<4, 15>
  107. .endm
  108. .macro RD_MCIR rx
  109. mfcr \rx, cr<8, 15>
  110. .endm
  111. .macro RD_PGDR rx
  112. mfcr \rx, cr<29, 15>
  113. .endm
  114. .macro RD_PGDR_K rx
  115. mfcr \rx, cr<28, 15>
  116. .endm
  117. .macro WR_MEH rx
  118. mtcr \rx, cr<4, 15>
  119. .endm
  120. .macro WR_MCIR rx
  121. mtcr \rx, cr<8, 15>
  122. .endm
  123. .macro SETUP_MMU rx
  124. lrw \rx, PHYS_OFFSET | 0xe
  125. mtcr \rx, cr<30, 15>
  126. lrw \rx, (PHYS_OFFSET + 0x20000000) | 0xe
  127. mtcr \rx, cr<31, 15>
  128. .endm
  129. #endif /* __ASM_CSKY_ENTRY_H */