Skip to content
  • James Hogan's avatar
    MIPS: Clear [MSA]FPE CSR.Cause after notify_die() · 64bedffe
    James Hogan authored
    
    
    When handling floating point exceptions (FPEs) and MSA FPEs the Cause
    bits of the appropriate control and status register (FCSR for FPEs and
    MSACSR for MSA FPEs) are read and cleared before enabling interrupts,
    presumably so that it doesn't have to go through the pain of restoring
    those bits if the process is pre-empted, since writing those bits would
    cause another immediate exception while still in the kernel.
    
    The bits aren't normally ever restored again, since userland never
    expects to see them set.
    
    However for virtualisation it is necessary for the kernel to be able to
    restore these Cause bits, as the guest may have been interrupted in an
    FP exception handler but before it could read the Cause bits. This can
    be done by registering a die notifier, to get notified of the exception
    when such a value is restored, and if the PC was at the instruction
    which is used to restore the guest state, the handler can step over it
    and continue execution. The Cause bits can then remain set without
    causing further exceptions.
    
    For this to work safely a few changes are made:
    - __build_clear_fpe and __build_clear_msa_fpe no longer clear the Cause
      bits, and now return from exception level with interrupts disabled
      instead of enabled.
    - do_fpe() now clears the Cause bits and enables interrupts after
      notify_die() is called, so that the notifier can chose to return from
      exception without this happening.
    - do_msa_fpe() acts similarly, but now actually makes use of the second
      argument (msacsr) and calls notify_die() with the new DIE_MSAFP,
      allowing die notifiers to be informed of MSA FPEs too.
    
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Acked-by: default avatarRalf Baechle <ralf@linux-mips.org>
    Cc: Paul Burton <paul.burton@imgtec.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Gleb Natapov <gleb@kernel.org>
    Cc: linux-mips@linux-mips.org
    Cc: kvm@vger.kernel.org
    64bedffe