Skip to content
Snippets Groups Projects
Select Git revision
  • ad70c13a938daf833cad86830f23865ee37aa5c7
  • master default
  • android-container
  • nanopc-t4
  • for-kernelci
  • WIP-syscall
  • v4.16-rc5
  • v4.16-rc4
  • v4.16-rc3
  • v4.16-rc2
  • v4.16-rc1
  • v4.15
  • v4.15-rc9
  • v4.15-rc8
  • v4.15-rc7
  • v4.15-rc6
  • v4.15-rc5
  • v4.15-rc4
  • v4.15-rc3
  • v4.15-rc2
  • v4.15-rc1
  • v4.14
  • v4.14-rc8
  • v4.14-rc7
  • v4.14-rc6
  • v4.14-rc5
26 results

traps.c

Blame
    • Paul Burton's avatar
      ad70c13a
      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
      History
      MIPS: Ensure FCSR cause bits are clear after invoking FPU emulator
      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>
    signal-common.h 1.20 KiB
    /*
     * This file is subject to the terms and conditions of the GNU General Public
     * License.  See the file "COPYING" in the main directory of this archive
     * for more details.
     *
     * Copyright (C) 1991, 1992  Linus Torvalds
     * Copyright (C) 1994 - 2000  Ralf Baechle
     * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
     */
    
    #ifndef __SIGNAL_COMMON_H
    #define __SIGNAL_COMMON_H
    
    /* #define DEBUG_SIG */
    
    #ifdef DEBUG_SIG
    #  define DEBUGP(fmt, args...) printk("%s: " fmt, __func__, ##args)
    #else
    #  define DEBUGP(fmt, args...)
    #endif
    
    /*
     * Determine which stack to use..
     */
    extern void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
    				 size_t frame_size);
    /* Check and clear pending FPU exceptions in saved CSR */
    extern int fpcsr_pending(unsigned int __user *fpcsr);
    
    /* Make sure we will not lose FPU ownership */
    #define lock_fpu_owner()	({ preempt_disable(); pagefault_disable(); })
    #define unlock_fpu_owner()	({ pagefault_enable(); preempt_enable(); })
    
    /* Assembly functions to move context to/from the FPU */
    extern asmlinkage int
    _save_fp_context(void __user *fpregs, void __user *csr);
    extern asmlinkage int
    _restore_fp_context(void __user *fpregs, void __user *csr);
    
    #endif	/* __SIGNAL_COMMON_H */