Speculative fix for bug #1409 as per comment #4. Can't test until can build kernel. GCC_SURGE
authormikek
Tue, 15 Jun 2010 12:46:12 +0100
branchGCC_SURGE
changeset 150 9b2dbb18d44b
parent 146 eb29190b8a37
child 151 b5dd6d3f5c21
Speculative fix for bug #1409 as per comment #4. Can't test until can build kernel.
kernel/eka/compsupp/gcce/gcce.h
kernel/eka/euser/epoc/arm/uc_exe.cia
--- a/kernel/eka/compsupp/gcce/gcce.h	Mon Jun 14 10:17:11 2010 +0100
+++ b/kernel/eka/compsupp/gcce/gcce.h	Tue Jun 15 12:46:12 2010 +0100
@@ -168,9 +168,21 @@
 // Support for throwing exceptions through embedded assembler
 // Should only be needed user side
 
-#define	__EH_FRAME_ADDRESS(reg,offset)	FRAME ADDRESS reg, offset
-#define __EH_FRAME_PUSH2(reg1,reg2) FRAME PUSH {reg1, reg2}
-#define __EH_FRAME_SAVE1(reg,offset) FRAME SAVE {reg}, offset
+#define __VSTR(x) #x
+#define __STR(x) __VSTR(x)
+#define __GAS_SAVE_REG(reg) ".save {" __STR(reg) " }"
+#define __ASM_GAS_SAVE_REG(reg) asm( __GAS_SAVE_REG(reg) );
+#define __GAS_SAVE_REGS2(reg1,reg2) ".save {" __STR(reg1) "," __STR(reg2) "}"
+#define __ASM_GAS_SAVE_REGS2(reg1,reg2) asm( __GAS_SAVE_REGS2(reg1,reg2) );
+#define __GAS_SETFP(reg,offset) ".setfp fp," __STR(reg) ",#" __STR(offset)
+#define __ASM_GAS_SETFP(reg,offset) asm( __GAS_SETFP(reg,offset) );
+
+#define	__EH_FRAME_ADDRESS(reg,offset)	\
+		__ASM_GAS_SETFP(reg,offset)
+#define __EH_FRAME_PUSH2(reg1,reg2) __ASM_GAS_SAVE_REGS2(reg1,reg2)
+#define __EH_FRAME_SAVE1(reg,offset) \
+	__EH_FRAME_ADDRESS(fp,offset) \
+	__ASM_GAS_SAVE_REG(reg)
 
 #endif
 
--- a/kernel/eka/euser/epoc/arm/uc_exe.cia	Mon Jun 14 10:17:11 2010 +0100
+++ b/kernel/eka/euser/epoc/arm/uc_exe.cia	Tue Jun 15 12:46:12 2010 +0100
@@ -62,7 +62,7 @@
 	asm("mov r11, sp ");		// save stack pointer
 
 	// The frame starts 84 bytes (up) from r11 i.e. CFA is r11 + 84
-	__EH_FRAME_ADDRESS(r11, 84)
+	__EH_FRAME_ADDRESS(sp, 84) // Reg needs to be sp (=r11) here for gcce
 	// we can only restore callee-save values, but that's what we want if we 'leave'
 	// saved link is -8 bytes from CFA (= r11 + 0x24 + 0x20 + 0x8)
 	__EH_FRAME_SAVE1(lr, -8)