ARM: 9278/1: kfence: only handle translation faults
This is a similar fixup like arm64 does, only handle translation faults in case of unexpected kfence report when alignment faults on ARM, see more from commit0bb1fbffc6
("arm64: mm: kfence: only handle translation faults"). Fixes:75969686ec
("ARM: 9166/1: Support KFENCE for ARM") Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
This commit is contained in:
parent
340a982825
commit
73a0b6ee5d
|
@ -105,6 +105,19 @@ static inline bool is_write_fault(unsigned int fsr)
|
|||
return (fsr & FSR_WRITE) && !(fsr & FSR_CM);
|
||||
}
|
||||
|
||||
static inline bool is_translation_fault(unsigned int fsr)
|
||||
{
|
||||
int fs = fsr_fs(fsr);
|
||||
#ifdef CONFIG_ARM_LPAE
|
||||
if ((fs & FS_MMU_NOLL_MASK) == FS_TRANS_NOLL)
|
||||
return true;
|
||||
#else
|
||||
if (fs == FS_L1_TRANS || fs == FS_L2_TRANS)
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static void die_kernel_fault(const char *msg, struct mm_struct *mm,
|
||||
unsigned long addr, unsigned int fsr,
|
||||
struct pt_regs *regs)
|
||||
|
@ -140,7 +153,8 @@ __do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
|
|||
if (addr < PAGE_SIZE) {
|
||||
msg = "NULL pointer dereference";
|
||||
} else {
|
||||
if (kfence_handle_page_fault(addr, is_write_fault(fsr), regs))
|
||||
if (is_translation_fault(fsr) &&
|
||||
kfence_handle_page_fault(addr, is_write_fault(fsr), regs))
|
||||
return;
|
||||
|
||||
msg = "paging request";
|
||||
|
@ -208,7 +222,7 @@ static inline bool is_permission_fault(unsigned int fsr)
|
|||
{
|
||||
int fs = fsr_fs(fsr);
|
||||
#ifdef CONFIG_ARM_LPAE
|
||||
if ((fs & FS_PERM_NOLL_MASK) == FS_PERM_NOLL)
|
||||
if ((fs & FS_MMU_NOLL_MASK) == FS_PERM_NOLL)
|
||||
return true;
|
||||
#else
|
||||
if (fs == FS_L1_PERM || fs == FS_L2_PERM)
|
||||
|
|
|
@ -14,8 +14,9 @@
|
|||
|
||||
#ifdef CONFIG_ARM_LPAE
|
||||
#define FSR_FS_AEA 17
|
||||
#define FS_TRANS_NOLL 0x4
|
||||
#define FS_PERM_NOLL 0xC
|
||||
#define FS_PERM_NOLL_MASK 0x3C
|
||||
#define FS_MMU_NOLL_MASK 0x3C
|
||||
|
||||
static inline int fsr_fs(unsigned int fsr)
|
||||
{
|
||||
|
@ -23,8 +24,10 @@ static inline int fsr_fs(unsigned int fsr)
|
|||
}
|
||||
#else
|
||||
#define FSR_FS_AEA 22
|
||||
#define FS_L1_PERM 0xD
|
||||
#define FS_L2_PERM 0xF
|
||||
#define FS_L1_TRANS 0x5
|
||||
#define FS_L2_TRANS 0x7
|
||||
#define FS_L1_PERM 0xD
|
||||
#define FS_L2_PERM 0xF
|
||||
|
||||
static inline int fsr_fs(unsigned int fsr)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue