FreeCalypso > hg > fc-selenite
comparison src/cs/system/main/gcc/exceptions.S @ 78:95ef11e76c5b
src/cs/system/main/gcc: asm code pieced from Citrine
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 20 Jul 2018 06:46:56 +0000 |
parents | |
children | 92fde62400ef |
comparison
equal
deleted
inserted
replaced
77:6b6675a07b70 | 78:95ef11e76c5b |
---|---|
1 /* | |
2 * This module contains ARM exception handlers which used to be | |
3 * in chipsetsw/system/Main/int.s in TI's Leonardo code. | |
4 */ | |
5 | |
6 .section "except_stack","aw",%nobits | |
7 .balign 4 | |
8 .space 512 | |
9 .globl _Except_Stack_SP | |
10 _Except_Stack_SP: | |
11 | |
12 .text | |
13 .code 32 | |
14 | |
15 @ layout of xdump buffer: | |
16 @ struct xdump_s { | |
17 @ long registers[16] // svc mode registers | |
18 @ long cpsr // svc mode CPSR | |
19 @ long exception // magic word + index of vector taken | |
20 @ long stack[20] // bottom 20 words of usr mode stack | |
21 @ } | |
22 | |
23 .globl _arm_undefined | |
24 _arm_undefined: | |
25 @ store r12 for Xdump_buffer pointer, r11 for index | |
26 stmfd r13!,{r11,r12} | |
27 mov r11,#1 | |
28 b save_regs | |
29 | |
30 .globl _arm_swi | |
31 _arm_swi: | |
32 @ store r12 for Xdump_buffer pointer, r11 for index | |
33 stmfd r13!,{r11,r12} | |
34 mov r11,#2 | |
35 b save_regs | |
36 | |
37 .globl _arm_abort_prefetch | |
38 _arm_abort_prefetch: | |
39 @ store r12 for Xdump_buffer pointer, r11 for index | |
40 stmfd r13!,{r11,r12} | |
41 mov r11,#3 | |
42 b save_regs | |
43 | |
44 .globl _arm_abort_data | |
45 _arm_abort_data: | |
46 @ store r12 for Xdump_buffer pointer, r11 for index | |
47 stmfd r13!,{r11,r12} | |
48 mov r11,#4 | |
49 b save_regs | |
50 | |
51 .globl _arm_reserved | |
52 _arm_reserved: | |
53 ldr r13,=_Except_Stack_SP @ mode unknown | |
54 @ store r12 for Xdump_buffer pointer, r11 for index | |
55 stmfd r13!,{r11,r12} | |
56 mov r11,#5 | |
57 b save_regs | |
58 | |
59 save_regs: | |
60 ldr r12,=xdump_buffer | |
61 str r14,[r12,#4*15] @ save r14_abt (original PC) into r15 slot | |
62 | |
63 stmia r12,{r0-r10} @ save unbanked registers (except r11 and r12) | |
64 ldmfd r13!,{r0,r1} @ get original r11 and r12 | |
65 str r0,[r12,#4*11] @ save original r11 | |
66 str r1,[r12,#4*12] @ save original r12 | |
67 mrs r0,spsr @ get original psr | |
68 str r0,[r12,#4*16] @ save original cpsr | |
69 | |
70 mrs r1,cpsr @ save mode psr | |
71 bic r2,r1,#0x1f @ psr with mode bits cleared | |
72 and r0,r0,#0x1f @ get original mode bits | |
73 add r0,r0,r2 | |
74 | |
75 msr cpsr,r0 @ move to pre-exception mode | |
76 str r13,[r12,#4*13] @ save original SP | |
77 str r14,[r12,#4*14] @ save original LR | |
78 msr cpsr,r1 @ restore mode psr | |
79 | |
80 @ r11 has original index | |
81 orr r10,r11,#0xDE<<24 @ r10 = 0xDEAD0000 + index of vector taken | |
82 orr r10,r10,#0xAD<<16 | |
83 str r10,[r12,#4*17] @ save magic + index | |
84 | |
85 mov r0,r11 @ put index into 1st argument | |
86 b dar_exception |