0001
0002 #ifndef __ALPHA_PAL_H
0003 #define __ALPHA_PAL_H
0004
0005 #include <uapi/asm/pal.h>
0006
0007 #ifndef __ASSEMBLY__
0008
0009 extern void halt(void) __attribute__((noreturn));
0010 #define __halt() __asm__ __volatile__ ("call_pal %0 #halt" : : "i" (PAL_halt))
0011
0012 #define imb() \
0013 __asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory")
0014
0015 #define draina() \
0016 __asm__ __volatile__ ("call_pal %0 #draina" : : "i" (PAL_draina) : "memory")
0017
0018 #define __CALL_PAL_R0(NAME, TYPE) \
0019 extern inline TYPE NAME(void) \
0020 { \
0021 register TYPE __r0 __asm__("$0"); \
0022 __asm__ __volatile__( \
0023 "call_pal %1 # " #NAME \
0024 :"=r" (__r0) \
0025 :"i" (PAL_ ## NAME) \
0026 :"$1", "$16", "$22", "$23", "$24", "$25"); \
0027 return __r0; \
0028 }
0029
0030 #define __CALL_PAL_W1(NAME, TYPE0) \
0031 extern inline void NAME(TYPE0 arg0) \
0032 { \
0033 register TYPE0 __r16 __asm__("$16") = arg0; \
0034 __asm__ __volatile__( \
0035 "call_pal %1 # "#NAME \
0036 : "=r"(__r16) \
0037 : "i"(PAL_ ## NAME), "0"(__r16) \
0038 : "$1", "$22", "$23", "$24", "$25"); \
0039 }
0040
0041 #define __CALL_PAL_W2(NAME, TYPE0, TYPE1) \
0042 extern inline void NAME(TYPE0 arg0, TYPE1 arg1) \
0043 { \
0044 register TYPE0 __r16 __asm__("$16") = arg0; \
0045 register TYPE1 __r17 __asm__("$17") = arg1; \
0046 __asm__ __volatile__( \
0047 "call_pal %2 # "#NAME \
0048 : "=r"(__r16), "=r"(__r17) \
0049 : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17) \
0050 : "$1", "$22", "$23", "$24", "$25"); \
0051 }
0052
0053 #define __CALL_PAL_RW1(NAME, RTYPE, TYPE0) \
0054 extern inline RTYPE NAME(TYPE0 arg0) \
0055 { \
0056 register RTYPE __r0 __asm__("$0"); \
0057 register TYPE0 __r16 __asm__("$16") = arg0; \
0058 __asm__ __volatile__( \
0059 "call_pal %2 # "#NAME \
0060 : "=r"(__r16), "=r"(__r0) \
0061 : "i"(PAL_ ## NAME), "0"(__r16) \
0062 : "$1", "$22", "$23", "$24", "$25"); \
0063 return __r0; \
0064 }
0065
0066 #define __CALL_PAL_RW2(NAME, RTYPE, TYPE0, TYPE1) \
0067 extern inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1) \
0068 { \
0069 register RTYPE __r0 __asm__("$0"); \
0070 register TYPE0 __r16 __asm__("$16") = arg0; \
0071 register TYPE1 __r17 __asm__("$17") = arg1; \
0072 __asm__ __volatile__( \
0073 "call_pal %3 # "#NAME \
0074 : "=r"(__r16), "=r"(__r17), "=r"(__r0) \
0075 : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17) \
0076 : "$1", "$22", "$23", "$24", "$25"); \
0077 return __r0; \
0078 }
0079
0080 __CALL_PAL_W1(cflush, unsigned long);
0081 __CALL_PAL_R0(rdmces, unsigned long);
0082 __CALL_PAL_R0(rdps, unsigned long);
0083 __CALL_PAL_R0(rdusp, unsigned long);
0084 __CALL_PAL_RW1(swpipl, unsigned long, unsigned long);
0085 __CALL_PAL_R0(whami, unsigned long);
0086 __CALL_PAL_W2(wrent, void*, unsigned long);
0087 __CALL_PAL_W1(wripir, unsigned long);
0088 __CALL_PAL_W1(wrkgp, unsigned long);
0089 __CALL_PAL_W1(wrmces, unsigned long);
0090 __CALL_PAL_RW2(wrperfmon, unsigned long, unsigned long, unsigned long);
0091 __CALL_PAL_W1(wrusp, unsigned long);
0092 __CALL_PAL_W1(wrvptptr, unsigned long);
0093 __CALL_PAL_RW1(wtint, unsigned long, unsigned long);
0094
0095
0096
0097
0098 #define __tbi(nr,arg,arg1...) \
0099 ({ \
0100 register unsigned long __r16 __asm__("$16") = (nr); \
0101 register unsigned long __r17 __asm__("$17"); arg; \
0102 __asm__ __volatile__( \
0103 "call_pal %3 #__tbi" \
0104 :"=r" (__r16),"=r" (__r17) \
0105 :"0" (__r16),"i" (PAL_tbi) ,##arg1 \
0106 :"$0", "$1", "$22", "$23", "$24", "$25"); \
0107 })
0108
0109 #define tbi(x,y) __tbi(x,__r17=(y),"1" (__r17))
0110 #define tbisi(x) __tbi(1,__r17=(x),"1" (__r17))
0111 #define tbisd(x) __tbi(2,__r17=(x),"1" (__r17))
0112 #define tbis(x) __tbi(3,__r17=(x),"1" (__r17))
0113 #define tbiap() __tbi(-1, )
0114 #define tbia() __tbi(-2, )
0115
0116
0117
0118
0119
0120 static inline unsigned long
0121 qemu_get_walltime(void)
0122 {
0123 register unsigned long v0 __asm__("$0");
0124 register unsigned long a0 __asm__("$16") = 3;
0125
0126 asm("call_pal %2 # cserve get_time"
0127 : "=r"(v0), "+r"(a0)
0128 : "i"(PAL_cserve)
0129 : "$17", "$18", "$19", "$20", "$21");
0130
0131 return v0;
0132 }
0133
0134 static inline unsigned long
0135 qemu_get_alarm(void)
0136 {
0137 register unsigned long v0 __asm__("$0");
0138 register unsigned long a0 __asm__("$16") = 4;
0139
0140 asm("call_pal %2 # cserve get_alarm"
0141 : "=r"(v0), "+r"(a0)
0142 : "i"(PAL_cserve)
0143 : "$17", "$18", "$19", "$20", "$21");
0144
0145 return v0;
0146 }
0147
0148 static inline void
0149 qemu_set_alarm_rel(unsigned long expire)
0150 {
0151 register unsigned long a0 __asm__("$16") = 5;
0152 register unsigned long a1 __asm__("$17") = expire;
0153
0154 asm volatile("call_pal %2 # cserve set_alarm_rel"
0155 : "+r"(a0), "+r"(a1)
0156 : "i"(PAL_cserve)
0157 : "$0", "$18", "$19", "$20", "$21");
0158 }
0159
0160 static inline void
0161 qemu_set_alarm_abs(unsigned long expire)
0162 {
0163 register unsigned long a0 __asm__("$16") = 6;
0164 register unsigned long a1 __asm__("$17") = expire;
0165
0166 asm volatile("call_pal %2 # cserve set_alarm_abs"
0167 : "+r"(a0), "+r"(a1)
0168 : "i"(PAL_cserve)
0169 : "$0", "$18", "$19", "$20", "$21");
0170 }
0171
0172 static inline unsigned long
0173 qemu_get_vmtime(void)
0174 {
0175 register unsigned long v0 __asm__("$0");
0176 register unsigned long a0 __asm__("$16") = 7;
0177
0178 asm("call_pal %2 # cserve get_time"
0179 : "=r"(v0), "+r"(a0)
0180 : "i"(PAL_cserve)
0181 : "$17", "$18", "$19", "$20", "$21");
0182
0183 return v0;
0184 }
0185
0186 #endif
0187 #endif