-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ARM: LPAE: Move the FSR definitions to separate files
The FSR structure is different with LPAE and this patch moves the classic MMU specific definition to a separate fsr-2level.c file that is included in fault.c. It also moves the fsr_fs and FSR bits to the fault.h file. Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
- Loading branch information
Catalin Marinas
committed
Dec 8, 2011
1 parent
e0c0313
commit 136848d
Showing
3 changed files
with
100 additions
and
93 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,20 @@ | ||
void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs); | ||
#ifndef __ARCH_ARM_FAULT_H | ||
#define __ARCH_ARM_FAULT_H | ||
|
||
/* | ||
* Fault status register encodings. We steal bit 31 for our own purposes. | ||
*/ | ||
#define FSR_LNX_PF (1 << 31) | ||
#define FSR_WRITE (1 << 11) | ||
#define FSR_FS4 (1 << 10) | ||
#define FSR_FS3_0 (15) | ||
|
||
static inline int fsr_fs(unsigned int fsr) | ||
{ | ||
return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6; | ||
} | ||
|
||
void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs); | ||
unsigned long search_exception_table(unsigned long addr); | ||
|
||
#endif /* __ARCH_ARM_FAULT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
static struct fsr_info fsr_info[] = { | ||
/* | ||
* The following are the standard ARMv3 and ARMv4 aborts. ARMv5 | ||
* defines these to be "precise" aborts. | ||
*/ | ||
{ do_bad, SIGSEGV, 0, "vector exception" }, | ||
{ do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, | ||
{ do_bad, SIGKILL, 0, "terminal exception" }, | ||
{ do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, | ||
{ do_bad, SIGBUS, 0, "external abort on linefetch" }, | ||
{ do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, | ||
{ do_bad, SIGBUS, 0, "external abort on linefetch" }, | ||
{ do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, | ||
{ do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
{ do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, | ||
{ do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
{ do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, | ||
{ do_bad, SIGBUS, 0, "external abort on translation" }, | ||
{ do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, | ||
{ do_bad, SIGBUS, 0, "external abort on translation" }, | ||
{ do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, | ||
/* | ||
* The following are "imprecise" aborts, which are signalled by bit | ||
* 10 of the FSR, and may not be recoverable. These are only | ||
* supported if the CPU abort handler supports bit 10. | ||
*/ | ||
{ do_bad, SIGBUS, 0, "unknown 16" }, | ||
{ do_bad, SIGBUS, 0, "unknown 17" }, | ||
{ do_bad, SIGBUS, 0, "unknown 18" }, | ||
{ do_bad, SIGBUS, 0, "unknown 19" }, | ||
{ do_bad, SIGBUS, 0, "lock abort" }, /* xscale */ | ||
{ do_bad, SIGBUS, 0, "unknown 21" }, | ||
{ do_bad, SIGBUS, BUS_OBJERR, "imprecise external abort" }, /* xscale */ | ||
{ do_bad, SIGBUS, 0, "unknown 23" }, | ||
{ do_bad, SIGBUS, 0, "dcache parity error" }, /* xscale */ | ||
{ do_bad, SIGBUS, 0, "unknown 25" }, | ||
{ do_bad, SIGBUS, 0, "unknown 26" }, | ||
{ do_bad, SIGBUS, 0, "unknown 27" }, | ||
{ do_bad, SIGBUS, 0, "unknown 28" }, | ||
{ do_bad, SIGBUS, 0, "unknown 29" }, | ||
{ do_bad, SIGBUS, 0, "unknown 30" }, | ||
{ do_bad, SIGBUS, 0, "unknown 31" }, | ||
}; | ||
|
||
static struct fsr_info ifsr_info[] = { | ||
{ do_bad, SIGBUS, 0, "unknown 0" }, | ||
{ do_bad, SIGBUS, 0, "unknown 1" }, | ||
{ do_bad, SIGBUS, 0, "debug event" }, | ||
{ do_bad, SIGSEGV, SEGV_ACCERR, "section access flag fault" }, | ||
{ do_bad, SIGBUS, 0, "unknown 4" }, | ||
{ do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, | ||
{ do_bad, SIGSEGV, SEGV_ACCERR, "page access flag fault" }, | ||
{ do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, | ||
{ do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
{ do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, | ||
{ do_bad, SIGBUS, 0, "unknown 10" }, | ||
{ do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, | ||
{ do_bad, SIGBUS, 0, "external abort on translation" }, | ||
{ do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, | ||
{ do_bad, SIGBUS, 0, "external abort on translation" }, | ||
{ do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, | ||
{ do_bad, SIGBUS, 0, "unknown 16" }, | ||
{ do_bad, SIGBUS, 0, "unknown 17" }, | ||
{ do_bad, SIGBUS, 0, "unknown 18" }, | ||
{ do_bad, SIGBUS, 0, "unknown 19" }, | ||
{ do_bad, SIGBUS, 0, "unknown 20" }, | ||
{ do_bad, SIGBUS, 0, "unknown 21" }, | ||
{ do_bad, SIGBUS, 0, "unknown 22" }, | ||
{ do_bad, SIGBUS, 0, "unknown 23" }, | ||
{ do_bad, SIGBUS, 0, "unknown 24" }, | ||
{ do_bad, SIGBUS, 0, "unknown 25" }, | ||
{ do_bad, SIGBUS, 0, "unknown 26" }, | ||
{ do_bad, SIGBUS, 0, "unknown 27" }, | ||
{ do_bad, SIGBUS, 0, "unknown 28" }, | ||
{ do_bad, SIGBUS, 0, "unknown 29" }, | ||
{ do_bad, SIGBUS, 0, "unknown 30" }, | ||
{ do_bad, SIGBUS, 0, "unknown 31" }, | ||
}; |