-#if CONFIG_KERN_PREEMPT
-/*
- * Voluntary context switch handler.
- */
-static void NAKED svcall_handler(void)
-{
- asm volatile (
- /* Save context */
- "mrs r3, basepri\n\t"
- "mrs ip, psp\n\t"
- "stmdb ip!, {r3-r11, lr}\n\t"
- /* Stack switch */
- "str ip, [r1]\n\t"
- "ldr ip, [r0]\n\t"
- /* Restore context */
- "ldmia ip!, {r3-r11, lr}\n\t"
- "msr psp, ip\n\t"
- "msr basepri, r3\n\t"
- "bx lr" : : : "memory");
-}
-
-/*
- * Preemptible context switch handler.
- */
-static void NAKED pendsv_handler(void)
-{
- register cpu_stack_t *stack asm("ip");
-
- asm volatile (
- "mrs r3, basepri\n\t"
- "mov %0, %2\n\t"
- "msr basepri, %0\n\t"
- "mrs %0, psp\n\t"
- "stmdb %0!, {r3-r11, lr}\n\t"
- : "=r"(stack)
- : "r"(stack), "i"(IRQ_PRIO_DISABLED)
- : "r3", "memory");
- proc_current()->stack = stack;
- proc_preempt();
- stack = proc_current()->stack;
- asm volatile (
- "ldmia %0!, {r3-r11, lr}\n\t"
- "msr psp, %0\n\t"
- "msr basepri, r3\n\t"
- "bx lr"
- : "=r"(stack) : "r"(stack)
- : "memory");
-}
-#endif
-