8xx: Move softemu8xx.c from arch/ppc
PATCH 16/28 8xx: Move softemu8xx.c from arch/ppc
Previously, Soft_emulate_8xx was called with no implementation, resulting in build failures whenever building 8xx without math emulation. The implementation is copied from arch/ppc to resolve this issue.
However, this sort of minimal emulation is not a very good idea other than for compatibility with existing userspaces, as it's less efficient than soft-float and can mislead users into believing they have soft-float. Thus, it is made a configurable option, off by default.
---
This replaces the old 16/28 "Don't call non-existent Soft_emulate_8xx from SoftwareEmulation".
arch/powerpc/Kconfig | 11 ++ arch/powerpc/kernel/Makefile | 2 + arch/powerpc/kernel/softemu8xx.c | 202 ++++++++++++++++++++++++++++++++++++++ arch/powerpc/kernel/traps.c | 6 +- 4 files changed, 220 insertions(+), 1 deletions(-) create mode 100644 arch/powerpc/kernel/softemu8xx.c
arch/powerpc/Kconfig +11 -0
@@ -180,6 +180,17 @@ config MATH_EMULATION unit, which will allow programs that use floating-point instructions to run. +config 8XX_MINIMAL_FPEMU + bool "Minimal math emulation for 8xx" + depends on 8xx && !MATH_EMULATION + help + Older arch/ppc kernels still emulated a few floating point + instructions such as load and store, even when full math + emulation is disabled. Say "Y" here if you want to preserve + this behavior. + + It is recommended that you build a soft-float userspace instead. + config IOMMU_VMERGE bool "Enable IOMMU virtual merging" depends on PPC64
arch/powerpc/kernel/Makefile +2 -0
@@ -76,6 +76,8 @@ obj-$(CONFIG_KEXEC) += machine_kexec.o crash.o $(kexec-y) obj-$(CONFIG_AUDIT) += audit.o obj64-$(CONFIG_AUDIT) += compat_audit.o +obj-$(CONFIG_8XX_MINIMAL_FPEMU) += softemu8xx.o + ifneq ($(CONFIG_PPC_INDIRECT_IO),y) obj-y += iomap.o endif
arch/powerpc/kernel/softemu8xx.c new file +202 -0
202 lines not on this page · raw message
arch/powerpc/kernel/traps.c +5 -1
@@ -898,7 +898,9 @@ void SoftwareEmulation(struct pt_regs *regs) {extern int do_mathemu (struct pt_regs *);extern int Soft_emulate_8xx (struct pt_regs *); +#if defined(CONFIG_MATH_EMULATION ) || defined(CONFIG_8XX_MINIMAL_FPEMU )int errcode; +#endif CHECK_FULL_REGS (regs);
@@ -928,7 +930,7 @@ void SoftwareEmulation(struct pt_regs *regs) return; } -#else +#elif defined(CONFIG_8XX_MINIMAL_FPEMU) errcode =Soft_emulate_8xx (regs);switch (errcode) {case 0 :
@@ -941,6 +943,8 @@ void SoftwareEmulation(struct pt_regs *regs)_exception (SIGSEGV , regs,SEGV_MAPERR , regs->nip);return ; } +#else +_exception (SIGILL , regs,ILL_ILLOPC , regs->nip);#endif }#endif /* CONFIG_8xx */
Signature · 1 line
1.5.3.1