|
@@ -466,8 +466,9 @@ int paravirt_disable_iospace(void);
|
|
|
* makes sure the incoming and outgoing types are always correct.
|
|
|
*/
|
|
|
#ifdef CONFIG_X86_32
|
|
|
-#define PVOP_VCALL_ARGS \
|
|
|
- unsigned long __eax = __eax, __edx = __edx, __ecx = __ecx
|
|
|
+#define PVOP_VCALL_ARGS \
|
|
|
+ unsigned long __eax = __eax, __edx = __edx, __ecx = __ecx; \
|
|
|
+ register void *__sp asm("esp")
|
|
|
#define PVOP_CALL_ARGS PVOP_VCALL_ARGS
|
|
|
|
|
|
#define PVOP_CALL_ARG1(x) "a" ((unsigned long)(x))
|
|
@@ -485,9 +486,10 @@ int paravirt_disable_iospace(void);
|
|
|
#define VEXTRA_CLOBBERS
|
|
|
#else /* CONFIG_X86_64 */
|
|
|
/* [re]ax isn't an arg, but the return val */
|
|
|
-#define PVOP_VCALL_ARGS \
|
|
|
- unsigned long __edi = __edi, __esi = __esi, \
|
|
|
- __edx = __edx, __ecx = __ecx, __eax = __eax
|
|
|
+#define PVOP_VCALL_ARGS \
|
|
|
+ unsigned long __edi = __edi, __esi = __esi, \
|
|
|
+ __edx = __edx, __ecx = __ecx, __eax = __eax; \
|
|
|
+ register void *__sp asm("rsp")
|
|
|
#define PVOP_CALL_ARGS PVOP_VCALL_ARGS
|
|
|
|
|
|
#define PVOP_CALL_ARG1(x) "D" ((unsigned long)(x))
|
|
@@ -526,7 +528,7 @@ int paravirt_disable_iospace(void);
|
|
|
asm volatile(pre \
|
|
|
paravirt_alt(PARAVIRT_CALL) \
|
|
|
post \
|
|
|
- : call_clbr \
|
|
|
+ : call_clbr, "+r" (__sp) \
|
|
|
: paravirt_type(op), \
|
|
|
paravirt_clobber(clbr), \
|
|
|
##__VA_ARGS__ \
|
|
@@ -536,7 +538,7 @@ int paravirt_disable_iospace(void);
|
|
|
asm volatile(pre \
|
|
|
paravirt_alt(PARAVIRT_CALL) \
|
|
|
post \
|
|
|
- : call_clbr \
|
|
|
+ : call_clbr, "+r" (__sp) \
|
|
|
: paravirt_type(op), \
|
|
|
paravirt_clobber(clbr), \
|
|
|
##__VA_ARGS__ \
|
|
@@ -563,7 +565,7 @@ int paravirt_disable_iospace(void);
|
|
|
asm volatile(pre \
|
|
|
paravirt_alt(PARAVIRT_CALL) \
|
|
|
post \
|
|
|
- : call_clbr \
|
|
|
+ : call_clbr, "+r" (__sp) \
|
|
|
: paravirt_type(op), \
|
|
|
paravirt_clobber(clbr), \
|
|
|
##__VA_ARGS__ \
|