lkml.org 
[lkml]   [2012]   [Aug]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 37/74] lto, KVM: Don't assume asm statements end up in the same assembler file
    Date
    From: Andi Kleen <ak@linux.intel.com>

    The VMX code references a local assembler label between two inline
    assembler statements. This assumes they both end up in the same
    assembler files. In some experimental builds of gcc this is not
    necessarily true, causing linker failures.

    Replace the local label reference with a more traditional asmlinkage
    extern.

    This also eliminates one assembler statement and
    generates a bit better code on 64bit: the compiler can
    use a RIP relative LEA instead of a movabs, saving
    a few bytes.

    Cc: avi@redhat.com
    Signed-off-by: Andi Kleen <ak@linux.intel.com>
    ---
    arch/x86/kvm/vmx.c | 10 ++++++----
    1 files changed, 6 insertions(+), 4 deletions(-)

    diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
    index c00f03d..2fe1de3 100644
    --- a/arch/x86/kvm/vmx.c
    +++ b/arch/x86/kvm/vmx.c
    @@ -3718,6 +3718,8 @@ static void vmx_disable_intercept_for_msr(u32 msr, bool longmode_only)
    __vmx_disable_intercept_for_msr(vmx_msr_bitmap_longmode, msr);
    }

    +extern __visible unsigned long kvm_vmx_return;
    +
    /*
    * Set up the vmcs's constant host-state fields, i.e., host-state fields that
    * will not change in the lifetime of the guest.
    @@ -3753,8 +3755,7 @@ static void vmx_set_constant_host_state(void)
    native_store_idt(&dt);
    vmcs_writel(HOST_IDTR_BASE, dt.address); /* 22.2.4 */

    - asm("mov $.Lkvm_vmx_return, %0" : "=r"(tmpl));
    - vmcs_writel(HOST_RIP, tmpl); /* 22.2.5 */
    + vmcs_writel(HOST_RIP, (unsigned long)&kvm_vmx_return); /* 22.2.5 */

    rdmsr(MSR_IA32_SYSENTER_CS, low32, high32);
    vmcs_write32(HOST_IA32_SYSENTER_CS, low32);
    @@ -6305,9 +6306,10 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
    /* Enter guest mode */
    "jne .Llaunched \n\t"
    __ex(ASM_VMX_VMLAUNCH) "\n\t"
    - "jmp .Lkvm_vmx_return \n\t"
    + "jmp kvm_vmx_return \n\t"
    ".Llaunched: " __ex(ASM_VMX_VMRESUME) "\n\t"
    - ".Lkvm_vmx_return: "
    + ".globl kvm_vmx_return\n"
    + "kvm_vmx_return: "
    /* Save guest registers, load host registers, keep flags */
    "mov %0, %c[wordsize](%%"R"sp) \n\t"
    "pop %0 \n\t"
    --
    1.7.7.6


    \
     
     \ /
      Last update: 2012-08-19 06:01    [W:4.039 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site