• James Hogan's avatar
    KVM: MIPS: Don't clobber CP0_Status.UX · 26a401a6
    James Hogan authored
    commit 4c881451 upstream.
    
    On 64-bit kernels, MIPS KVM will clear CP0_Status.UX to prevent the
    guest (running in user mode) from accessing the 64-bit memory segments.
    However the previous value of CP0_Status.UX is never restored when
    exiting from the guest.
    
    If the user process uses 64-bit addressing (the n64 ABI) this can result
    in address error exceptions from the kernel if it needs to deliver a
    signal before returning to user mode, as the kernel will need to write a
    sigframe to high user addresses on the user stack which are disallowed
    by CP0_Status.UX=0.
    
    This is fixed by explicitly setting SX and UX again when exiting from
    the guest, and explicitly clearing those bits when returning to the
    guest. Having the SX and UX bits set when handling guest exits (rather
    than only when exiting to userland) will be helpful when we support VZ,
    since we shouldn't need to directly read or write guest memory, so it
    will be valid for cache management IPIs to access host user addresses.
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: "Radim Krčmář" <rkrcmar@redhat.com>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: linux-mips@linux-mips.org
    Cc: kvm@vger.kernel.org
    Signed-off-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    26a401a6
entry.c 19.2 KB