xref: /linux/arch/arm/mm/fault.h (revision 129d6eb266e0848c9bf45da6e30291688c12b5ad)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __ARCH_ARM_FAULT_H
3 #define __ARCH_ARM_FAULT_H
4 
5 /*
6  * Fault status register encodings.  We steal bit 31 for our own purposes.
7  */
8 #define FSR_LNX_PF		BIT(31)
9 #define FSR_CM			BIT(13)
10 #define FSR_WRITE		BIT(11)
11 
12 #ifdef CONFIG_ARM_LPAE
13 #define FSR_FS_AEA		17
14 #define FS_TRANS_NOLL		0x4
15 #define FS_PERM_NOLL		0xC
16 #define FS_MMU_NOLL_MASK	0x3C
17 
18 #define FSR_FS5_0		GENMASK(5, 0)
19 
fsr_fs(unsigned int fsr)20 static inline int fsr_fs(unsigned int fsr)
21 {
22 	return fsr & FSR_FS5_0;
23 }
24 
is_translation_fault(unsigned int fsr)25 static inline bool is_translation_fault(unsigned int fsr)
26 {
27 	int fs = fsr_fs(fsr);
28 
29 	return (fs & FS_MMU_NOLL_MASK) == FS_TRANS_NOLL;
30 }
31 
is_permission_fault(unsigned int fsr)32 static inline bool is_permission_fault(unsigned int fsr)
33 {
34 	int fs = fsr_fs(fsr);
35 
36 	return (fs & FS_MMU_NOLL_MASK) == FS_PERM_NOLL;
37 }
38 #else
39 #define FSR_FS_AEA		22
40 #define FS_L1_TRANS		0x5
41 #define FS_L2_TRANS		0x7
42 #define FS_L1_PERM		0xD
43 #define FS_L2_PERM		0xF
44 
45 #define FSR_FS4			BIT(10)
46 #define FSR_FS3_0		GENMASK(3, 0)
47 
fsr_fs(unsigned int fsr)48 static inline int fsr_fs(unsigned int fsr)
49 {
50 	return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6;
51 }
52 
is_translation_fault(unsigned int fsr)53 static inline bool is_translation_fault(unsigned int fsr)
54 {
55 	int fs = fsr_fs(fsr);
56 
57 	return fs == FS_L1_TRANS || fs == FS_L2_TRANS;
58 }
59 
is_permission_fault(unsigned int fsr)60 static inline bool is_permission_fault(unsigned int fsr)
61 {
62 	int fs = fsr_fs(fsr);
63 
64 	return fs == FS_L1_PERM || fs == FS_L2_PERM;
65 }
66 #endif
67 
68 void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs);
69 void early_abt_enable(void);
70 asmlinkage void do_DataAbort(unsigned long addr, unsigned int fsr,
71 			     struct pt_regs *regs);
72 asmlinkage void do_PrefetchAbort(unsigned long addr, unsigned int ifsr,
73 				 struct pt_regs *regs);
74 
75 #endif	/* __ARCH_ARM_FAULT_H */
76