Skip to content

Commit

Permalink
x86, smap: A page fault due to SMAP is an oops
Browse files Browse the repository at this point in the history
If we get a page fault due to SMAP, trigger an oops rather than
spinning forever.

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Link: http://lkml.kernel.org/r/1348256595-29119-11-git-send-email-hpa@linux.intel.com
  • Loading branch information
H. Peter Anvin committed Sep 21, 2012
1 parent 52b6179 commit 40d3cd6
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions arch/x86/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -995,6 +995,17 @@ static int fault_in_kernel_space(unsigned long address)
return address >= TASK_SIZE_MAX;
}

static inline bool smap_violation(int error_code, struct pt_regs *regs)
{
if (error_code & PF_USER)
return false;

if (!user_mode_vm(regs) && (regs->flags & X86_EFLAGS_AC))
return false;

return true;
}

/*
* This routine handles page faults. It determines the address,
* and the problem, and then passes it off to one of the appropriate
Expand Down Expand Up @@ -1088,6 +1099,13 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code)
if (unlikely(error_code & PF_RSVD))
pgtable_bad(regs, error_code, address);

if (static_cpu_has(X86_FEATURE_SMAP)) {
if (unlikely(smap_violation(error_code, regs))) {
bad_area_nosemaphore(regs, error_code, address);
return;
}
}

perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);

/*
Expand Down

0 comments on commit 40d3cd6

Please sign in to comment.