sysdep.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #ifndef _LINUX_CSKY_SYSDEP_H
  2. #define _LINUX_CSKY_SYSDEP_H 1
  3. #include <common/sysdep.h>
  4. #include <sys/syscall.h>
  5. #undef SYS_ify
  6. #define SYS_ify(name) (__NR_##name)
  7. #ifdef __ASSEMBLER__
  8. /* ELF uses byte-counts for .align, most others use log2 of count of bytes. */
  9. #define ALIGNARG(log2) log2
  10. /* For ELF we need the `.type' directive to make shared libs work right. */
  11. #define ASM_TYPE_DIRECTIVE(name,typearg) .type name,%##typearg;
  12. #define ASM_SIZE_DIRECTIVE(name) .size name,.-name
  13. #define ENTRY(name) \
  14. .globl C_SYMBOL_NAME(name); \
  15. ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),function) \
  16. .align ALIGNARG(4); \
  17. C_LABEL(name)
  18. #undef END
  19. #define END(name) ASM_SIZE_DIRECTIVE(name)
  20. #undef ret_ERRVAL
  21. #define ret_ERRVAL rts
  22. #undef PSEUDO_END
  23. #define PSEUDO_END(name) END(name)
  24. #ifdef __PIC__
  25. #define __GET_GB \
  26. bsr 1f; \
  27. 1: lrw gb, 1b@GOTPC; \
  28. addu gb, lr;
  29. /*
  30. * __JSR must be used with __GET_GB and SAVE_ARGS
  31. */
  32. #define __JSR(symbol) \
  33. lrw a2, symbol@PLT; \
  34. add a2, gb; \
  35. ld.w a2, (a2); \
  36. jsr a2;
  37. #define PSEUDO_ERRJMP \
  38. subi sp, 8; \
  39. st.w lr, (sp); \
  40. st.w gb, (sp, 4); \
  41. __GET_GB \
  42. lrw a2, __syscall_error@PLT; \
  43. addu a2, gb; \
  44. ld.w a2, (a2); \
  45. jsr a2; \
  46. ld.w lr, (sp); \
  47. ld.w gb, (sp, 4); \
  48. addi sp, 8; \
  49. rts;
  50. #else /* __PIC__ */
  51. #define __GET_GB
  52. #define __JSR(symbol) jsri symbol;
  53. #define PSEUDO_ERRJMP \
  54. subi sp, 4; \
  55. stw lr, (sp, 0); \
  56. jsri __syscall_error; \
  57. ldw lr, (sp, 0); \
  58. addi sp, 4; \
  59. rts;
  60. #endif /* __PIC__ */
  61. #define PSEUDO_ERRVAL(name, syscall_name, args) \
  62. .text; \
  63. 99: PSEUDO_ERRJMP; \
  64. ENTRY(name); \
  65. DO_CALL(syscall_name, args); \
  66. btsti a0, 31; \
  67. bt 99b;
  68. #undef PSEUDO_END_ERRVAL
  69. #define PSEUDO_END_ERRVAL(name) \
  70. rts; \
  71. END(name)
  72. /* DO_CALL */
  73. #undef DO_CALL
  74. #ifdef __CSKYABIV2__
  75. #define DO_CALL(syscall_name, args) \
  76. DOARGS_##args \
  77. mov t0, r7; \
  78. lrw r7, SYS_ify (syscall_name); \
  79. trap 0; \
  80. mov r7, t0; \
  81. UNDOARGS_##args
  82. #define DOARGS_0
  83. #define DOARGS_1
  84. #define DOARGS_2
  85. #define DOARGS_3
  86. #define DOARGS_4
  87. #define DOARGS_5 subi sp, 4; st.w r4, (sp, 0); ld.w r4, (sp, 4);
  88. #define DOARGS_6 subi sp, 8; stm r4-r5, (sp); ld.w r4, (sp, 8); ld.w r5, (sp, 12);
  89. #define UNDOARGS_0
  90. #define UNDOARGS_1
  91. #define UNDOARGS_2
  92. #define UNDOARGS_3
  93. #define UNDOARGS_4
  94. #define UNDOARGS_5 ld.w r4, (sp, 0); addi sp, 4;
  95. #define UNDOARGS_6 ldm r4-r5, (sp); addi sp, 8;
  96. #else /* __CSKYABIV2__ */
  97. #define DO_CALL(syscall_name, args) \
  98. lrw r1, SYS_ify (syscall_name); \
  99. trap 0;
  100. #define DOARGS_0
  101. #define DOARGS_1
  102. #define DOARGS_2
  103. #define DOARGS_3
  104. #define DOARGS_4
  105. #define DOARGS_5
  106. #define DOARGS_6
  107. #define UNDOARGS_0
  108. #define UNDOARGS_1
  109. #define UNDOARGS_2
  110. #define UNDOARGS_3
  111. #define UNDOARGS_4
  112. #define UNDOARGS_5
  113. #define UNDOARGS_6
  114. #endif /* __CSKYABIV2__ */
  115. /*
  116. * define DO_CALL_2, only ABIV2 need DO_CALL_2
  117. * to be quite different with DO_CALL, DO_CALL_2 need not save r7.
  118. */
  119. #ifdef __CSKYABIV2__
  120. #undef DO_CALL_2
  121. #define DO_CALL_2(syscall_name, args) \
  122. DOARGS2_##args; \
  123. lrw r7, SYS_ify(syscall_name); \
  124. trap 0; \
  125. UNDOARGS2_##args
  126. #undef DOARGS2_0
  127. #define DOARGS2_0
  128. #undef DOARGS2_1
  129. #define DOARGS2_1 DOARGS2_0
  130. #undef DOARGS2_2
  131. #define DOARGS2_2 DOARGS2_0
  132. #undef DOARGS2_3
  133. #define DOARGS2_3 DOARGS2_0
  134. #undef DOARGS2_4
  135. #define DOARGS2_4 DOARGS2_0
  136. #undef DOARGS2_5
  137. #define DOARGS2_5 \
  138. subi sp, 8; \
  139. cfi_adjust_cfa_offset (8); \
  140. stw r4, (sp, 0); \
  141. ldw r4, (sp, 24)
  142. #undef DOARGS2_6
  143. #define DOARGS2_6 \
  144. subi sp, 8; \
  145. cfi_adjust_cfa_offset (8); \
  146. stw r4, (sp, 0); \
  147. stw r5, (sp, 4); \
  148. ldw r4, (sp, 24); \
  149. ldw r5, (sp, 28)
  150. #undef UNDOARGS2_0
  151. #define UNDOARGS2_0
  152. #undef UNDOARGS2_1
  153. #define UNDOARGS2_1 UNDOARGS2_0
  154. #undef UNDOARGS2_2
  155. #define UNDOARGS2_2 UNDOARGS2_0
  156. #undef UNDOARGS2_3
  157. #define UNDOARGS2_3 UNDOARGS2_0
  158. #undef UNDOARGS2_4
  159. #define UNDOARGS2_4 UNDOARGS2_0
  160. #undef UNDOARGS2_5
  161. #define UNDOARGS2_5 \
  162. ldw r4, (sp, 0); \
  163. addi sp, 8
  164. #undef UNDOARGS2_6
  165. #define UNDOARGS2_6 \
  166. ldw r4, (sp, 0); \
  167. ldw r5, (sp, 4); \
  168. addi sp, 8
  169. #endif /* __CSKYABIV2__ */
  170. #endif /* __ASSEMBLER__ */
  171. #endif /* _LINUX_CSKY_SYSDEP_H */