CM3: ensure that all processes have eight-byte stack alignment.
[bertos.git] / bertos / cpu / cortex-m3 / hw / init_lm3s.c
index 26ceeb7b091105c736354e8f71f755ceb91d94d5..0c0a05b79b25dc6345a710c11b87efc13e1e44e4 100644 (file)
 #include <cpu/attr.h> /* PAUSE */
 #include <cpu/irq.h> /* IRQ_DISABLE */
 #include <cpu/types.h>
-#include "drv/irq_lm3s.h"
-#include "drv/clock_lm3s.h"
-#include "io/lm3s.h"
+#include <drv/irq_cm3.h>
+#include <drv/clock_lm3s.h>
+#include <io/lm3s.h>
+#include "switch_ctx_cm3.h"
 
 extern size_t __text_end, __data_start, __data_end, __bss_start, __bss_end;
 
 extern void __init2(void);
 
-#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
-
 /* Architecture's entry point */
 void __init2(void)
 {