lkml.org 
[lkml]   [2018]   [Jan]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 062/118] KVM: PPC: Book3S PR: Fix WIMG handling under pHyp
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Alexey Kardashevskiy <aik@ozlabs.ru>

    commit 6c7d47c33ed323f14f2a3b8de925e831dbaa4e69 upstream.

    Commit 96df226 ("KVM: PPC: Book3S PR: Preserve storage control bits")
    added code to preserve WIMG bits but it missed 2 special cases:
    - a magic page in kvmppc_mmu_book3s_64_xlate() and
    - guest real mode in kvmppc_handle_pagefault().

    For these ptes, WIMG was 0 and pHyp failed on these causing a guest to
    stop in the very beginning at NIP=0x100 (due to bd9166ffe "KVM: PPC:
    Book3S PR: Exit KVM on failed mapping").

    According to LoPAPR v1.1 14.5.4.1.2 H_ENTER:

    The hypervisor checks that the WIMG bits within the PTE are appropriate
    for the physical page number else H_Parameter return. (For System Memory
    pages WIMG=0010, or, 1110 if the SAO option is enabled, and for IO pages
    WIMG=01**.)

    This hence initializes WIMG to non-zero value HPTE_R_M (0x10), as expected
    by pHyp.

    [paulus@ozlabs.org - fix compile for 32-bit]

    Fixes: 96df226 "KVM: PPC: Book3S PR: Preserve storage control bits"
    Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
    Tested-by: Ruediger Oertel <ro@suse.de>
    Reviewed-by: Greg Kurz <groug@kaod.org>
    Tested-by: Greg Kurz <groug@kaod.org>
    Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/powerpc/kvm/book3s_64_mmu.c | 1 +
    arch/powerpc/kvm/book3s_pr.c | 2 ++
    2 files changed, 3 insertions(+)

    --- a/arch/powerpc/kvm/book3s_64_mmu.c
    +++ b/arch/powerpc/kvm/book3s_64_mmu.c
    @@ -235,6 +235,7 @@ static int kvmppc_mmu_book3s_64_xlate(st
    gpte->may_read = true;
    gpte->may_write = true;
    gpte->page_size = MMU_PAGE_4K;
    + gpte->wimg = HPTE_R_M;

    return 0;
    }
    --- a/arch/powerpc/kvm/book3s_pr.c
    +++ b/arch/powerpc/kvm/book3s_pr.c
    @@ -60,6 +60,7 @@ static void kvmppc_giveup_fac(struct kvm
    #define MSR_USER32 MSR_USER
    #define MSR_USER64 MSR_USER
    #define HW_PAGE_SIZE PAGE_SIZE
    +#define HPTE_R_M _PAGE_COHERENT
    #endif

    static bool kvmppc_is_split_real(struct kvm_vcpu *vcpu)
    @@ -557,6 +558,7 @@ int kvmppc_handle_pagefault(struct kvm_r
    pte.eaddr = eaddr;
    pte.vpage = eaddr >> 12;
    pte.page_size = MMU_PAGE_64K;
    + pte.wimg = HPTE_R_M;
    }

    switch (kvmppc_get_msr(vcpu) & (MSR_DR|MSR_IR)) {

    \
     
     \ /
      Last update: 2018-01-15 14:13    [W:4.264 / U:0.296 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site