Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef _ASMARM_BUG_H |
2 | #define _ASMARM_BUG_H | |
3 | ||
9f97da78 | 4 | #include <linux/linkage.h> |
63328070 BD |
5 | #include <linux/types.h> |
6 | #include <asm/opcodes.h> | |
1da177e4 | 7 | |
c8538a7a | 8 | #ifdef CONFIG_BUG |
1da177e4 | 9 | |
87e040b6 SG |
10 | /* |
11 | * Use a suitable undefined instruction to use for ARM/Thumb2 bug handling. | |
12 | * We need to be careful not to conflict with those used by other modules and | |
13 | * the register_undef_hook() system. | |
14 | */ | |
15 | #ifdef CONFIG_THUMB2_KERNEL | |
16 | #define BUG_INSTR_VALUE 0xde02 | |
63328070 | 17 | #define BUG_INSTR(__value) __inst_thumb16(__value) |
1da177e4 | 18 | #else |
87e040b6 | 19 | #define BUG_INSTR_VALUE 0xe7f001f2 |
63328070 | 20 | #define BUG_INSTR(__value) __inst_arm(__value) |
87e040b6 | 21 | #endif |
1da177e4 | 22 | |
1da177e4 | 23 | |
87e040b6 SG |
24 | #define BUG() _BUG(__FILE__, __LINE__, BUG_INSTR_VALUE) |
25 | #define _BUG(file, line, value) __BUG(file, line, value) | |
26 | ||
27 | #ifdef CONFIG_DEBUG_BUGVERBOSE | |
28 | ||
29 | /* | |
30 | * The extra indirection is to ensure that the __FILE__ string comes through | |
31 | * OK. Many version of gcc do not support the asm %c parameter which would be | |
32 | * preferable to this unpleasantness. We use mergeable string sections to | |
33 | * avoid multiple copies of the string appearing in the kernel image. | |
34 | */ | |
35 | ||
36 | #define __BUG(__file, __line, __value) \ | |
37 | do { \ | |
63328070 | 38 | asm volatile("1:\t" BUG_INSTR(__value) "\n" \ |
87e040b6 SG |
39 | ".pushsection .rodata.str, \"aMS\", %progbits, 1\n" \ |
40 | "2:\t.asciz " #__file "\n" \ | |
41 | ".popsection\n" \ | |
42 | ".pushsection __bug_table,\"a\"\n" \ | |
43 | "3:\t.word 1b, 2b\n" \ | |
44 | "\t.hword " #__line ", 0\n" \ | |
45 | ".popsection"); \ | |
46 | unreachable(); \ | |
47 | } while (0) | |
48 | ||
49 | #else /* not CONFIG_DEBUG_BUGVERBOSE */ | |
50 | ||
51 | #define __BUG(__file, __line, __value) \ | |
52 | do { \ | |
63328070 | 53 | asm volatile(BUG_INSTR(__value) "\n"); \ |
87e040b6 SG |
54 | unreachable(); \ |
55 | } while (0) | |
56 | #endif /* CONFIG_DEBUG_BUGVERBOSE */ | |
1da177e4 LT |
57 | |
58 | #define HAVE_ARCH_BUG | |
87e040b6 | 59 | #endif /* CONFIG_BUG */ |
c8538a7a | 60 | |
1da177e4 LT |
61 | #include <asm-generic/bug.h> |
62 | ||
9f97da78 DH |
63 | struct pt_regs; |
64 | void die(const char *msg, struct pt_regs *regs, int err); | |
65 | ||
66 | struct siginfo; | |
67 | void arm_notify_die(const char *str, struct pt_regs *regs, struct siginfo *info, | |
68 | unsigned long err, unsigned long trap); | |
69 | ||
70 | #ifdef CONFIG_ARM_LPAE | |
71 | #define FAULT_CODE_ALIGNMENT 33 | |
72 | #define FAULT_CODE_DEBUG 34 | |
73 | #else | |
74 | #define FAULT_CODE_ALIGNMENT 1 | |
75 | #define FAULT_CODE_DEBUG 2 | |
76 | #endif | |
77 | ||
78 | void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, | |
79 | struct pt_regs *), | |
80 | int sig, int code, const char *name); | |
81 | ||
82 | void hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int, | |
83 | struct pt_regs *), | |
84 | int sig, int code, const char *name); | |
85 | ||
86 | extern asmlinkage void c_backtrace(unsigned long fp, int pmode); | |
87 | ||
88 | struct mm_struct; | |
89 | extern void show_pte(struct mm_struct *mm, unsigned long addr); | |
90 | extern void __show_regs(struct pt_regs *); | |
91 | ||
1da177e4 | 92 | #endif |