# HG changeset patch # User mikek # Date 1276602372 -3600 # Node ID 9b2dbb18d44b0b4e69dd7b4b131b47315be817a3 # Parent eb29190b8a370bc931095287be34696f0cab226d Speculative fix for bug #1409 as per comment #4. Can't test until can build kernel. diff -r eb29190b8a37 -r 9b2dbb18d44b kernel/eka/compsupp/gcce/gcce.h --- 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 diff -r eb29190b8a37 -r 9b2dbb18d44b kernel/eka/euser/epoc/arm/uc_exe.cia --- 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)