Skip to content

Commit

Permalink
[PATCH] i386: PARAVIRT: Fix patch site clobbers to include return reg…
Browse files Browse the repository at this point in the history
…ister

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 <jeremy@xensource.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Zachary Amsden <zach@vmware.com>
  • Loading branch information
Jeremy Fitzhardinge authored and Andi Kleen committed May 2, 2007
1 parent d582203 commit 42c24fa
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 9 deletions.
2 changes: 1 addition & 1 deletion arch/i386/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 10 additions & 8 deletions include/asm-i386/paravirt.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit 42c24fa

Please sign in to comment.