Skip to content

Commit 296a7b7

Browse files
committed
Merge tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm
Pull ARM fix from Russell King: "One further ARM fix for 6.1 from Wang Kefeng, fixing up the handling for kfence faults" * tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm: ARM: 9278/1: kfence: only handle translation faults
2 parents 3ecc379 + 73a0b6e commit 296a7b7

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

arch/arm/mm/fault.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,19 @@ static inline bool is_write_fault(unsigned int fsr)
105105
return (fsr & FSR_WRITE) && !(fsr & FSR_CM);
106106
}
107107

108+
static inline bool is_translation_fault(unsigned int fsr)
109+
{
110+
int fs = fsr_fs(fsr);
111+
#ifdef CONFIG_ARM_LPAE
112+
if ((fs & FS_MMU_NOLL_MASK) == FS_TRANS_NOLL)
113+
return true;
114+
#else
115+
if (fs == FS_L1_TRANS || fs == FS_L2_TRANS)
116+
return true;
117+
#endif
118+
return false;
119+
}
120+
108121
static void die_kernel_fault(const char *msg, struct mm_struct *mm,
109122
unsigned long addr, unsigned int fsr,
110123
struct pt_regs *regs)
@@ -140,7 +153,8 @@ __do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
140153
if (addr < PAGE_SIZE) {
141154
msg = "NULL pointer dereference";
142155
} else {
143-
if (kfence_handle_page_fault(addr, is_write_fault(fsr), regs))
156+
if (is_translation_fault(fsr) &&
157+
kfence_handle_page_fault(addr, is_write_fault(fsr), regs))
144158
return;
145159

146160
msg = "paging request";
@@ -208,7 +222,7 @@ static inline bool is_permission_fault(unsigned int fsr)
208222
{
209223
int fs = fsr_fs(fsr);
210224
#ifdef CONFIG_ARM_LPAE
211-
if ((fs & FS_PERM_NOLL_MASK) == FS_PERM_NOLL)
225+
if ((fs & FS_MMU_NOLL_MASK) == FS_PERM_NOLL)
212226
return true;
213227
#else
214228
if (fs == FS_L1_PERM || fs == FS_L2_PERM)

arch/arm/mm/fault.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,20 @@
1414

1515
#ifdef CONFIG_ARM_LPAE
1616
#define FSR_FS_AEA 17
17+
#define FS_TRANS_NOLL 0x4
1718
#define FS_PERM_NOLL 0xC
18-
#define FS_PERM_NOLL_MASK 0x3C
19+
#define FS_MMU_NOLL_MASK 0x3C
1920

2021
static inline int fsr_fs(unsigned int fsr)
2122
{
2223
return fsr & FSR_FS5_0;
2324
}
2425
#else
2526
#define FSR_FS_AEA 22
26-
#define FS_L1_PERM 0xD
27-
#define FS_L2_PERM 0xF
27+
#define FS_L1_TRANS 0x5
28+
#define FS_L2_TRANS 0x7
29+
#define FS_L1_PERM 0xD
30+
#define FS_L2_PERM 0xF
2831

2932
static inline int fsr_fs(unsigned int fsr)
3033
{

0 commit comments

Comments
 (0)