lkml.org 
[lkml]   [2009]   [Sep]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 28/48] KVM: Fix PDPTR reloading on CR4 writes

    2.6.27-stable review patch. If anyone has any objections, please let us know.

    ------------------
    From: Avi Kivity <avi@redhat.com>

    (cherry picked from commit a2edf57f510cce6a389cc14e58c6ad0a4296d6f9)

    The processor is documented to reload the PDPTRs while in PAE mode if any
    of the CR4 bits PSE, PGE, or PAE change. Linux relies on this
    behaviour when zapping the low mappings of PAE kernels during boot.

    The code already handled changes to CR4.PAE; augment it to also notice changes
    to PSE and PGE.

    This triggered while booting an F11 PAE kernel; the futex initialization code
    runs before any CR3 reloads and writes to a NULL pointer; the futex subsystem
    ended up uninitialized, killing PI futexes and pulseaudio which uses them.

    Signed-off-by: Avi Kivity <avi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    ---
    arch/x86/kvm/x86.c | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -318,6 +318,9 @@ EXPORT_SYMBOL_GPL(kvm_lmsw);

    void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
    {
    + unsigned long old_cr4 = vcpu->arch.cr4;
    + unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE;
    +
    if (cr4 & CR4_RESERVED_BITS) {
    printk(KERN_DEBUG "set_cr4: #GP, reserved bits\n");
    kvm_inject_gp(vcpu, 0);
    @@ -331,7 +334,8 @@ void kvm_set_cr4(struct kvm_vcpu *vcpu,
    kvm_inject_gp(vcpu, 0);
    return;
    }
    - } else if (is_paging(vcpu) && !is_pae(vcpu) && (cr4 & X86_CR4_PAE)
    + } else if (is_paging(vcpu) && (cr4 & X86_CR4_PAE)
    + && ((cr4 ^ old_cr4) & pdptr_bits)
    && !load_pdptrs(vcpu, vcpu->arch.cr3)) {
    printk(KERN_DEBUG "set_cr4: #GP, pdptrs reserved bits\n");
    kvm_inject_gp(vcpu, 0);



    \
     
     \ /
      Last update: 2009-09-04 22:31    [W:0.032 / U:32.144 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site