aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLaurent Vivier <Laurent.Vivier@bull.net>2007-10-25 08:18:55 -0400
committerAvi Kivity <avi@qumranet.com>2008-01-30 10:52:56 -0500
commitff593e5abebd899b0b41c11280e2fbeff4103375 (patch)
treed4ebafad5ab7a358114e82acd251379d01ba6855 /drivers
parentc20363006af64cf397519da5e984b18e6bdffd82 (diff)
KVM: VMX: Let gcc to choose which registers to save (i386)
This patch lets GCC to determine which registers to save when we switch to/from a VCPU in the case of intel i386. * Original code saves following registers: eax, ebx, ecx, edx, edi, esi, ebp (using popa) * Patched code: - informs GCC that we modify following registers using the clobber description: ebx, edi, rsi - doesn't save eax because it is an output operand (vmx->fail) - cannot put ecx in clobber description because it is an input operand, but as we modify it and we want to keep its value (vcpu), we must save it (pop/push) - ebp is saved (pop/push) because GCC seems to ignore its use the clobber description. - edx is saved (pop/push) because it is reserved by GCC (REGPARM) and cannot be put in the clobber description. - line "mov (%%esp), %3 \n\t" has been removed because %3 is ecx and ecx is restored just after. Signed-off-by: Laurent Vivier <Laurent.Vivier@bull.net> Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/kvm/vmx.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c
index 56c9bcc82836..2d7d638d72d0 100644
--- a/drivers/kvm/vmx.c
+++ b/drivers/kvm/vmx.c
@@ -2268,7 +2268,8 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
2268 "push %%rdx; push %%rbp;" 2268 "push %%rdx; push %%rbp;"
2269 "push %%rcx \n\t" 2269 "push %%rcx \n\t"
2270#else 2270#else
2271 "pusha; push %%ecx \n\t" 2271 "push %%edx; push %%ebp;"
2272 "push %%ecx \n\t"
2272#endif 2273#endif
2273 ASM_VMX_VMWRITE_RSP_RDX "\n\t" 2274 ASM_VMX_VMWRITE_RSP_RDX "\n\t"
2274 /* Check if vmlaunch of vmresume is needed */ 2275 /* Check if vmlaunch of vmresume is needed */
@@ -2342,9 +2343,8 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
2342 "mov %%ebp, %c[rbp](%3) \n\t" 2343 "mov %%ebp, %c[rbp](%3) \n\t"
2343 "mov %%cr2, %%eax \n\t" 2344 "mov %%cr2, %%eax \n\t"
2344 "mov %%eax, %c[cr2](%3) \n\t" 2345 "mov %%eax, %c[cr2](%3) \n\t"
2345 "mov (%%esp), %3 \n\t"
2346 2346
2347 "pop %%ecx; popa \n\t" 2347 "pop %%ecx; pop %%ebp; pop %%edx \n\t"
2348#endif 2348#endif
2349 "setbe %0 \n\t" 2349 "setbe %0 \n\t"
2350 : "=q" (vmx->fail) 2350 : "=q" (vmx->fail)
@@ -2372,6 +2372,8 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
2372#ifdef CONFIG_X86_64 2372#ifdef CONFIG_X86_64
2373 , "rbx", "rdi", "rsi" 2373 , "rbx", "rdi", "rsi"
2374 , "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" 2374 , "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2375#else
2376 , "ebx", "edi", "rsi"
2375#endif 2377#endif
2376 ); 2378 );
2377 2379