]> rtime.felk.cvut.cz Git - arc.git/blob - arch/arm/arm_cm3/kernel/arch_krn.S
Initial commit.
[arc.git] / arch / arm / arm_cm3 / kernel / arch_krn.S
1 \r
2 \r
3 #define _ASSEMBLER_\r
4 #include "kernel_offset.h"\r
5 #include "arch_offset.h"\r
6 #include "stack.h"\r
7 \r
8 .extern os_sys\r
9 \r
10         .syntax unified\r
11         .cpu cortex-m3\r
12         .fpu softvfp\r
13         .thumb\r
14 \r
15         .global os_arch_swap_context_to\r
16         .global os_arch_swap_context\r
17         .section .text\r
18 /* r0 - pcb for old task\r
19  * r1 pcb for new task\r
20  *\r
21  * -------------- higher addr\r
22  * r4-r8,etc\r
23  * -------\r
24  * 4 - Large or Small context indicator\r
25  * 0 - ?\r
26  * ----------    <- JABBA\r
27  *\r
28  */\r
29 os_arch_swap_context:\r
30     mov     r0, sp\r
31     push    {r0,r4-r8,r10,r11,lr}\r
32 \r
33 \r
34     // Store c-frame\r
35     sub.w   sp,sp,#C_SIZE\r
36     mov.w   r4,#SC_PATTERN\r
37 \r
38     str     r4,[sp,#4]\r
39     // store old stack for old task\r
40     str     sp,[r0,#PCB_STACK_CURR_P]\r
41 os_arch_swap_context_to:\r
42     // Get stack for new task\r
43     ldr     sp,[r1,#PCB_STACK_CURR_P]\r
44 \r
45 // TODO: Fix this for all arch's..call pre,post hooks. Done here or after?\r
46 // Set new current pcb\r
47     ldr     r5,= os_sys\r
48     str     r1,[r5,#SYS_CURR_PCB_P]\r
49 \r
50 // Restore C context\r
51     ldr     r6,[sp,#4]\r
52     cmp     r6,#SC_PATTERN\r
53     beq     os_sc_restore\r
54     cmp     r6,#LC_PATTERN\r
55     beq     os_lc_restore\r
56 os_stack_problem:\r
57 // TODO: Jump to error handler\r
58     b os_stack_problem\r
59 \r
60 os_sc_restore:\r
61     add.w   sp,sp,#C_SIZE\r
62     pop     {r4-r8,r10,r11,lr}\r
63         // ehh, we are in handler mode so a bx instruction works here\r
64     bx      lr\r
65 \r
66 os_lc_restore:\r
67     add.w   sp,sp,#C_SIZE\r
68     pop     {r4-r8,r10,r11,lr}\r
69     // ehh, we are in handler mode so a bx instruction works here\r
70     bx      lr\r
71 \r
72 \r
73 \r