Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+100 -93
+4 -92
arch/arm/mm/fault.c
··· 27 27 28 28 #include "fault.h" 29 29 30 - /* 31 - * Fault status register encodings. We steal bit 31 for our own purposes. 32 - */ 33 - #define FSR_LNX_PF (1 << 31) 34 - #define FSR_WRITE (1 << 11) 35 - #define FSR_FS4 (1 << 10) 36 - #define FSR_FS3_0 (15) 37 - 38 - static inline int fsr_fs(unsigned int fsr) 39 - { 40 - return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6; 41 - } 42 - 43 30 #ifdef CONFIG_MMU 44 31 45 32 #ifdef CONFIG_KPROBES ··· 476 489 return 1; 477 490 } 478 491 479 - static struct fsr_info { 492 + struct fsr_info { 480 493 int (*fn)(unsigned long addr, unsigned int fsr, struct pt_regs *regs); 481 494 int sig; 482 495 int code; 483 496 const char *name; 484 - } fsr_info[] = { 485 - /* 486 - * The following are the standard ARMv3 and ARMv4 aborts. ARMv5 487 - * defines these to be "precise" aborts. 488 - */ 489 - { do_bad, SIGSEGV, 0, "vector exception" }, 490 - { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, 491 - { do_bad, SIGKILL, 0, "terminal exception" }, 492 - { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, 493 - { do_bad, SIGBUS, 0, "external abort on linefetch" }, 494 - { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, 495 - { do_bad, SIGBUS, 0, "external abort on linefetch" }, 496 - { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, 497 - { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, 498 - { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, 499 - { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, 500 - { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, 501 - { do_bad, SIGBUS, 0, "external abort on translation" }, 502 - { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, 503 - { do_bad, SIGBUS, 0, "external abort on translation" }, 504 - { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, 505 - /* 506 - * The following are "imprecise" aborts, which are signalled by bit 507 - * 10 of the FSR, and may not be recoverable. These are only 508 - * supported if the CPU abort handler supports bit 10. 509 - */ 510 - { do_bad, SIGBUS, 0, "unknown 16" }, 511 - { do_bad, SIGBUS, 0, "unknown 17" }, 512 - { do_bad, SIGBUS, 0, "unknown 18" }, 513 - { do_bad, SIGBUS, 0, "unknown 19" }, 514 - { do_bad, SIGBUS, 0, "lock abort" }, /* xscale */ 515 - { do_bad, SIGBUS, 0, "unknown 21" }, 516 - { do_bad, SIGBUS, BUS_OBJERR, "imprecise external abort" }, /* xscale */ 517 - { do_bad, SIGBUS, 0, "unknown 23" }, 518 - { do_bad, SIGBUS, 0, "dcache parity error" }, /* xscale */ 519 - { do_bad, SIGBUS, 0, "unknown 25" }, 520 - { do_bad, SIGBUS, 0, "unknown 26" }, 521 - { do_bad, SIGBUS, 0, "unknown 27" }, 522 - { do_bad, SIGBUS, 0, "unknown 28" }, 523 - { do_bad, SIGBUS, 0, "unknown 29" }, 524 - { do_bad, SIGBUS, 0, "unknown 30" }, 525 - { do_bad, SIGBUS, 0, "unknown 31" } 526 497 }; 498 + 499 + /* FSR definition */ 500 + #include "fsr-2level.c" 527 501 528 502 void __init 529 503 hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *), ··· 520 572 info.si_addr = (void __user *)addr; 521 573 arm_notify_die("", regs, &info, fsr, 0); 522 574 } 523 - 524 - 525 - static struct fsr_info ifsr_info[] = { 526 - { do_bad, SIGBUS, 0, "unknown 0" }, 527 - { do_bad, SIGBUS, 0, "unknown 1" }, 528 - { do_bad, SIGBUS, 0, "debug event" }, 529 - { do_bad, SIGSEGV, SEGV_ACCERR, "section access flag fault" }, 530 - { do_bad, SIGBUS, 0, "unknown 4" }, 531 - { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, 532 - { do_bad, SIGSEGV, SEGV_ACCERR, "page access flag fault" }, 533 - { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, 534 - { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, 535 - { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, 536 - { do_bad, SIGBUS, 0, "unknown 10" }, 537 - { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, 538 - { do_bad, SIGBUS, 0, "external abort on translation" }, 539 - { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, 540 - { do_bad, SIGBUS, 0, "external abort on translation" }, 541 - { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, 542 - { do_bad, SIGBUS, 0, "unknown 16" }, 543 - { do_bad, SIGBUS, 0, "unknown 17" }, 544 - { do_bad, SIGBUS, 0, "unknown 18" }, 545 - { do_bad, SIGBUS, 0, "unknown 19" }, 546 - { do_bad, SIGBUS, 0, "unknown 20" }, 547 - { do_bad, SIGBUS, 0, "unknown 21" }, 548 - { do_bad, SIGBUS, 0, "unknown 22" }, 549 - { do_bad, SIGBUS, 0, "unknown 23" }, 550 - { do_bad, SIGBUS, 0, "unknown 24" }, 551 - { do_bad, SIGBUS, 0, "unknown 25" }, 552 - { do_bad, SIGBUS, 0, "unknown 26" }, 553 - { do_bad, SIGBUS, 0, "unknown 27" }, 554 - { do_bad, SIGBUS, 0, "unknown 28" }, 555 - { do_bad, SIGBUS, 0, "unknown 29" }, 556 - { do_bad, SIGBUS, 0, "unknown 30" }, 557 - { do_bad, SIGBUS, 0, "unknown 31" }, 558 - }; 559 575 560 576 void __init 561 577 hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *),
+18 -1
arch/arm/mm/fault.h
··· 1 - void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs); 1 + #ifndef __ARCH_ARM_FAULT_H 2 + #define __ARCH_ARM_FAULT_H 2 3 4 + /* 5 + * Fault status register encodings. We steal bit 31 for our own purposes. 6 + */ 7 + #define FSR_LNX_PF (1 << 31) 8 + #define FSR_WRITE (1 << 11) 9 + #define FSR_FS4 (1 << 10) 10 + #define FSR_FS3_0 (15) 11 + 12 + static inline int fsr_fs(unsigned int fsr) 13 + { 14 + return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6; 15 + } 16 + 17 + void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs); 3 18 unsigned long search_exception_table(unsigned long addr); 19 + 20 + #endif /* __ARCH_ARM_FAULT_H */
+78
arch/arm/mm/fsr-2level.c
··· 1 + static struct fsr_info fsr_info[] = { 2 + /* 3 + * The following are the standard ARMv3 and ARMv4 aborts. ARMv5 4 + * defines these to be "precise" aborts. 5 + */ 6 + { do_bad, SIGSEGV, 0, "vector exception" }, 7 + { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, 8 + { do_bad, SIGKILL, 0, "terminal exception" }, 9 + { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, 10 + { do_bad, SIGBUS, 0, "external abort on linefetch" }, 11 + { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, 12 + { do_bad, SIGBUS, 0, "external abort on linefetch" }, 13 + { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, 14 + { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, 15 + { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, 16 + { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, 17 + { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, 18 + { do_bad, SIGBUS, 0, "external abort on translation" }, 19 + { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, 20 + { do_bad, SIGBUS, 0, "external abort on translation" }, 21 + { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, 22 + /* 23 + * The following are "imprecise" aborts, which are signalled by bit 24 + * 10 of the FSR, and may not be recoverable. These are only 25 + * supported if the CPU abort handler supports bit 10. 26 + */ 27 + { do_bad, SIGBUS, 0, "unknown 16" }, 28 + { do_bad, SIGBUS, 0, "unknown 17" }, 29 + { do_bad, SIGBUS, 0, "unknown 18" }, 30 + { do_bad, SIGBUS, 0, "unknown 19" }, 31 + { do_bad, SIGBUS, 0, "lock abort" }, /* xscale */ 32 + { do_bad, SIGBUS, 0, "unknown 21" }, 33 + { do_bad, SIGBUS, BUS_OBJERR, "imprecise external abort" }, /* xscale */ 34 + { do_bad, SIGBUS, 0, "unknown 23" }, 35 + { do_bad, SIGBUS, 0, "dcache parity error" }, /* xscale */ 36 + { do_bad, SIGBUS, 0, "unknown 25" }, 37 + { do_bad, SIGBUS, 0, "unknown 26" }, 38 + { do_bad, SIGBUS, 0, "unknown 27" }, 39 + { do_bad, SIGBUS, 0, "unknown 28" }, 40 + { do_bad, SIGBUS, 0, "unknown 29" }, 41 + { do_bad, SIGBUS, 0, "unknown 30" }, 42 + { do_bad, SIGBUS, 0, "unknown 31" }, 43 + }; 44 + 45 + static struct fsr_info ifsr_info[] = { 46 + { do_bad, SIGBUS, 0, "unknown 0" }, 47 + { do_bad, SIGBUS, 0, "unknown 1" }, 48 + { do_bad, SIGBUS, 0, "debug event" }, 49 + { do_bad, SIGSEGV, SEGV_ACCERR, "section access flag fault" }, 50 + { do_bad, SIGBUS, 0, "unknown 4" }, 51 + { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, 52 + { do_bad, SIGSEGV, SEGV_ACCERR, "page access flag fault" }, 53 + { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, 54 + { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, 55 + { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, 56 + { do_bad, SIGBUS, 0, "unknown 10" }, 57 + { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, 58 + { do_bad, SIGBUS, 0, "external abort on translation" }, 59 + { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, 60 + { do_bad, SIGBUS, 0, "external abort on translation" }, 61 + { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, 62 + { do_bad, SIGBUS, 0, "unknown 16" }, 63 + { do_bad, SIGBUS, 0, "unknown 17" }, 64 + { do_bad, SIGBUS, 0, "unknown 18" }, 65 + { do_bad, SIGBUS, 0, "unknown 19" }, 66 + { do_bad, SIGBUS, 0, "unknown 20" }, 67 + { do_bad, SIGBUS, 0, "unknown 21" }, 68 + { do_bad, SIGBUS, 0, "unknown 22" }, 69 + { do_bad, SIGBUS, 0, "unknown 23" }, 70 + { do_bad, SIGBUS, 0, "unknown 24" }, 71 + { do_bad, SIGBUS, 0, "unknown 25" }, 72 + { do_bad, SIGBUS, 0, "unknown 26" }, 73 + { do_bad, SIGBUS, 0, "unknown 27" }, 74 + { do_bad, SIGBUS, 0, "unknown 28" }, 75 + { do_bad, SIGBUS, 0, "unknown 29" }, 76 + { do_bad, SIGBUS, 0, "unknown 30" }, 77 + { do_bad, SIGBUS, 0, "unknown 31" }, 78 + };