• Paul Burton's avatar
    MIPS: Ensure FCSR cause bits are clear after invoking FPU emulator · ad70c13a
    Paul Burton authored
    When running the emulator to handle an instruction that raised an FP
    unimplemented operation exception, the FCSR cause bits were being
    cleared. This is done to ensure that the kernel does not take an FP
    exception when later restoring FP context to registers. However, this
    was not being done when the emulator is invoked in response to a
    coprocessor unusable exception. This happens in 2 cases:
    
      - There is no FPU present in the system. In this case things were
        OK, since the FP context is never restored to hardware registers
        and thus no FP exception may be raised when restoring FCSR.
    
      - The FPU could not be configured to the mode required by the task.
        In this case it would be possible for the emulator to set cause
        bits which are later restored to hardware if the task migrates
        to a CPU whose associated FPU does support its mode requirements,
        or if the tasks FP mode requirements change.
    
    Consistently clear the cause bits after invoking the emulator, by moving
    the clearing to process_fpemu_return and ensuring this is always called
    before the tasks FP context is restored. This will make it easier to
    catch further paths invoking the emulator in future, as will be
    introduced in further patches.
    Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/9165/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    ad70c13a
traps.c 56.3 KB