|
@@ -908,7 +908,8 @@ static inline bool bad_area_access_from_pkeys(unsigned long error_code,
|
|
|
if (error_code & PF_PK)
|
|
|
return true;
|
|
|
/* this checks permission keys on the VMA: */
|
|
|
- if (!arch_vma_access_permitted(vma, (error_code & PF_WRITE), foreign))
|
|
|
+ if (!arch_vma_access_permitted(vma, (error_code & PF_WRITE),
|
|
|
+ (error_code & PF_INSTR), foreign))
|
|
|
return true;
|
|
|
return false;
|
|
|
}
|
|
@@ -1112,7 +1113,8 @@ access_error(unsigned long error_code, struct vm_area_struct *vma)
|
|
|
* faults just to hit a PF_PK as soon as we fill in a
|
|
|
* page.
|
|
|
*/
|
|
|
- if (!arch_vma_access_permitted(vma, (error_code & PF_WRITE), foreign))
|
|
|
+ if (!arch_vma_access_permitted(vma, (error_code & PF_WRITE),
|
|
|
+ (error_code & PF_INSTR), foreign))
|
|
|
return 1;
|
|
|
|
|
|
if (error_code & PF_WRITE) {
|
|
@@ -1267,6 +1269,8 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code,
|
|
|
|
|
|
if (error_code & PF_WRITE)
|
|
|
flags |= FAULT_FLAG_WRITE;
|
|
|
+ if (error_code & PF_INSTR)
|
|
|
+ flags |= FAULT_FLAG_INSTRUCTION;
|
|
|
|
|
|
/*
|
|
|
* When running in the kernel we expect faults to occur only to
|