aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2010-03-26 14:29:50 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2010-03-26 14:29:50 +0000
commitd451a360542d080f3cd1dd3a02aff84be97656d0 (patch)
treed9c6bf47d90650f2b06af332c553c34182863dd4
parent9d3415bdf3d355fea5e0d09c062ebdad15bb2d4a (diff)
downloadChibiOS-d451a360542d080f3cd1dd3a02aff84be97656d0.tar.gz
ChibiOS-d451a360542d080f3cd1dd3a02aff84be97656d0.tar.bz2
ChibiOS-d451a360542d080f3cd1dd3a02aff84be97656d0.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1783 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--os/ports/GCC/ARMCMx/chcore.c40
-rw-r--r--os/ports/GCC/ARMCMx/chcore.h1
2 files changed, 38 insertions, 3 deletions
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;