Fix a few clobbers to include the return register.  The clobbers set
is the set of all registers modified (or may be modified) by the code
snippet, regardless of whether it was deliberate or accidental.

Also, make sure that callsites which are used in contexts which don't
allow clobbers actually save and restore all clobberable registers.

Signed-off-by: Jeremy Fitzhardinge <[EMAIL PROTECTED]>
Cc: Rusty Russell <[EMAIL PROTECTED]>
Cc: Zachary Amsden <[EMAIL PROTECTED]>

---
 arch/i386/kernel/entry.S    |    2 +-
 include/asm-i386/paravirt.h |   18 ++++++++++--------
 2 files changed, 11 insertions(+), 9 deletions(-)

===================================================================
--- a/arch/i386/kernel/entry.S
+++ b/arch/i386/kernel/entry.S
@@ -342,7 +342,7 @@ 1:  movl (%ebp),%ebp
        jae syscall_badsys
        call *sys_call_table(,%eax,4)
        movl %eax,PT_EAX(%esp)
-       DISABLE_INTERRUPTS(CLBR_ECX|CLBR_EDX)
+       DISABLE_INTERRUPTS(CLBR_ANY)
        TRACE_IRQS_OFF
        movl TI_flags(%ebp), %ecx
        testw $_TIF_ALLWORK_MASK, %cx
===================================================================
--- a/include/asm-i386/paravirt.h
+++ b/include/asm-i386/paravirt.h
@@ -532,7 +532,7 @@ static inline unsigned long __raw_local_
                                  "popl %%edx; popl %%ecx")
                     : "=a"(f)
                     : paravirt_type(save_fl),
-                      paravirt_clobber(CLBR_NONE)
+                      paravirt_clobber(CLBR_EAX)
                     : "memory", "cc");
        return f;
 }
@@ -617,27 +617,29 @@ 772:;                                             \
        .popsection
 
 #define INTERRUPT_RETURN                                       \
-       PARA_SITE(PARA_PATCH(PARAVIRT_iret), CLBR_ANY,          \
+       PARA_SITE(PARA_PATCH(PARAVIRT_iret), CLBR_NONE,         \
                  jmp *%cs:paravirt_ops+PARAVIRT_iret)
 
 #define DISABLE_INTERRUPTS(clobbers)                                   \
        PARA_SITE(PARA_PATCH(PARAVIRT_irq_disable), clobbers,           \
-                 pushl %ecx; pushl %edx;                               \
+                 pushl %eax; pushl %ecx; pushl %edx;                   \
                  call *%cs:paravirt_ops+PARAVIRT_irq_disable;          \
-                 popl %edx; popl %ecx)                                 \
+                 popl %edx; popl %ecx; popl %eax)                      \
 
 #define ENABLE_INTERRUPTS(clobbers)                                    \
        PARA_SITE(PARA_PATCH(PARAVIRT_irq_enable), clobbers,            \
-                 pushl %ecx; pushl %edx;                               \
+                 pushl %eax; pushl %ecx; pushl %edx;                   \
                  call *%cs:paravirt_ops+PARAVIRT_irq_enable;           \
-                 popl %edx; popl %ecx)
+                 popl %edx; popl %ecx; popl %eax)
 
 #define ENABLE_INTERRUPTS_SYSEXIT                                      \
-       PARA_SITE(PARA_PATCH(PARAVIRT_irq_enable_sysexit), CLBR_ANY,    \
+       PARA_SITE(PARA_PATCH(PARAVIRT_irq_enable_sysexit), CLBR_NONE,   \
                  jmp *%cs:paravirt_ops+PARAVIRT_irq_enable_sysexit)
 
 #define GET_CR0_INTO_EAX                       \
-       call *paravirt_ops+PARAVIRT_read_cr0
+       push %ecx; push %edx;                   \
+       call *paravirt_ops+PARAVIRT_read_cr0;   \
+       pop %edx; pop %ecx
 
 #endif /* __ASSEMBLY__ */
 #endif /* CONFIG_PARAVIRT */

-- 

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/virtualization

Reply via email to