MIPS: Support for 64-bit FP with O32 binaries
CPUs implementing MIPS32 R2 may include a 64-bit FPU, just as MIPS64 CPUs do. In order to preserve backwards compatibility a 64-bit FPU will act like a 32-bit FPU (by accessing doubles from the least significant 32 bits of an even-odd pair of FP registers) when the Status.FR bit is zero, again just like a mips64 CPU. The standard O32 ABI is defined expecting a 32-bit FPU, however recent toolchains support use of a 64-bit FPU from an O32 MIPS32 executable. When an ELF executable is built to use a 64-bit FPU a new flag (EF_MIPS_FP64) is set in the ELF header. With this patch the kernel will check the EF_MIPS_FP64 flag when executing an O32 binary, and set Status.FR accordingly. The addition of O32 64-bit FP support lessens the opportunity for optimisation in the FPU emulator, so a CONFIG_MIPS_O32_FP64_SUPPORT Kconfig option is introduced to allow this support to be disabled for those that don't require it. Inspired by an earlier patch by Leonid Yegoshin, but implemented more cleanly & correctly. Signed-off-by:Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Cc: Paul Burton <paul.burton@imgtec.com> Patchwork: https://patchwork.linux-mips.org/patch/6154/ Signed-off-by:
Ralf Baechle <ralf@linux-mips.org>
Showing
- arch/mips/Kconfig 17 additions, 0 deletionsarch/mips/Kconfig
- arch/mips/include/asm/asmmacro-32.h 0 additions, 42 deletionsarch/mips/include/asm/asmmacro-32.h
- arch/mips/include/asm/asmmacro-64.h 0 additions, 96 deletionsarch/mips/include/asm/asmmacro-64.h
- arch/mips/include/asm/asmmacro.h 107 additions, 0 deletionsarch/mips/include/asm/asmmacro.h
- arch/mips/include/asm/elf.h 28 additions, 3 deletionsarch/mips/include/asm/elf.h
- arch/mips/include/asm/fpu.h 76 additions, 15 deletionsarch/mips/include/asm/fpu.h
- arch/mips/include/asm/thread_info.h 3 additions, 1 deletionarch/mips/include/asm/thread_info.h
- arch/mips/kernel/binfmt_elfo32.c 14 additions, 0 deletionsarch/mips/kernel/binfmt_elfo32.c
- arch/mips/kernel/cpu-probe.c 1 addition, 1 deletionarch/mips/kernel/cpu-probe.c
- arch/mips/kernel/process.c 0 additions, 3 deletionsarch/mips/kernel/process.c
- arch/mips/kernel/ptrace.c 33 additions, 27 deletionsarch/mips/kernel/ptrace.c
- arch/mips/kernel/ptrace32.c 31 additions, 22 deletionsarch/mips/kernel/ptrace32.c
- arch/mips/kernel/r4k_fpu.S 70 additions, 4 deletionsarch/mips/kernel/r4k_fpu.S
- arch/mips/kernel/r4k_switch.S 43 additions, 2 deletionsarch/mips/kernel/r4k_switch.S
- arch/mips/kernel/signal.c 6 additions, 4 deletionsarch/mips/kernel/signal.c
- arch/mips/kernel/signal32.c 6 additions, 4 deletionsarch/mips/kernel/signal32.c
- arch/mips/kernel/traps.c 5 additions, 5 deletionsarch/mips/kernel/traps.c
- arch/mips/math-emu/cp1emu.c 5 additions, 5 deletionsarch/mips/math-emu/cp1emu.c
- arch/mips/math-emu/kernel_linkage.c 4 additions, 2 deletionsarch/mips/math-emu/kernel_linkage.c
Loading
Please register or sign in to comment