• James Hogan's avatar
    MIPS: KVM: Add base guest MSA support · 539cb89f
    James Hogan authored
    Add base code for supporting the MIPS SIMD Architecture (MSA) in MIPS
    KVM guests. MSA cannot yet be enabled in the guest, we're just laying
    the groundwork.
    
    As with the FPU, whether the guest's MSA context is loaded is stored in
    another bit in the fpu_inuse vcpu member. This allows MSA to be disabled
    when the guest disables it, but keeping the MSA context loaded so it
    doesn't have to be reloaded if the guest re-enables it.
    
    New assembly code is added for saving and restoring the MSA context,
    restoring only the upper half of the MSA context (for if the FPU context
    is already loaded) and for saving/clearing and restoring MSACSR (which
    can itself cause an MSA FP exception depending on the value). The MSACSR
    is restored before returning to the guest if MSA is already enabled, and
    the existing FP exception die notifier is extended to catch the possible
    MSA FP exception and step over the ctcmsa instruction.
    
    The helper function kvm_own_msa() is added to enable MSA and restore
    the MSA context if it isn't already loaded, which will be used in a
    later patch when the guest attempts to use MSA for the first time and
    triggers an MSA disabled exception.
    
    The existing FPU helpers are extended to handle MSA. kvm_lose_fpu()
    saves the full MSA context if it is loaded (which includes the FPU
    context) and both kvm_lose_fpu() and kvm_drop_fpu() disable MSA.
    
    kvm_own_fpu() also needs to lose any MSA context if FR=0, since there
    would be a risk of getting reserved instruction exceptions if CU1 is
    enabled and we later try and save the MSA context. We shouldn't usually
    hit this case since it will be handled when emulating CU1 changes,
    however there's nothing to stop the guest modifying the Status register
    directly via the comm page, which will cause this case to get hit.
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Paul Burton <paul.burton@imgtec.com>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: Gleb Natapov <gleb@kernel.org>
    Cc: linux-mips@linux-mips.org
    Cc: kvm@vger.kernel.org
    539cb89f
asm-offsets.c 15.7 KB