Changes in kernel/arch/arm32/src/exception.c [9a5ccc14:a99a3d7] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/src/exception.c
r9a5ccc14 ra99a3d7 39 39 #include <interrupt.h> 40 40 #include <arch/mm/page_fault.h> 41 #include <arch/cp15.h>42 41 #include <arch/barrier.h> 43 42 #include <print.h> … … 74 73 /* make it LDR instruction and store at exception vector */ 75 74 *vector = handler_address_ptr | LDR_OPCODE; 76 smc_coherence( vector);75 smc_coherence(*vector); 77 76 78 77 /* store handler's address */ … … 118 117 119 118 #ifdef HIGH_EXCEPTION_VECTORS 120 /** Activates use of high exception vectors addresses. 121 * 122 * "High vectors were introduced into some implementations of ARMv4 and are 123 * required in ARMv6 implementations. High vectors allow the exception vector 124 * locations to be moved from their normal address range 0x00000000-0x0000001C 125 * at the bottom of the 32-bit address space, to an alternative address range 126 * 0xFFFF0000-0xFFFF001C near the top of the address space. These alternative 127 * locations are known as the high vectors. 128 * 129 * Prior to ARMv6, it is IMPLEMENTATION DEFINED whether the high vectors are 130 * supported. When they are, a hardware configuration input selects whether 131 * the normal vectors or the high vectors are to be used from 132 * reset." ARM Architecture Reference Manual A2.6.11 (p. 64 in the PDF). 133 * 134 * ARM920T (gta02) TRM A2.3.5 (PDF p. 36) and ARM926EJ-S (icp) 2.3.2 (PDF p. 42) 135 * say that armv4 an armv5 chips that we support implement this. 136 */ 119 /** Activates use of high exception vectors addresses. */ 137 120 static void high_vectors(void) 138 121 { 139 uint32_t control_reg = SCTLR_read(); 122 uint32_t control_reg; 123 124 asm volatile ( 125 "mrc p15, 0, %[control_reg], c1, c1" 126 : [control_reg] "=r" (control_reg) 127 ); 140 128 141 129 /* switch on the high vectors bit */ 142 control_reg |= SCTLR_HIGH_VECTORS_EN_FLAG;130 control_reg |= CP15_R1_HIGH_VECTORS_BIT; 143 131 144 SCTLR_write(control_reg); 132 asm volatile ( 133 "mcr p15, 0, %[control_reg], c1, c1" 134 :: [control_reg] "r" (control_reg) 135 ); 145 136 } 146 137 #endif … … 155 146 } 156 147 157 /** Undefined instruction exception handler.158 *159 * Calls scheduler_fpu_lazy_request160 */161 static void undef_insn_exception(unsigned int exc_no, istate_t *istate)162 {163 #ifdef CONFIG_FPU164 if (handle_if_fpu_exception()) {165 /*166 * Retry the failing instruction,167 * ARM Architecture Reference Manual says on p.B1-1169168 * that offset for undef instruction exception is 4169 */170 istate->pc -= 4;171 return;172 }173 #endif174 fault_if_from_uspace(istate, "Undefined instruction.");175 panic_badtrap(istate, exc_no, "Undefined instruction.");176 }177 178 148 /** Initializes exception handling. 179 149 * … … 183 153 void exception_init(void) 184 154 { 185 // TODO check for availability of high vectors for <= armv5186 155 #ifdef HIGH_EXCEPTION_VECTORS 187 156 high_vectors(); … … 189 158 install_exception_handlers(); 190 159 191 exc_register(EXC_UNDEF_INSTR, "undefined instruction", true,192 (iroutine_t) undef_insn_exception);193 160 exc_register(EXC_IRQ, "interrupt", true, 194 161 (iroutine_t) irq_exception);
Note:
See TracChangeset
for help on using the changeset viewer.