Rev 2341 | Rev 2355 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2341 | Rev 2344 | ||
---|---|---|---|
Line 57... | Line 57... | ||
57 | extern uintptr_t exc_stack; |
57 | extern uintptr_t exc_stack; |
58 | 58 | ||
59 | 59 | ||
60 | inline static void setup_stack_and_save_regs() |
60 | inline static void setup_stack_and_save_regs() |
61 | { |
61 | { |
- | 62 | /* |
|
- | 63 | ||
- | 64 | str r0, =exc_stack |
|
- | 65 | str r1, =exc_stack + 4 |
|
- | 66 | mrs r0, cpsr |
|
- | 67 | mrs r1, spsr |
|
- | 68 | and r0, r0, #0x1f |
|
- | 69 | and r1, r1, #0x1f |
|
- | 70 | cmp r0, r1 |
|
- | 71 | be 3f |
|
- | 72 | @different exception mode => preserve sp |
|
- | 73 | ldr r1, [=exc_stack + 4] |
|
- | 74 | ldr r0, [=exc_stack] |
|
- | 75 | ||
- | 76 | 3: |
|
- | 77 | mrs r0, spsr |
|
- | 78 | stmfd sp!, {r0, sp, lr} |
|
- | 79 | */ |
|
- | 80 | ||
62 | asm volatile( "ldr r13, =exc_stack \n\ |
81 | asm volatile("ldr r13, =exc_stack \n\ |
63 | stmfd r13!, {r0} \n\ |
82 | stmfd r13!, {r0} \n\ |
64 | mrs r0, spsr \n\ |
83 | mrs r0, spsr \n\ |
65 | and r0, r0, #0x1f \n\ |
84 | and r0, r0, #0x1f \n\ |
66 | cmp r0, #0x10 \n\ |
85 | cmp r0, #0x10 \n\ |
67 | bne 1f \n\ |
86 | bne 1f \n\ |
Line 247... | Line 266... | ||
247 | 266 | ||
248 | /** Low-level Interrupt Exception handler. */ |
267 | /** Low-level Interrupt Exception handler. */ |
249 | static void irq_exception_entry() |
268 | static void irq_exception_entry() |
250 | { |
269 | { |
251 | asm("sub lr, lr, #4"); |
270 | asm("sub lr, lr, #4"); |
- | 271 | setup_stack_and_save_regs(); |
|
- | 272 | ||
- | 273 | /* switch to Undefined mode */ |
|
- | 274 | asm("stmfd sp!, {r0-r3}"); |
|
- | 275 | asm("mov r1, sp"); |
|
- | 276 | asm("mov r2, lr"); |
|
- | 277 | // asm("mrs r3, spsr"); |
|
- | 278 | asm("mrs r0, cpsr"); |
|
- | 279 | asm("bic r0, r0, #0x1f"); |
|
- | 280 | asm("orr r0, r0, #0x1b"); |
|
- | 281 | asm("msr cpsr_c, r0"); |
|
- | 282 | asm("mov sp, r1"); |
|
- | 283 | asm("mov lr, r2"); |
|
- | 284 | // asm("msr spsr, r3"); |
|
- | 285 | asm("ldmfd sp!, {r0-r3}"); |
|
- | 286 | ||
252 | PROCESS_EXCEPTION(EXC_IRQ); |
287 | CALL_EXC_DISPATCH(EXC_IRQ) |
- | 288 | ||
- | 289 | load_regs(); |
|
253 | } |
290 | } |
254 | 291 | ||
255 | 292 | ||
256 | /** Software Interrupt handler. |
293 | /** Software Interrupt handler. |
257 | * |
294 | * |