lkml.org 
[lkml]   [2007]   [Dec]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 12/55] KVM: VMX: Let gcc to choose which registers to save (i386)
    Date
    From: Laurent Vivier <Laurent.Vivier@bull.net>

    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>
    ---
    drivers/kvm/vmx.c | 8 +++++---
    1 files changed, 5 insertions(+), 3 deletions(-)

    diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c
    index 3a58a2a..f76677d 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)
    "push %%rdx; push %%rbp;"
    "push %%rcx \n\t"
    #else
    - "pusha; push %%ecx \n\t"
    + "push %%edx; push %%ebp;"
    + "push %%ecx \n\t"
    #endif
    ASM_VMX_VMWRITE_RSP_RDX "\n\t"
    /* 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)
    "mov %%ebp, %c[rbp](%3) \n\t"
    "mov %%cr2, %%eax \n\t"
    "mov %%eax, %c[cr2](%3) \n\t"
    - "mov (%%esp), %3 \n\t"

    - "pop %%ecx; popa \n\t"
    + "pop %%ecx; pop %%ebp; pop %%edx \n\t"
    #endif
    "setbe %0 \n\t"
    : "=q" (vmx->fail)
    @@ -2372,6 +2372,8 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
    #ifdef CONFIG_X86_64
    , "rbx", "rdi", "rsi"
    , "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
    +#else
    + , "ebx", "edi", "rsi"
    #endif
    );

    --
    1.5.3.7


    \
     
     \ /
      Last update: 2007-12-26 12:13    [W:4.428 / U:0.328 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site