FreeCalypso > hg > fc-selenite
comparison src/cs/system/main/gcc/exceptions.S @ 83:92fde62400ef
.../gcc/exceptions.S: added 2nd part that was missing in Citrine
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Fri, 20 Jul 2018 18:21:46 +0000 |
| parents | 95ef11e76c5b |
| children |
comparison
equal
deleted
inserted
replaced
| 82:6afaa5cb7392 | 83:92fde62400ef |
|---|---|
| 1 /* | 1 /* |
| 2 * This module contains ARM exception handlers which used to be | 2 * This module contains ARM exception handlers which used to be |
| 3 * in chipsetsw/system/Main/int.s in TI's Leonardo code. | 3 * in chipsetsw/system/Main/int.s in TI's original version. |
| 4 */ | 4 */ |
| 5 | |
| 6 .section "except_stack","aw",%nobits | |
| 7 .balign 4 | |
| 8 .space 512 | |
| 9 .globl _Except_Stack_SP | |
| 10 _Except_Stack_SP: | |
| 11 | 5 |
| 12 .text | 6 .text |
| 13 .code 32 | 7 .code 32 |
| 14 | 8 |
| 15 @ layout of xdump buffer: | 9 @ layout of xdump buffer: |
| 82 orr r10,r10,#0xAD<<16 | 76 orr r10,r10,#0xAD<<16 |
| 83 str r10,[r12,#4*17] @ save magic + index | 77 str r10,[r12,#4*17] @ save magic + index |
| 84 | 78 |
| 85 mov r0,r11 @ put index into 1st argument | 79 mov r0,r11 @ put index into 1st argument |
| 86 b dar_exception | 80 b dar_exception |
| 81 | |
| 82 @ the second part | |
| 83 | |
| 84 /* | |
| 85 * For the SP-in-RAM validity check, we use the following simplification: | |
| 86 * it doesn't really matter what the actual IRAM and XRAM sizes are on | |
| 87 * any given target, as the address decoder hooked up to the ARM7TDMI core | |
| 88 * always decodes the full 8 MiB address range for each, causing the | |
| 89 * actual memories to be aliased multiple times in those two ranges. | |
| 90 * Furthermore, the XRAM address range falls right after the IRAM one, | |
| 91 * thus we can get away with only a single range check. | |
| 92 */ | |
| 93 | |
| 94 #define RAM_LOW 0x00800000 | |
| 95 #define RAM_HIGH 0x01800000 | |
| 96 | |
| 97 #define XDUMP_STACK_SIZE 20 | |
| 98 | |
| 99 .globl exception | |
| 100 exception: | |
| 101 ldr r12,=xdump_buffer | |
| 102 ldr r11,[r12,#4*13] @ get svc mode r13 | |
| 103 add r12,r12,#4*18 @ base of stack buffer | |
| 104 | |
| 105 @ check if svc r13(sp) is within internal/external RAM. | |
| 106 @ It *could* be invalid. | |
| 107 cmp r11,#RAM_LOW | |
| 108 blt nostack | |
| 109 mov r0,#RAM_HIGH | |
| 110 sub r0,r0,#XDUMP_STACK_SIZE | |
| 111 cmp r11,r0 | |
| 112 bge nostack | |
| 113 | |
| 114 stack_range: | |
| 115 ldmfd r11!,{r0-r9} @ copy ten stack words.. | |
| 116 stmia r12!,{r0-r9} | |
| 117 ldmfd r11!,{r0-r9} @ copy ten stack words.. | |
| 118 stmia r12!,{r0-r9} | |
| 119 | |
| 120 nostack: | |
| 121 @ we're finished saving all state. | |
| 122 @ Now execute C code for more flexibility. | |
| 123 @ set up a stack for this C call | |
| 124 ldr sp,=_Stack_segment_end | |
| 125 b dar_reset |
