aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2009-01-31 02:17:23 -0500
committerH. Peter Anvin <hpa@zytor.com>2009-02-02 11:06:30 -0500
commite584f559c7b8711cccdf319400acd6294b2c074e (patch)
tree1e565531ed5ee273ef880cbae71593bdea2be87b
parent4767afbf1f60f73997a7eb69a86d380f1fb27a92 (diff)
x86/paravirt: don't restore second return reg
Impact: bugfix In the 32-bit calling convention, %eax:%edx is used to return 64-bit values. Don't save and restore %edx around wrapped functions, or they can't return a full 64-bit result. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r--arch/x86/include/asm/paravirt.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index b17365c3974..016dce31130 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -1524,8 +1524,8 @@ extern struct paravirt_patch_site __parainstructions[],
1524#define PV_RESTORE_REGS "popl %edx; popl %ecx;" 1524#define PV_RESTORE_REGS "popl %edx; popl %ecx;"
1525 1525
1526/* save and restore all caller-save registers, except return value */ 1526/* save and restore all caller-save registers, except return value */
1527#define PV_SAVE_ALL_CALLER_REGS PV_SAVE_REGS 1527#define PV_SAVE_ALL_CALLER_REGS "pushl %ecx;"
1528#define PV_RESTORE_ALL_CALLER_REGS PV_RESTORE_REGS 1528#define PV_RESTORE_ALL_CALLER_REGS "popl %ecx;"
1529 1529
1530#define PV_FLAGS_ARG "0" 1530#define PV_FLAGS_ARG "0"
1531#define PV_EXTRA_CLOBBERS 1531#define PV_EXTRA_CLOBBERS