pal.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #ifndef __ALPHA_PAL_H
  2. #define __ALPHA_PAL_H
  3. /*
  4. * Common PAL-code
  5. */
  6. #define PAL_halt 0
  7. #define PAL_cflush 1
  8. #define PAL_draina 2
  9. #define PAL_bpt 128
  10. #define PAL_bugchk 129
  11. #define PAL_chmk 131
  12. #define PAL_callsys 131
  13. #define PAL_imb 134
  14. #define PAL_rduniq 158
  15. #define PAL_wruniq 159
  16. #define PAL_gentrap 170
  17. #define PAL_nphalt 190
  18. /*
  19. * VMS specific PAL-code
  20. */
  21. #define PAL_swppal 10
  22. #define PAL_mfpr_vptb 41
  23. /*
  24. * OSF specific PAL-code
  25. */
  26. #define PAL_cserve 9
  27. #define PAL_wripir 13
  28. #define PAL_rdmces 16
  29. #define PAL_wrmces 17
  30. #define PAL_wrfen 43
  31. #define PAL_wrvptptr 45
  32. #define PAL_jtopal 46
  33. #define PAL_swpctx 48
  34. #define PAL_wrval 49
  35. #define PAL_rdval 50
  36. #define PAL_tbi 51
  37. #define PAL_wrent 52
  38. #define PAL_swpipl 53
  39. #define PAL_rdps 54
  40. #define PAL_wrkgp 55
  41. #define PAL_wrusp 56
  42. #define PAL_wrperfmon 57
  43. #define PAL_rdusp 58
  44. #define PAL_whami 60
  45. #define PAL_retsys 61
  46. #define PAL_rti 63
  47. #ifdef __KERNEL__
  48. #ifndef __ASSEMBLY__
  49. extern void halt(void) __attribute__((noreturn));
  50. #define __halt() __asm__ __volatile__ ("call_pal %0 #halt" : : "i" (PAL_halt))
  51. #define imb() \
  52. __asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory")
  53. #define draina() \
  54. __asm__ __volatile__ ("call_pal %0 #draina" : : "i" (PAL_draina) : "memory")
  55. #define __CALL_PAL_R0(NAME, TYPE) \
  56. extern inline TYPE NAME(void) \
  57. { \
  58. register TYPE __r0 __asm__("$0"); \
  59. __asm__ __volatile__( \
  60. "call_pal %1 # " #NAME \
  61. :"=r" (__r0) \
  62. :"i" (PAL_ ## NAME) \
  63. :"$1", "$16", "$22", "$23", "$24", "$25"); \
  64. return __r0; \
  65. }
  66. #define __CALL_PAL_W1(NAME, TYPE0) \
  67. extern inline void NAME(TYPE0 arg0) \
  68. { \
  69. register TYPE0 __r16 __asm__("$16") = arg0; \
  70. __asm__ __volatile__( \
  71. "call_pal %1 # "#NAME \
  72. : "=r"(__r16) \
  73. : "i"(PAL_ ## NAME), "0"(__r16) \
  74. : "$1", "$22", "$23", "$24", "$25"); \
  75. }
  76. #define __CALL_PAL_W2(NAME, TYPE0, TYPE1) \
  77. extern inline void NAME(TYPE0 arg0, TYPE1 arg1) \
  78. { \
  79. register TYPE0 __r16 __asm__("$16") = arg0; \
  80. register TYPE1 __r17 __asm__("$17") = arg1; \
  81. __asm__ __volatile__( \
  82. "call_pal %2 # "#NAME \
  83. : "=r"(__r16), "=r"(__r17) \
  84. : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17) \
  85. : "$1", "$22", "$23", "$24", "$25"); \
  86. }
  87. #define __CALL_PAL_RW1(NAME, RTYPE, TYPE0) \
  88. extern inline RTYPE NAME(TYPE0 arg0) \
  89. { \
  90. register RTYPE __r0 __asm__("$0"); \
  91. register TYPE0 __r16 __asm__("$16") = arg0; \
  92. __asm__ __volatile__( \
  93. "call_pal %2 # "#NAME \
  94. : "=r"(__r16), "=r"(__r0) \
  95. : "i"(PAL_ ## NAME), "0"(__r16) \
  96. : "$1", "$22", "$23", "$24", "$25"); \
  97. return __r0; \
  98. }
  99. #define __CALL_PAL_RW2(NAME, RTYPE, TYPE0, TYPE1) \
  100. extern inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1) \
  101. { \
  102. register RTYPE __r0 __asm__("$0"); \
  103. register TYPE0 __r16 __asm__("$16") = arg0; \
  104. register TYPE1 __r17 __asm__("$17") = arg1; \
  105. __asm__ __volatile__( \
  106. "call_pal %3 # "#NAME \
  107. : "=r"(__r16), "=r"(__r17), "=r"(__r0) \
  108. : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17) \
  109. : "$1", "$22", "$23", "$24", "$25"); \
  110. return __r0; \
  111. }
  112. __CALL_PAL_W1(cflush, unsigned long);
  113. __CALL_PAL_R0(rdmces, unsigned long);
  114. __CALL_PAL_R0(rdps, unsigned long);
  115. __CALL_PAL_R0(rdusp, unsigned long);
  116. __CALL_PAL_RW1(swpipl, unsigned long, unsigned long);
  117. __CALL_PAL_R0(whami, unsigned long);
  118. __CALL_PAL_W2(wrent, void*, unsigned long);
  119. __CALL_PAL_W1(wripir, unsigned long);
  120. __CALL_PAL_W1(wrkgp, unsigned long);
  121. __CALL_PAL_W1(wrmces, unsigned long);
  122. __CALL_PAL_RW2(wrperfmon, unsigned long, unsigned long, unsigned long);
  123. __CALL_PAL_W1(wrusp, unsigned long);
  124. __CALL_PAL_W1(wrvptptr, unsigned long);
  125. /*
  126. * TB routines..
  127. */
  128. #define __tbi(nr,arg,arg1...) \
  129. ({ \
  130. register unsigned long __r16 __asm__("$16") = (nr); \
  131. register unsigned long __r17 __asm__("$17"); arg; \
  132. __asm__ __volatile__( \
  133. "call_pal %3 #__tbi" \
  134. :"=r" (__r16),"=r" (__r17) \
  135. :"0" (__r16),"i" (PAL_tbi) ,##arg1 \
  136. :"$0", "$1", "$22", "$23", "$24", "$25"); \
  137. })
  138. #define tbi(x,y) __tbi(x,__r17=(y),"1" (__r17))
  139. #define tbisi(x) __tbi(1,__r17=(x),"1" (__r17))
  140. #define tbisd(x) __tbi(2,__r17=(x),"1" (__r17))
  141. #define tbis(x) __tbi(3,__r17=(x),"1" (__r17))
  142. #define tbiap() __tbi(-1, /* no second argument */)
  143. #define tbia() __tbi(-2, /* no second argument */)
  144. #endif /* !__ASSEMBLY__ */
  145. #endif /* __KERNEL__ */
  146. #endif /* __ALPHA_PAL_H */