Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=42c24fa22e86365055fc931d833f26165e687c19
Commit:     42c24fa22e86365055fc931d833f26165e687c19
Parent:     d582203578a1f3d408e27bb9042e8635954cd320
Author:     Jeremy Fitzhardinge <[EMAIL PROTECTED]>
AuthorDate: Wed May 2 19:27:14 2007 +0200
Committer:  Andi Kleen <[EMAIL PROTECTED]>
CommitDate: Wed May 2 19:27:14 2007 +0200

    [PATCH] i386: PARAVIRT: Fix patch site clobbers to include return register
    
    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]>
    Signed-off-by: Andi Kleen <[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(-)

diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S
index e901952..e07473c 100644
--- a/arch/i386/kernel/entry.S
+++ b/arch/i386/kernel/entry.S
@@ -338,7 +338,7 @@ sysenter_past_esp:
        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
diff --git a/include/asm-i386/paravirt.h b/include/asm-i386/paravirt.h
index 1dbc01f..87fd431 100644
--- a/include/asm-i386/paravirt.h
+++ b/include/asm-i386/paravirt.h
@@ -535,7 +535,7 @@ static inline unsigned long __raw_local_save_flags(void)
                                  "popl %%edx; popl %%ecx")
                     : "=a"(f)
                     : paravirt_type(save_fl),
-                      paravirt_clobber(CLBR_NONE)
+                      paravirt_clobber(CLBR_EAX)
                     : "memory", "cc");
        return f;
 }
@@ -620,27 +620,29 @@ static inline unsigned long __raw_local_irq_save(void)
        .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 */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to