Changeset e762b43 in mainline for kernel/arch/arm32/src/exception.c
- Timestamp:
- 2009-03-03T16:12:43Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 02fd705
- Parents:
- f24d300
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/src/exception.c
rf24d300 re762b43 64 64 * Temporary exception stack is used to save a few registers 65 65 * before stack switch takes place. 66 * 66 67 */ 67 68 inline static void setup_stack_and_save_regs() 68 69 { 69 asm volatile (70 "ldr r13, =exc_stack 71 "stmfd r13!, {r0} 72 "mrs r0, spsr 73 "and r0, r0, #0x1f 74 "cmp r0, #0x10 75 "bne 1f 76 70 asm volatile ( 71 "ldr r13, =exc_stack\n" 72 "stmfd r13!, {r0}\n" 73 "mrs r0, spsr\n" 74 "and r0, r0, #0x1f\n" 75 "cmp r0, #0x10\n" 76 "bne 1f\n" 77 77 78 /* prev mode was usermode */ 78 "ldmfd r13!, {r0} 79 "ldr r13, =supervisor_sp 80 "ldr r13, [r13] 81 "stmfd r13!, {lr} 82 "stmfd r13!, {r0-r12} 83 "stmfd r13!, {r13, lr}^ 84 "mrs r0, spsr 85 "stmfd r13!, {r0} 86 "b 2f 87 79 "ldmfd r13!, {r0}\n" 80 "ldr r13, =supervisor_sp\n" 81 "ldr r13, [r13]\n" 82 "stmfd r13!, {lr}\n" 83 "stmfd r13!, {r0-r12}\n" 84 "stmfd r13!, {r13, lr}^\n" 85 "mrs r0, spsr\n" 86 "stmfd r13!, {r0}\n" 87 "b 2f\n" 88 88 89 /* mode was not usermode */ 89 "1:\n" 90 "stmfd r13!, {r1, r2, r3} \n" 91 "mrs r1, cpsr \n" 92 "mov r2, lr \n" 93 "bic r1, r1, #0x1f \n" 94 "orr r1, r1, r0 \n" 95 "mrs r0, cpsr \n" 96 "msr cpsr_c, r1 \n" 97 98 "mov r3, r13 \n" 99 "stmfd r13!, {r2} \n" 100 "mov r2, lr \n" 101 "stmfd r13!, {r4-r12} \n" 102 "mov r1, r13 \n" 103 /* the following two lines are for debugging */ 104 "mov sp, #0 \n" 105 "mov lr, #0 \n" 106 "msr cpsr_c, r0 \n" 107 108 "ldmfd r13!, {r4, r5, r6, r7} \n" 109 "stmfd r1!, {r4, r5, r6} \n" 110 "stmfd r1!, {r7} \n" 111 "stmfd r1!, {r2} \n" 112 "stmfd r1!, {r3} \n" 113 "mrs r0, spsr \n" 114 "stmfd r1!, {r0} \n" 115 "mov r13, r1 \n" 116 "2:\n" 90 "1:\n" 91 "stmfd r13!, {r1, r2, r3}\n" 92 "mrs r1, cpsr\n" 93 "mov r2, lr\n" 94 "bic r1, r1, #0x1f\n" 95 "orr r1, r1, r0\n" 96 "mrs r0, cpsr\n" 97 "msr cpsr_c, r1\n" 98 99 "mov r3, r13\n" 100 "stmfd r13!, {r2}\n" 101 "mov r2, lr\n" 102 "stmfd r13!, {r4-r12}\n" 103 "mov r1, r13\n" 104 105 /* the following two lines are for debugging */ 106 "mov sp, #0\n" 107 "mov lr, #0\n" 108 "msr cpsr_c, r0\n" 109 110 "ldmfd r13!, {r4, r5, r6, r7}\n" 111 "stmfd r1!, {r4, r5, r6}\n" 112 "stmfd r1!, {r7}\n" 113 "stmfd r1!, {r2}\n" 114 "stmfd r1!, {r3}\n" 115 "mrs r0, spsr\n" 116 "stmfd r1!, {r0}\n" 117 "mov r13, r1\n" 118 119 "2:\n" 117 120 ); 118 121 } … … 190 193 191 194 /** Calls exception dispatch routine. */ 192 #define CALL_EXC_DISPATCH(exception) \ 193 asm("mov r0, %0" : : "i" (exception)); \ 194 asm("mov r1, r13"); \ 195 asm("bl exc_dispatch"); 195 #define CALL_EXC_DISPATCH(exception) \ 196 asm volatile ( \ 197 "mov r0, %[exc]\n" \ 198 "mov r1, r13\n" \ 199 "bl exc_dispatch\n" \ 200 :: [exc] "i" (exception) \ 201 );\ 196 202 197 203 /** General exception handler. … … 202 208 * @param exception Exception number. 203 209 */ 204 #define PROCESS_EXCEPTION(exception) 205 setup_stack_and_save_regs(); 206 CALL_EXC_DISPATCH(exception) 210 #define PROCESS_EXCEPTION(exception) \ 211 setup_stack_and_save_regs(); \ 212 CALL_EXC_DISPATCH(exception) \ 207 213 load_regs(); 208 214 … … 334 340 uint32_t control_reg; 335 341 336 asm volatile("mrc p15, 0, %0, c1, c1" : "=r" (control_reg)); 342 asm volatile ( 343 "mrc p15, 0, %[control_reg], c1, c1" 344 : [control_reg] "=r" (control_reg) 345 ); 337 346 338 347 /* switch on the high vectors bit */ 339 348 control_reg |= CP15_R1_HIGH_VECTORS_BIT; 340 349 341 asm volatile("mcr p15, 0, %0, c1, c1" : : "r" (control_reg)); 350 asm volatile ( 351 "mcr p15, 0, %[control_reg], c1, c1" 352 :: [control_reg] "r" (control_reg) 353 ); 342 354 } 343 355 #endif 344 356 345 357 /** Initializes exception handling. 346 * 358 * 347 359 * Installs low-level exception handlers and then registers 348 360 * exceptions and their handlers to kernel exception dispatcher.
Note:
See TracChangeset
for help on using the changeset viewer.