Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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  * TB routines..
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, /* no second argument */)
0114 #define tbia()      __tbi(-2, /* no second argument */)
0115 
0116 /*
0117  * QEMU Cserv routines..
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 /* !__ASSEMBLY__ */
0187 #endif /* __ALPHA_PAL_H */