diff options
author | Paul Brook <paul@codesourcery.com> | 2008-04-18 17:43:07 -0400 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2008-04-18 17:43:07 -0400 |
commit | 48d7927bdf071d05cf5d15b816cf06b0937cb84f (patch) | |
tree | 60f82f25897f9b3fd55148edac9348b451afc6cf /arch/arm/kernel | |
parent | d7f864be8323e5394040e2877594645b0e7da85d (diff) |
Add a prefetch abort handler
This patch adds a prefetch abort handler similar to the data abort one
and renames the latter for consistency. Initial implementation by Paul
Brook with some renaming by Catalin Marinas.
Signed-off-by: Paul Brook <paul@codesourcery.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r-- | arch/arm/kernel/asm-offsets.c | 7 | ||||
-rw-r--r-- | arch/arm/kernel/entry-armv.S | 34 | ||||
-rw-r--r-- | arch/arm/kernel/entry-common.S | 5 |
3 files changed, 36 insertions, 10 deletions
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index 6604b474cfd7..0a0d2479274b 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c | |||
@@ -111,5 +111,12 @@ int main(void) | |||
111 | DEFINE(PROCINFO_INITFUNC, offsetof(struct proc_info_list, __cpu_flush)); | 111 | DEFINE(PROCINFO_INITFUNC, offsetof(struct proc_info_list, __cpu_flush)); |
112 | DEFINE(PROCINFO_MM_MMUFLAGS, offsetof(struct proc_info_list, __cpu_mm_mmu_flags)); | 112 | DEFINE(PROCINFO_MM_MMUFLAGS, offsetof(struct proc_info_list, __cpu_mm_mmu_flags)); |
113 | DEFINE(PROCINFO_IO_MMUFLAGS, offsetof(struct proc_info_list, __cpu_io_mmu_flags)); | 113 | DEFINE(PROCINFO_IO_MMUFLAGS, offsetof(struct proc_info_list, __cpu_io_mmu_flags)); |
114 | BLANK(); | ||
115 | #ifdef MULTI_DABORT | ||
116 | DEFINE(PROCESSOR_DABT_FUNC, offsetof(struct processor, _data_abort)); | ||
117 | #endif | ||
118 | #ifdef MULTI_PABORT | ||
119 | DEFINE(PROCESSOR_PABT_FUNC, offsetof(struct processor, _prefetch_abort)); | ||
120 | #endif | ||
114 | return 0; | 121 | return 0; |
115 | } | 122 | } |
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index a46d5b456765..5e647eb6b3b9 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -166,12 +166,12 @@ __dabt_svc: | |||
166 | @ The abort handler must return the aborted address in r0, and | 166 | @ The abort handler must return the aborted address in r0, and |
167 | @ the fault status register in r1. r9 must be preserved. | 167 | @ the fault status register in r1. r9 must be preserved. |
168 | @ | 168 | @ |
169 | #ifdef MULTI_ABORT | 169 | #ifdef MULTI_DABORT |
170 | ldr r4, .LCprocfns | 170 | ldr r4, .LCprocfns |
171 | mov lr, pc | 171 | mov lr, pc |
172 | ldr pc, [r4] | 172 | ldr pc, [r4, #PROCESSOR_DABT_FUNC] |
173 | #else | 173 | #else |
174 | bl CPU_ABORT_HANDLER | 174 | bl CPU_DABORT_HANDLER |
175 | #endif | 175 | #endif |
176 | 176 | ||
177 | @ | 177 | @ |
@@ -293,7 +293,6 @@ __pabt_svc: | |||
293 | mrs r9, cpsr | 293 | mrs r9, cpsr |
294 | tst r3, #PSR_I_BIT | 294 | tst r3, #PSR_I_BIT |
295 | biceq r9, r9, #PSR_I_BIT | 295 | biceq r9, r9, #PSR_I_BIT |
296 | msr cpsr_c, r9 | ||
297 | 296 | ||
298 | @ | 297 | @ |
299 | @ set args, then call main handler | 298 | @ set args, then call main handler |
@@ -301,7 +300,15 @@ __pabt_svc: | |||
301 | @ r0 - address of faulting instruction | 300 | @ r0 - address of faulting instruction |
302 | @ r1 - pointer to registers on stack | 301 | @ r1 - pointer to registers on stack |
303 | @ | 302 | @ |
304 | mov r0, r2 @ address (pc) | 303 | #ifdef MULTI_PABORT |
304 | mov r0, r2 @ pass address of aborted instruction. | ||
305 | ldr r4, .LCprocfns | ||
306 | mov lr, pc | ||
307 | ldr pc, [r4, #PROCESSOR_PABT_FUNC] | ||
308 | #else | ||
309 | CPU_PABORT_HANDLER(r0, r2) | ||
310 | #endif | ||
311 | msr cpsr_c, r9 @ Maybe enable interrupts | ||
305 | mov r1, sp @ regs | 312 | mov r1, sp @ regs |
306 | bl do_PrefetchAbort @ call abort handler | 313 | bl do_PrefetchAbort @ call abort handler |
307 | 314 | ||
@@ -320,7 +327,7 @@ __pabt_svc: | |||
320 | .align 5 | 327 | .align 5 |
321 | .LCcralign: | 328 | .LCcralign: |
322 | .word cr_alignment | 329 | .word cr_alignment |
323 | #ifdef MULTI_ABORT | 330 | #ifdef MULTI_DABORT |
324 | .LCprocfns: | 331 | .LCprocfns: |
325 | .word processor | 332 | .word processor |
326 | #endif | 333 | #endif |
@@ -404,12 +411,12 @@ __dabt_usr: | |||
404 | @ The abort handler must return the aborted address in r0, and | 411 | @ The abort handler must return the aborted address in r0, and |
405 | @ the fault status register in r1. | 412 | @ the fault status register in r1. |
406 | @ | 413 | @ |
407 | #ifdef MULTI_ABORT | 414 | #ifdef MULTI_DABORT |
408 | ldr r4, .LCprocfns | 415 | ldr r4, .LCprocfns |
409 | mov lr, pc | 416 | mov lr, pc |
410 | ldr pc, [r4] | 417 | ldr pc, [r4, #PROCESSOR_DABT_FUNC] |
411 | #else | 418 | #else |
412 | bl CPU_ABORT_HANDLER | 419 | bl CPU_DABORT_HANDLER |
413 | #endif | 420 | #endif |
414 | 421 | ||
415 | @ | 422 | @ |
@@ -619,8 +626,15 @@ __und_usr_unknown: | |||
619 | __pabt_usr: | 626 | __pabt_usr: |
620 | usr_entry | 627 | usr_entry |
621 | 628 | ||
629 | #ifdef MULTI_PABORT | ||
630 | mov r0, r2 @ pass address of aborted instruction. | ||
631 | ldr r4, .LCprocfns | ||
632 | mov lr, pc | ||
633 | ldr pc, [r4, #PROCESSOR_PABT_FUNC] | ||
634 | #else | ||
635 | CPU_PABORT_HANDLER(r0, r2) | ||
636 | #endif | ||
622 | enable_irq @ Enable interrupts | 637 | enable_irq @ Enable interrupts |
623 | mov r0, r2 @ address (pc) | ||
624 | mov r1, sp @ regs | 638 | mov r1, sp @ regs |
625 | bl do_PrefetchAbort @ call abort handler | 639 | bl do_PrefetchAbort @ call abort handler |
626 | /* fall through */ | 640 | /* fall through */ |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 6c90c50a9ee3..597ed00a08d8 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
@@ -352,6 +352,11 @@ sys_mmap2: | |||
352 | b do_mmap2 | 352 | b do_mmap2 |
353 | #endif | 353 | #endif |
354 | 354 | ||
355 | ENTRY(pabort_ifar) | ||
356 | mrc p15, 0, r0, cr6, cr0, 2 | ||
357 | ENTRY(pabort_noifar) | ||
358 | mov pc, lr | ||
359 | |||
355 | #ifdef CONFIG_OABI_COMPAT | 360 | #ifdef CONFIG_OABI_COMPAT |
356 | 361 | ||
357 | /* | 362 | /* |