From d451a360542d080f3cd1dd3a02aff84be97656d0 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Fri, 26 Mar 2010 14:29:50 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1783 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/ports/GCC/ARMCMx/chcore.c | 40 +++++++++++++++++++++++++++++++++++++--- os/ports/GCC/ARMCMx/chcore.h | 1 + 2 files changed, 38 insertions(+), 3 deletions(-) (limited to 'os') diff --git a/os/ports/GCC/ARMCMx/chcore.c b/os/ports/GCC/ARMCMx/chcore.c index 4515ac777..6b6123e7c 100644 --- a/os/ports/GCC/ARMCMx/chcore.c +++ b/os/ports/GCC/ARMCMx/chcore.c @@ -70,6 +70,40 @@ void SysTickVector(void) { } #if CORTEX_MODEL == CORTEX_M0 +#define PUSH_CONTEXT(sp, prio) { \ + asm volatile ("mrs %0, PSP \n\t" \ + "sub %0, %0, #20 \n\t" \ + "push {r3-r7} \n\t" \ + "mov r0, r8 \n\t" \ + "str r0, [%0, #20] \n\t" \ + "mov r0, r9 \n\t" \ + "str r0, [%0, #24] \n\t" \ + "mov r0, r10 \n\t" \ + "str r0, [%0, #28] \n\t" \ + "mov r0, r11 \n\t" \ + "str r0, [%0, #32] \n\t" \ + "mov r0, lr \n\t" \ + "str r0, [%0, #36] \n\t" \ + : "=r" (sp) : "r" (sp), "r" (prio)); \ +} + +#define POP_CONTEXT(sp) { \ + asm volatile ("ldr r0, [%0, #20] \n\t" \ + "mov r8, r0 \n\t" \ + "ldr r0, [%0, #24] \n\t" \ + "mov r9, r0 \n\t" \ + "ldr r0, [%0, #28] \n\t" \ + "mov r10, r0 \n\t" \ + "ldr r0, [%0, #32] \n\t" \ + "mov r11, r0 \n\t" \ + "ldr r0, [%0, #36] \n\t" \ + "mov lr, r0 \n\t" \ + "pop {r3-r7} \n\t" \ + "add %0, %0, #20 \n\t" \ + "msr PSP, %0 \n\t" \ + "msr BASEPRI, r3 \n\t" \ + "bx lr" : "=r" (sp) : "r" (sp)); \ +} #else /* CORTEX_MODEL != CORTEX_M0 */ #if !defined(CH_CURRP_REGISTER_CACHE) #define PUSH_CONTEXT(sp, prio) { \ @@ -79,7 +113,7 @@ void SysTickVector(void) { } #define POP_CONTEXT(sp) { \ - asm volatile ("ldmia r12!, {r3-r11, lr} \n\t" \ + asm volatile ("ldmia %0!, {r3-r11, lr} \n\t" \ "msr PSP, %0 \n\t" \ "msr BASEPRI, r3 \n\t" \ "bx lr" : "=r" (sp) : "r" (sp)); \ @@ -113,7 +147,7 @@ void SysTickVector(void) { __attribute__((naked)) #endif void SVCallVector(Thread *ntp, Thread *otp) { - register struct intctx *sp_thd asm("r12"); + register struct intctx *sp_thd asm("r2"); register uint32_t prio asm ("r3"); asm volatile ("mrs r3, BASEPRI" : "=r" (prio) : ); @@ -132,7 +166,7 @@ void SVCallVector(Thread *ntp, Thread *otp) { __attribute__((naked)) #endif void PendSVVector(void) { - register struct intctx *sp_thd asm("r12"); + register struct intctx *sp_thd asm("r2"); register uint32_t prio asm ("r3"); Thread *otp, *ntp; diff --git a/os/ports/GCC/ARMCMx/chcore.h b/os/ports/GCC/ARMCMx/chcore.h index 26838f17b..2f69209ba 100644 --- a/os/ports/GCC/ARMCMx/chcore.h +++ b/os/ports/GCC/ARMCMx/chcore.h @@ -108,6 +108,7 @@ struct intctx { regarm_t r10; regarm_t r11; regarm_t lr_exc; + /* Start of the hardware saved frame.*/ regarm_t r0; regarm_t r1; regarm_t r2; -- cgit v1.2.3