diff options
Diffstat (limited to 'arch/x86/mm/fault.c')
| -rw-r--r-- | arch/x86/mm/fault.c | 13 | 
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index d0f5fce77d9..455f3fe67b4 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -10,6 +10,7 @@  #include <linux/string.h>  #include <linux/types.h>  #include <linux/ptrace.h> +#include <linux/mmiotrace.h>  #include <linux/mman.h>  #include <linux/mm.h>  #include <linux/smp.h> @@ -49,6 +50,16 @@  #define PF_RSVD		(1<<3)  #define PF_INSTR	(1<<4) +static inline int kmmio_fault(struct pt_regs *regs, unsigned long addr) +{ +#ifdef CONFIG_MMIOTRACE_HOOKS +	if (unlikely(is_kmmio_active())) +		if (kmmio_handler(regs, addr) == 1) +			return -1; +#endif +	return 0; +} +  static inline int notify_page_fault(struct pt_regs *regs)  {  #ifdef CONFIG_KPROBES @@ -598,6 +609,8 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)  	if (notify_page_fault(regs))  		return; +	if (unlikely(kmmio_fault(regs, address))) +		return;  	/*  	 * We fault-in kernel-space virtual memory on-demand. The  |