Skip to contentSkip to conversation

Kernel Math Emulation again

DISCUSSION Ralf HECKHAUSEN 1 participant 1 message Dec 3, 1999

lore
Share & tools
lore
#0 lore raw

Question:
Is there any significant difference in execution speed or program size in either of the two solutions (compiling with soft-float or using the kernel math emulation)?

Ralf

Quoted 1 line
Quoted 1 line
Quoted 1 line

Bill Roman <[email protected]> 12/02 11:32 pm >>>

Quoted 6 lines · Neil Blackwood

There is some kernel maths emulation stuff in 2.3.18.
You will need to copy it over to which ever version you are using. It works. Look for directories math-emu.
You will need to change config files and make files as well. Its fairly easy. Even I managed it.

Thanks, Neil! I had been very optimistic when I found this code in 2.3.18, and was disappointed when it turned out it wouldn't compile in that context. Without your hint, I don't think I would have guessed that transplanting it into a 2.2 kernel would have worked.

To save everyone else a few hours of grepping and tweaking, here are instructions and a patch file to add math emulation to the 2.2.13 kernel sources from linuxppc.cs.nmt.edu.

1. Obtain mpc8xx-2.2.13.tgz and linux-2.3.18.tgz from ftp://linuxppc.cs.nmt.edu/pub/linuxppc/embedded/. Untar them into two separate source trees. (Note: all that's needed from 2.3.18 is the math emulator; does anyone know whether that's available separately, or could someone split it out and put it on the FTP site?)

2. Copy the arch/ppc/mathemu directory from the 2.3.18 tree to the 2.2.13 tree.

3. Apply the patch (below). Note that I am building for an MBX, so that's what .config gets patched for.

4. make symlinks config dep clean zImage.

The following is the patch.
----------------------------------------------------------------------------

.config +6 -6
diff -ur linux-mpc8xx-2.2.13/.config linux/.config
@@ -10,9 +10,9 @@
 # CONFIG_PPC64 is not set
 CONFIG_8xx=y
 # CONFIG_MPC821 is not set
-CONFIG_MPC823=y
+# CONFIG_MPC823 is not set
 # CONFIG_MPC850 is not set
-# CONFIG_MPC860 is not set
+CONFIG_MPC860=y
 # CONFIG_MPC860T is not set
 CONFIG_SERIAL_CONSOLE=y
 # CONFIG_PMAC is not set
@@ -20,12 +20,13 @@
 # CONFIG_CHRP is not set
 # CONFIG_ALL_PPC is not set
 # CONFIG_APUS is not set
-# CONFIG_MBX is not set
+CONFIG_MBX=y
 # CONFIG_RPXLITE is not set
 # CONFIG_RPXCLASSIC is not set
-CONFIG_BSEIP=y
+# CONFIG_BSEIP is not set
 # CONFIG_SMP is not set
 CONFIG_MACH_SPECIFIC=y
+CONFIG_MATH_EMULATION=y
 
 #
 # General setup
@@ -297,8 +298,7 @@
 # MPC8xx CPM Options
 #
 CONFIG_SCC_ENET=y
-# CONFIG_SCC1_ENET is not set
-CONFIG_SCC2_ENET=y
+CONFIG_SCC1_ENET=y
 # CONFIG_FEC_ENET is not set
 # CONFIG_CPM_IIC is not set
 # CONFIG_UCODE_PATCH is not set
arch/ppc/Makefile +6 -0
diff -ur linux-mpc8xx-2.2.13/arch/ppc/Makefile linux/arch/ppc/Makefile
@@ -41,6 +41,12 @@
 ARCHIVES := arch/ppc/kernel/kernel.o arch/ppc/mm/mm.o arch/ppc/lib/lib.o $(ARCHIVES)
 CORE_FILES := arch/ppc/kernel/kernel.o arch/ppc/mm/mm.o arch/ppc/lib/lib.o $(CORE_FILES)
 
+ifdef CONFIG_MATH_EMULATION
+SUBDIRS += arch/ppc/math-emu
+ARCHIVES += arch/ppc/math-emu/math-emu.o
+CORE_FILES += arch/ppc/math-emu/math-emu.o
+endif
+
 ifdef CONFIG_XMON
 SUBDIRS += arch/ppc/xmon
 CORE_FILES += arch/ppc/xmon/x.o
arch/ppc/config.in +9 -0
diff -ur linux-mpc8xx-2.2.13/arch/ppc/config.in linux/arch/ppc/config.in
@@ -37,6 +37,15 @@
 if [ "$CONFIG_ALL_PPC" != "y" ];then
   define_bool CONFIG_MACH_SPECIFIC y
 fi
+
+if [ "$CONFIG_8xx" = "y" ]; then
+  bool 'Math emulation' CONFIG_MATH_EMULATION
+else
+  if [ "$CONFIG_PPC64" != "y" ];then
+    define_bool CONFIG_6xx y
+  fi
+fi
+
 endmenu
 
 mainmenu_option next_comment
arch/ppc/kernel/Makefile +1 -1
diff -ur linux-mpc8xx-2.2.13/arch/ppc/kernel/Makefile linux/arch/ppc/kernel/Makefile
@@ -30,7 +30,7 @@
 endif
 
 ifeq ($(CONFIG_8xx),y)
-O_OBJS += m8xx_setup.o softemu8xx.o ppc8xx_pic.o
+O_OBJS += m8xx_setup.o  ppc8xx_pic.o
 ifdef CONFIG_PCI
 O_OBJS += qspan_pci.o
 endif
arch/ppc/kernel/traps.c +2 -2
diff -ur linux-mpc8xx-2.2.13/arch/ppc/kernel/traps.c linux/arch/ppc/kernel/traps.c
@@ -230,12 +230,12 @@
 SoftwareEmulation(struct pt_regs *regs)
 {
 	int	errcode;
-	extern int	Soft_emulate_8xx (struct pt_regs *regs);
+	extern int	do_mathemu(struct pt_regs *regs);
 	extern void print_8xx_pte(struct mm_struct *, unsigned long);	
 
 	if (user_mode(regs))
 	{
-		if ((errcode = Soft_emulate_8xx(regs))) {
+		if ((errcode = do_mathemu(regs))) {
 printk("Software Emulation %s/%d NIP: %lx *NIP: 0x%x code: %x",
        current->comm,current->pid,
        regs->nip, *((uint *)regs->nip), errcode);
include/asm-ppc/processor.h +27 -2
diff -ur linux-mpc8xx-2.2.13/include/asm-ppc/processor.h linux/include/asm-ppc/processor.h
@@ -57,8 +57,33 @@
 #define HID0_BTCD	(1<<1)		/* Branch target cache disable */
 
 /* fpscr settings */
-#define FPSCR_FX        (1<<31)
-#define FPSCR_FEX       (1<<30)
+#define FPSCR_FX        0x80000000      /* FPU exception summary */
+#define FPSCR_FEX       0x40000000      /* FPU enabled exception summary */
+#define FPSCR_VX        0x20000000      /* Invalid operation summary */
+#define FPSCR_OX        0x10000000      /* Overflow exception summary */
+#define FPSCR_UX        0x08000000      /* Underflow exception summary */
+#define FPSCR_ZX        0x04000000      /* Zero-devide exception summary */
+#define FPSCR_XX        0x02000000      /* Inexact exception summary */
+#define FPSCR_VXSNAN    0x01000000      /* Invalid op for SNaN */
+#define FPSCR_VXISI     0x00800000      /* Invalid op for Inv - Inv */
+#define FPSCR_VXIDI     0x00400000      /* Invalid op for Inv / Inv */
+#define FPSCR_VXZDZ     0x00200000      /* Invalid op for Zero / Zero */
+#define FPSCR_VXIMZ     0x00100000      /* Invalid op for Inv * Zero */
+#define FPSCR_VXVC      0x00080000      /* Invalid op for Compare */
+#define FPSCR_FR        0x00040000      /* Fraction rounded */
+#define FPSCR_FI        0x00020000      /* Fraction inexact */
+#define FPSCR_FPRF      0x0001f000      /* FPU Result Flags */
+#define FPSCR_FPCC      0x0000f000      /* FPU Condition Codes */
+#define FPSCR_VXSOFT    0x00000400      /* Invalid op for software request */
+#define FPSCR_VXSQRT    0x00000200      /* Invalid op for square root */
+#define FPSCR_VXCVI     0x00000100      /* Invalid op for integer convert */
+#define FPSCR_VE        0x00000080      /* Invalid op exception enable */
+#define FPSCR_OE        0x00000040      /* IEEE overflow exception enable */
+#define FPSCR_UE        0x00000020      /* IEEE underflow exception enable */
+#define FPSCR_ZE        0x00000010      /* IEEE zero divide exception enable */
+#define FPSCR_XE        0x00000008      /* FP inexact exception enable */
+#define FPSCR_NI        0x00000004      /* FPU non IEEE-Mode */
+#define FPSCR_RN        0x00000003      /* FPU rounding control */
 
 #define _MACH_prep     1
 #define _MACH_Pmac     2  /* pmac or pmac clone (non-chrp) */

** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/