| 1 | MIPS: allow disabling the kernel FPU emulator |
| 2 | |
| 3 | This patch allows turning off the in-kernel Algorithmics |
| 4 | FPU emulator support, which allows one to save a couple of |
| 5 | precious blocks on an embedded system. |
| 6 | |
| 7 | Signed-off-by: Florian Fainelli <florian@openwrt.org> |
| 8 | -- |
| 9 | --- a/arch/mips/Kconfig |
| 10 | +++ b/arch/mips/Kconfig |
| 11 | @@ -842,6 +842,17 @@ config I8259 |
| 12 | config MIPS_BONITO64 |
| 13 | bool |
| 14 | |
| 15 | +config MIPS_FPU_EMU |
| 16 | + bool "Enable FPU emulation" |
| 17 | + default y |
| 18 | + help |
| 19 | + This option allows building a kernel with or without the Algorithmics |
| 20 | + FPU emulator enabled. Turning off this option results in a kernel which |
| 21 | + does not catch floating operations exceptions. Make sure that your toolchain |
| 22 | + is configured to enable software floating point emulation in that case. |
| 23 | + |
| 24 | + If unsure say Y here. |
| 25 | + |
| 26 | config MIPS_MSC |
| 27 | bool |
| 28 | |
| 29 | --- a/arch/mips/math-emu/Makefile |
| 30 | +++ b/arch/mips/math-emu/Makefile |
| 31 | @@ -2,12 +2,14 @@ |
| 32 | # Makefile for the Linux/MIPS kernel FPU emulation. |
| 33 | # |
| 34 | |
| 35 | -obj-y := cp1emu.o ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \ |
| 36 | +obj-y := kernel_linkage.o dsemul.o cp1emu.o |
| 37 | + |
| 38 | +obj-$(CONFIG_MIPS_FPU_EMU) += ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \ |
| 39 | ieee754xcpt.o dp_frexp.o dp_modf.o dp_div.o dp_mul.o dp_sub.o \ |
| 40 | dp_add.o dp_fsp.o dp_cmp.o dp_logb.o dp_scalb.o dp_simple.o \ |
| 41 | dp_tint.o dp_fint.o dp_tlong.o dp_flong.o sp_frexp.o sp_modf.o \ |
| 42 | sp_div.o sp_mul.o sp_sub.o sp_add.o sp_fdp.o sp_cmp.o sp_logb.o \ |
| 43 | sp_scalb.o sp_simple.o sp_tint.o sp_fint.o sp_tlong.o sp_flong.o \ |
| 44 | - dp_sqrt.o sp_sqrt.o kernel_linkage.o dsemul.o |
| 45 | + dp_sqrt.o sp_sqrt.o |
| 46 | |
| 47 | EXTRA_CFLAGS += -Werror |
| 48 | --- a/arch/mips/math-emu/cp1emu.c |
| 49 | +++ b/arch/mips/math-emu/cp1emu.c |
| 50 | @@ -56,6 +56,12 @@ |
| 51 | #endif |
| 52 | #define __mips 4 |
| 53 | |
| 54 | +/* Further private data for which no space exists in mips_fpu_struct */ |
| 55 | + |
| 56 | +struct mips_fpu_emulator_stats fpuemustats; |
| 57 | + |
| 58 | +#ifdef CONFIG_MIPS_FPU_EMU |
| 59 | + |
| 60 | /* Function which emulates a floating point instruction. */ |
| 61 | |
| 62 | static int fpu_emu(struct pt_regs *, struct mips_fpu_struct *, |
| 63 | @@ -66,10 +72,6 @@ static int fpux_emu(struct pt_regs *, |
| 64 | struct mips_fpu_struct *, mips_instruction); |
| 65 | #endif |
| 66 | |
| 67 | -/* Further private data for which no space exists in mips_fpu_struct */ |
| 68 | - |
| 69 | -struct mips_fpu_emulator_stats fpuemustats; |
| 70 | - |
| 71 | /* Control registers */ |
| 72 | |
| 73 | #define FPCREG_RID 0 /* $0 = revision id */ |
| 74 | @@ -1274,6 +1276,13 @@ int fpu_emulator_cop1Handler(struct pt_r |
| 75 | |
| 76 | return sig; |
| 77 | } |
| 78 | +#else |
| 79 | +int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct mips_fpu_struct *ctx, |
| 80 | + int has_fpu) |
| 81 | +{ |
| 82 | + return 0; |
| 83 | +} |
| 84 | +#endif /* CONFIG_MIPS_FPU_EMU */ |
| 85 | |
| 86 | #ifdef CONFIG_DEBUG_FS |
| 87 | extern struct dentry *mips_debugfs_dir; |
| 88 | --- a/arch/mips/math-emu/dsemul.c |
| 89 | +++ b/arch/mips/math-emu/dsemul.c |
| 90 | @@ -109,6 +109,7 @@ int mips_dsemul(struct pt_regs *regs, mi |
| 91 | return SIGILL; /* force out of emulation loop */ |
| 92 | } |
| 93 | |
| 94 | +#ifdef CONFIG_MIPS_FPU_EMU |
| 95 | int do_dsemulret(struct pt_regs *xcp) |
| 96 | { |
| 97 | struct emuframe __user *fr; |
| 98 | @@ -165,3 +166,9 @@ int do_dsemulret(struct pt_regs *xcp) |
| 99 | |
| 100 | return 1; |
| 101 | } |
| 102 | +#else |
| 103 | +int do_dsemulret(struct pt_regs *xcp) |
| 104 | +{ |
| 105 | + return 0; |
| 106 | +} |
| 107 | +#endif /* CONFIG_MIPS_FPU_EMU */ |
| 108 | --- a/arch/mips/math-emu/kernel_linkage.c |
| 109 | +++ b/arch/mips/math-emu/kernel_linkage.c |
| 110 | @@ -29,6 +29,7 @@ |
| 111 | |
| 112 | #define SIGNALLING_NAN 0x7ff800007ff80000LL |
| 113 | |
| 114 | +#ifdef CONFIG_MIPS_FPU_EMU |
| 115 | void fpu_emulator_init_fpu(void) |
| 116 | { |
| 117 | static int first = 1; |
| 118 | @@ -112,4 +113,36 @@ int fpu_emulator_restore_context32(struc |
| 119 | |
| 120 | return err; |
| 121 | } |
| 122 | -#endif |
| 123 | +#endif /* CONFIG_64BIT */ |
| 124 | +#else |
| 125 | + |
| 126 | +void fpu_emulator_init_fpu(void) |
| 127 | +{ |
| 128 | + printk(KERN_INFO "FPU emulator disabled, make sure your toolchain" |
| 129 | + "was compiled with software floating point support (soft-float)\n"); |
| 130 | + return; |
| 131 | +} |
| 132 | + |
| 133 | +int fpu_emulator_save_context(struct sigcontext __user *sc) |
| 134 | +{ |
| 135 | + return 0; |
| 136 | +} |
| 137 | + |
| 138 | +int fpu_emulator_restore_context(struct sigcontext __user *sc) |
| 139 | +{ |
| 140 | + return 0; |
| 141 | +} |
| 142 | + |
| 143 | +int fpu_emulator_save_context32(struct sigcontext32 __user *sc) |
| 144 | +{ |
| 145 | + return 0; |
| 146 | +} |
| 147 | + |
| 148 | +int fpu_emulator_restore_context32(struct sigcontext32 __user *sc) |
| 149 | +{ |
| 150 | + return 0; |
| 151 | +} |
| 152 | + |
| 153 | +#ifdef CONFIG_64BIT |
| 154 | +#endif /* CONFIG_64BIT */ |
| 155 | +#endif /* CONFIG_MIPS_FPU_EMU */ |
| 156 | |