Commit 296a7b7e authored by Linus Torvalds's avatar Linus Torvalds

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
parents 3ecc3791 73a0b6ee
...@@ -105,6 +105,19 @@ static inline bool is_write_fault(unsigned int fsr) ...@@ -105,6 +105,19 @@ static inline bool is_write_fault(unsigned int fsr)
return (fsr & FSR_WRITE) && !(fsr & FSR_CM); 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, static void die_kernel_fault(const char *msg, struct mm_struct *mm,
unsigned long addr, unsigned int fsr, unsigned long addr, unsigned int fsr,
struct pt_regs *regs) struct pt_regs *regs)
...@@ -140,7 +153,8 @@ __do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr, ...@@ -140,7 +153,8 @@ __do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
if (addr < PAGE_SIZE) { if (addr < PAGE_SIZE) {
msg = "NULL pointer dereference"; msg = "NULL pointer dereference";
} else { } 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; return;
msg = "paging request"; msg = "paging request";
...@@ -208,7 +222,7 @@ static inline bool is_permission_fault(unsigned int fsr) ...@@ -208,7 +222,7 @@ static inline bool is_permission_fault(unsigned int fsr)
{ {
int fs = fsr_fs(fsr); int fs = fsr_fs(fsr);
#ifdef CONFIG_ARM_LPAE #ifdef CONFIG_ARM_LPAE
if ((fs & FS_PERM_NOLL_MASK) == FS_PERM_NOLL) if ((fs & FS_MMU_NOLL_MASK) == FS_PERM_NOLL)
return true; return true;
#else #else
if (fs == FS_L1_PERM || fs == FS_L2_PERM) if (fs == FS_L1_PERM || fs == FS_L2_PERM)
......
...@@ -14,8 +14,9 @@ ...@@ -14,8 +14,9 @@
#ifdef CONFIG_ARM_LPAE #ifdef CONFIG_ARM_LPAE
#define FSR_FS_AEA 17 #define FSR_FS_AEA 17
#define FS_TRANS_NOLL 0x4
#define FS_PERM_NOLL 0xC #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) static inline int fsr_fs(unsigned int fsr)
{ {
...@@ -23,8 +24,10 @@ static inline int fsr_fs(unsigned int fsr) ...@@ -23,8 +24,10 @@ static inline int fsr_fs(unsigned int fsr)
} }
#else #else
#define FSR_FS_AEA 22 #define FSR_FS_AEA 22
#define FS_L1_PERM 0xD #define FS_L1_TRANS 0x5
#define FS_L2_PERM 0xF #define FS_L2_TRANS 0x7
#define FS_L1_PERM 0xD
#define FS_L2_PERM 0xF
static inline int fsr_fs(unsigned int fsr) static inline int fsr_fs(unsigned int fsr)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment