pal.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __ALPHA_PAL_H
  3. #define __ALPHA_PAL_H
  4. #include <uapi/asm/pal.h>
  5. #ifndef __ASSEMBLY__
  6. extern void halt(void) __attribute__((noreturn));
  7. #define __halt() __asm__ __volatile__ ("call_pal %0 #halt" : : "i" (PAL_halt))
  8. #define imb() \
  9. __asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory")
  10. #define draina() \
  11. __asm__ __volatile__ ("call_pal %0 #draina" : : "i" (PAL_draina) : "memory")
  12. #define __CALL_PAL_R0(NAME, TYPE) \
  13. extern inline TYPE NAME(void) \
  14. { \
  15. register TYPE __r0 __asm__("$0"); \
  16. __asm__ __volatile__( \
  17. "call_pal %1 # " #NAME \
  18. :"=r" (__r0) \
  19. :"i" (PAL_ ## NAME) \
  20. :"$1", "$16", "$22", "$23", "$24", "$25"); \
  21. return __r0; \
  22. }
  23. #define __CALL_PAL_W1(NAME, TYPE0) \
  24. extern inline void NAME(TYPE0 arg0) \
  25. { \
  26. register TYPE0 __r16 __asm__("$16") = arg0; \
  27. __asm__ __volatile__( \
  28. "call_pal %1 # "#NAME \
  29. : "=r"(__r16) \
  30. : "i"(PAL_ ## NAME), "0"(__r16) \
  31. : "$1", "$22", "$23", "$24", "$25"); \
  32. }
  33. #define __CALL_PAL_W2(NAME, TYPE0, TYPE1) \
  34. extern inline void NAME(TYPE0 arg0, TYPE1 arg1) \
  35. { \
  36. register TYPE0 __r16 __asm__("$16") = arg0; \
  37. register TYPE1 __r17 __asm__("$17") = arg1; \
  38. __asm__ __volatile__( \
  39. "call_pal %2 # "#NAME \
  40. : "=r"(__r16), "=r"(__r17) \
  41. : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17) \
  42. : "$1", "$22", "$23", "$24", "$25"); \
  43. }
  44. #define __CALL_PAL_RW1(NAME, RTYPE, TYPE0) \
  45. extern inline RTYPE NAME(TYPE0 arg0) \
  46. { \
  47. register RTYPE __r0 __asm__("$0"); \
  48. register TYPE0 __r16 __asm__("$16") = arg0; \
  49. __asm__ __volatile__( \
  50. "call_pal %2 # "#NAME \
  51. : "=r"(__r16), "=r"(__r0) \
  52. : "i"(PAL_ ## NAME), "0"(__r16) \
  53. : "$1", "$22", "$23", "$24", "$25"); \
  54. return __r0; \
  55. }
  56. #define __CALL_PAL_RW2(NAME, RTYPE, TYPE0, TYPE1) \
  57. extern inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1) \
  58. { \
  59. register RTYPE __r0 __asm__("$0"); \
  60. register TYPE0 __r16 __asm__("$16") = arg0; \
  61. register TYPE1 __r17 __asm__("$17") = arg1; \
  62. __asm__ __volatile__( \
  63. "call_pal %3 # "#NAME \
  64. : "=r"(__r16), "=r"(__r17), "=r"(__r0) \
  65. : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17) \
  66. : "$1", "$22", "$23", "$24", "$25"); \
  67. return __r0; \
  68. }
  69. __CALL_PAL_W1(cflush, unsigned long);
  70. __CALL_PAL_R0(rdmces, unsigned long);
  71. __CALL_PAL_R0(rdps, unsigned long);
  72. __CALL_PAL_R0(rdusp, unsigned long);
  73. __CALL_PAL_RW1(swpipl, unsigned long, unsigned long);
  74. __CALL_PAL_R0(whami, unsigned long);
  75. __CALL_PAL_W2(wrent, void*, unsigned long);
  76. __CALL_PAL_W1(wripir, unsigned long);
  77. __CALL_PAL_W1(wrkgp, unsigned long);
  78. __CALL_PAL_W1(wrmces, unsigned long);
  79. __CALL_PAL_RW2(wrperfmon, unsigned long, unsigned long, unsigned long);
  80. __CALL_PAL_W1(wrusp, unsigned long);
  81. __CALL_PAL_W1(wrvptptr, unsigned long);
  82. __CALL_PAL_RW1(wtint, unsigned long, unsigned long);
  83. /*
  84. * TB routines..
  85. */
  86. #define __tbi(nr,arg,arg1...) \
  87. ({ \
  88. register unsigned long __r16 __asm__("$16") = (nr); \
  89. register unsigned long __r17 __asm__("$17"); arg; \
  90. __asm__ __volatile__( \
  91. "call_pal %3 #__tbi" \
  92. :"=r" (__r16),"=r" (__r17) \
  93. :"0" (__r16),"i" (PAL_tbi) ,##arg1 \
  94. :"$0", "$1", "$22", "$23", "$24", "$25"); \
  95. })
  96. #define tbi(x,y) __tbi(x,__r17=(y),"1" (__r17))
  97. #define tbisi(x) __tbi(1,__r17=(x),"1" (__r17))
  98. #define tbisd(x) __tbi(2,__r17=(x),"1" (__r17))
  99. #define tbis(x) __tbi(3,__r17=(x),"1" (__r17))
  100. #define tbiap() __tbi(-1, /* no second argument */)
  101. #define tbia() __tbi(-2, /* no second argument */)
  102. /*
  103. * QEMU Cserv routines..
  104. */
  105. static inline unsigned long
  106. qemu_get_walltime(void)
  107. {
  108. register unsigned long v0 __asm__("$0");
  109. register unsigned long a0 __asm__("$16") = 3;
  110. asm("call_pal %2 # cserve get_time"
  111. : "=r"(v0), "+r"(a0)
  112. : "i"(PAL_cserve)
  113. : "$17", "$18", "$19", "$20", "$21");
  114. return v0;
  115. }
  116. static inline unsigned long
  117. qemu_get_alarm(void)
  118. {
  119. register unsigned long v0 __asm__("$0");
  120. register unsigned long a0 __asm__("$16") = 4;
  121. asm("call_pal %2 # cserve get_alarm"
  122. : "=r"(v0), "+r"(a0)
  123. : "i"(PAL_cserve)
  124. : "$17", "$18", "$19", "$20", "$21");
  125. return v0;
  126. }
  127. static inline void
  128. qemu_set_alarm_rel(unsigned long expire)
  129. {
  130. register unsigned long a0 __asm__("$16") = 5;
  131. register unsigned long a1 __asm__("$17") = expire;
  132. asm volatile("call_pal %2 # cserve set_alarm_rel"
  133. : "+r"(a0), "+r"(a1)
  134. : "i"(PAL_cserve)
  135. : "$0", "$18", "$19", "$20", "$21");
  136. }
  137. static inline void
  138. qemu_set_alarm_abs(unsigned long expire)
  139. {
  140. register unsigned long a0 __asm__("$16") = 6;
  141. register unsigned long a1 __asm__("$17") = expire;
  142. asm volatile("call_pal %2 # cserve set_alarm_abs"
  143. : "+r"(a0), "+r"(a1)
  144. : "i"(PAL_cserve)
  145. : "$0", "$18", "$19", "$20", "$21");
  146. }
  147. static inline unsigned long
  148. qemu_get_vmtime(void)
  149. {
  150. register unsigned long v0 __asm__("$0");
  151. register unsigned long a0 __asm__("$16") = 7;
  152. asm("call_pal %2 # cserve get_time"
  153. : "=r"(v0), "+r"(a0)
  154. : "i"(PAL_cserve)
  155. : "$17", "$18", "$19", "$20", "$21");
  156. return v0;
  157. }
  158. #endif /* !__ASSEMBLY__ */
  159. #endif /* __ALPHA_PAL_H */