From 553a6de16c1865d6c4c75f4df2b885e10555f4d9 Mon Sep 17 00:00:00 2001 From: patacongo Date: Fri, 5 Nov 2010 02:18:32 +0000 Subject: Fix excepion handling reg save git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3074 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/arch/avr/src/avr32/up_exceptions.S | 4 ++-- nuttx/arch/avr/src/avr32/up_fullcontextrestore.S | 5 ++++- nuttx/arch/avr/src/avr32/up_sigdeliver.c | 8 +++++++- 3 files changed, 13 insertions(+), 4 deletions(-) (limited to 'nuttx/arch/avr/src') diff --git a/nuttx/arch/avr/src/avr32/up_exceptions.S b/nuttx/arch/avr/src/avr32/up_exceptions.S index d7686e3d0..4a7ade6fd 100755 --- a/nuttx/arch/avr/src/avr32/up_exceptions.S +++ b/nuttx/arch/avr/src/avr32/up_exceptions.S @@ -233,8 +233,8 @@ avr32_xcptcommon: /* xx xx xx xx xx xx xx xx xx SR PC LI 12 11 10 SR PC */ /* ^ ^+8*4 */ - ld.w r11, sp[4*4] - ld.w r12, sp[5*4] + ld.w r12, sp[4*4] + ld.w r11, sp[5*4] stm --sp, r11-r12 /* Save r8 and r8: */ diff --git a/nuttx/arch/avr/src/avr32/up_fullcontextrestore.S b/nuttx/arch/avr/src/avr32/up_fullcontextrestore.S index c883c58c7..3d9972180 100755 --- a/nuttx/arch/avr/src/avr32/up_fullcontextrestore.S +++ b/nuttx/arch/avr/src/avr32/up_fullcontextrestore.S @@ -70,7 +70,10 @@ * pointer (hence, interrupts must be disabled), and (b) there is the * very real possibility that the new stack pointer might overlap with * the register save area and stack usage in this function might corrupt - * the register save data before the state is restored. + * the register save data before the state is restored. It turns that + * an extra 3 words in the register save structure size will protect its + * contents (because that is the number of temporaries pushed onto the + * stack). * * Input Parameters: * r12 = A pointer to the register save area of the thread to be restored. diff --git a/nuttx/arch/avr/src/avr32/up_sigdeliver.c b/nuttx/arch/avr/src/avr32/up_sigdeliver.c index b000f118a..c88669482 100644 --- a/nuttx/arch/avr/src/avr32/up_sigdeliver.c +++ b/nuttx/arch/avr/src/avr32/up_sigdeliver.c @@ -82,7 +82,11 @@ void up_sigdeliver(void) { _TCB *rtcb = (_TCB*)g_readytorun.head; +#if 0 uint32_t regs[XCPTCONTEXT_REGS+3]; /* Why +3? See below */ +#else + uint32_t regs[XCPTCONTEXT_REGS]; +#endif sig_deliver_t sigdeliver; /* Save the errno. This must be preserved throughout the signal handling @@ -140,7 +144,9 @@ void up_sigdeliver(void) * dangerous because there is the very real possibility that the new * stack pointer might overlap with the register save area and hat stack * usage in up_fullcontextrestore might corrupt the register save data - * before the state is restored. + * before the state is restored. At present, there does not appear to + * be any stack overlap problems. If there were, then adding 3 words + * to the size of register save structure size will protect its contents. */ up_ledoff(LED_SIGNAL); -- cgit v1.2.3