118
119
#ifdef HIGH_EXCEPTION_VECTORS
119
/** Activates use of high exception vectors addresses. */
120
/** Activates use of high exception vectors addresses.
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.
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).
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.
120
137
static void high_vectors(void)
122
uint32_t control_reg;
125
"mrc p15, 0, %[control_reg], c1, c0"
126
: [control_reg] "=r" (control_reg)
139
uint32_t control_reg = SCTLR_read();
129
141
/* switch on the high vectors bit */
130
control_reg |= CP15_R1_HIGH_VECTORS_BIT;
142
control_reg |= SCTLR_HIGH_VECTORS_EN_FLAG;
133
"mcr p15, 0, %[control_reg], c1, c0"
134
:: [control_reg] "r" (control_reg)
144
SCTLR_write(control_reg);
145
154
machine_irq_exception(exc_no, istate);
157
/** Undefined instruction exception handler.
159
* Calls scheduler_fpu_lazy_request
161
static void undef_insn_exception(unsigned int exc_no, istate_t *istate)
164
if (handle_if_fpu_exception()) {
166
* Retry the failing instruction,
167
* ARM Architecture Reference Manual says on p.B1-1169
168
* that offset for undef instruction exception is 4
174
fault_if_from_uspace(istate, "Undefined instruction.");
175
panic_badtrap(istate, exc_no, "Undefined instruction.");
148
178
/** Initializes exception handling.
150
180
* Installs low-level exception handlers and then registers
153
183
void exception_init(void)
185
// TODO check for availability of high vectors for <= armv5
155
186
#ifdef HIGH_EXCEPTION_VECTORS
158
189
install_exception_handlers();
191
exc_register(EXC_UNDEF_INSTR, "undefined instruction", true,
192
(iroutine_t) undef_insn_exception);
160
193
exc_register(EXC_IRQ, "interrupt", true,
161
194
(iroutine_t) irq_exception);
162
195
exc_register(EXC_PREFETCH_ABORT, "prefetch abort", true,