switch_ctx_cm3.c
Go to the documentation of this file.00001
00038 #include <cfg/compiler.h>
00039 #include <cfg/cfg_proc.h>
00040 #include <cpu/irq.h>
00041 #include <cpu/types.h>
00042 #include <kern/proc_p.h>
00043 #include <kern/proc.h>
00044 #include "switch_ctx_cm3.h"
00045
00046 #if CONFIG_KERN_PREEMPT
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 void NAKED svcall_handler(void)
00082 {
00083 asm volatile (
00084
00085 "mrs r3, basepri\n\t"
00086 "mrs ip, psp\n\t"
00087 "stmdb ip!, {r3-r11, lr}\n\t"
00088
00089 "str ip, [r1]\n\t"
00090 "ldr ip, [r0]\n\t"
00091
00092 "ldmia ip!, {r3-r11, lr}\n\t"
00093 "msr psp, ip\n\t"
00094 "msr basepri, r3\n\t"
00095 "bx lr" : : : "memory");
00096 }
00097
00098
00099
00100
00101 void NAKED pendsv_handler(void)
00102 {
00103 register cpu_stack_t *stack asm("ip");
00104
00105 asm volatile (
00106 "mrs r3, basepri\n\t"
00107 "mov %0, %2\n\t"
00108 "msr basepri, %0\n\t"
00109 "mrs %0, psp\n\t"
00110 "stmdb %0!, {r3-r11, lr}\n\t"
00111 : "=r"(stack)
00112 : "r"(stack), "i"(IRQ_PRIO_DISABLED)
00113 : "r3", "memory");
00114 proc_current()->stack = stack;
00115 proc_preempt();
00116 stack = proc_current()->stack;
00117 asm volatile (
00118 "ldmia %0!, {r3-r11, lr}\n\t"
00119 "msr psp, %0\n\t"
00120 "msr basepri, r3\n\t"
00121 "bx lr"
00122 : "=r"(stack) : "r"(stack)
00123 : "memory");
00124 }
00125 #else
00126 #ifdef __IAR_SYSTEMS_ICC__
00127 #else
00128 void NAKED asm_switch_context(cpu_stack_t **new_sp, cpu_stack_t **old_sp)
00129 {
00130 register cpu_stack_t **_new_sp asm("r0") = new_sp;
00131 register cpu_stack_t **_old_sp asm("r1") = old_sp;
00132
00133 asm volatile (
00134 "mrs ip, psp\n\t"
00135
00136 "stmdb ip!, {r4-r11, lr}\n\t"
00137
00138 "str ip, [%1]\n\t"
00139
00140 "ldr ip, [%0]\n\t"
00141
00142 "ldmia ip!, {r4-r11, lr}\n\t"
00143 "msr psp, ip\n\t"
00144 "bx lr"
00145 : : "r"(_new_sp), "r"(_old_sp) : "ip", "memory");
00146 }
00147 #endif
00148 #endif