From 28437e3058e78509ac7f692b80cf8ffd04db1a9b Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 22 Jun 2010 18:07:34 +0000 Subject: Fixed bug 3019738. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2034 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/ports/GCC/ARMCMx/chcore_v7m.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'os/ports/GCC/ARMCMx') diff --git a/os/ports/GCC/ARMCMx/chcore_v7m.c b/os/ports/GCC/ARMCMx/chcore_v7m.c index 68aba522d..74b9ff43b 100644 --- a/os/ports/GCC/ARMCMx/chcore_v7m.c +++ b/os/ports/GCC/ARMCMx/chcore_v7m.c @@ -30,16 +30,15 @@ /** * @brief Internal context stacking. */ -#define PUSH_CONTEXT(sp) { \ +#define PUSH_CONTEXT() { \ asm volatile ("push {r4, r5, r6, r7, r8, r9, r10, r11, lr}"); \ } /** * @brief Internal context unstacking. */ -#define POP_CONTEXT(sp) { \ - asm volatile ("pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}" \ - : : "r" (sp)); \ +#define POP_CONTEXT() { \ + asm volatile ("pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}"); \ } #if !CH_OPTIMIZE_SPEED @@ -137,21 +136,21 @@ void _port_switch_from_isr(void) { __attribute__((naked)) #endif void port_switch(Thread *ntp, Thread *otp) { - register struct intctx *r13 asm ("r13"); - /* Stack overflow check, if enabled.*/ #if CH_DBG_ENABLE_STACK_CHECK + /* Stack overflow check, if enabled.*/ + register struct intctx *r13 asm ("r13"); if ((void *)(r13 - 1) < (void *)(otp + 1)) asm volatile ("movs r0, #0 \n\t" "b chDbgPanic"); #endif /* CH_DBG_ENABLE_STACK_CHECK */ - PUSH_CONTEXT(r13); + PUSH_CONTEXT(); - otp->p_ctx.r13 = r13; - r13 = ntp->p_ctx.r13; + asm volatile ("str sp, [%1, #12] \n\t" + "ldr sp, [%0, #12]" : : "r" (ntp), "r" (otp)); - POP_CONTEXT(r13); + POP_CONTEXT(); } /** -- cgit v1.2.3