|
@@ -434,3 +434,46 @@ paravirt_set_rr0_to_rr4(unsigned long val0, unsigned long val1,
|
|
|
"=r"(ia64_clobber3),
|
|
|
"=r"(ia64_clobber4)
|
|
|
: PARAVIRT_OP(set_rr0_to_rr4),
|
|
|
+ "0"(__val0), "1"(__val1), "2"(__val2),
|
|
|
+ "3"(__val3), "4"(__val4)
|
|
|
+ : PARAVIRT_CLOBBERS5);
|
|
|
+}
|
|
|
+
|
|
|
+/* unsigned long paravirt_getreg(int reg) */
|
|
|
+#define __paravirt_getreg(reg) \
|
|
|
+ ({ \
|
|
|
+ register unsigned long ia64_intri_res asm ("r8"); \
|
|
|
+ register unsigned long __reg asm ("r8") = (reg); \
|
|
|
+ \
|
|
|
+ asm volatile (paravirt_alt_bundle(__PARAVIRT_BR, \
|
|
|
+ PARAVIRT_TYPE(GETREG) \
|
|
|
+ + (reg)) \
|
|
|
+ : "=r"(ia64_intri_res) \
|
|
|
+ : PARAVIRT_OP(getreg), "0"(__reg) \
|
|
|
+ : PARAVIRT_CLOBBERS1); \
|
|
|
+ \
|
|
|
+ ia64_intri_res; \
|
|
|
+ })
|
|
|
+
|
|
|
+/* void paravirt_setreg(int reg, unsigned long val) */
|
|
|
+#define paravirt_setreg(reg, val) \
|
|
|
+ do { \
|
|
|
+ register unsigned long __val asm ("r8") = val; \
|
|
|
+ register unsigned long __reg asm ("r9") = reg; \
|
|
|
+ register unsigned long ia64_clobber1 asm ("r8"); \
|
|
|
+ register unsigned long ia64_clobber2 asm ("r9"); \
|
|
|
+ \
|
|
|
+ asm volatile (paravirt_alt_bundle(__PARAVIRT_BR, \
|
|
|
+ PARAVIRT_TYPE(SETREG) \
|
|
|
+ + (reg)) \
|
|
|
+ : "=r"(ia64_clobber1), \
|
|
|
+ "=r"(ia64_clobber2) \
|
|
|
+ : PARAVIRT_OP(setreg), \
|
|
|
+ "1"(__reg), "0"(__val) \
|
|
|
+ : PARAVIRT_CLOBBERS2); \
|
|
|
+ } while (0)
|
|
|
+
|
|
|
+#endif /* ASM_SUPPORTED */
|
|
|
+#endif /* CONFIG_PARAVIRT && ASM_SUPPOTED */
|
|
|
+
|
|
|
+#endif /* _ASM_IA64_PARAVIRT_PRIVOP_H */
|