X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=arch%2Fx86%2Fmm%2Ffault.c;h=455f3fe67b42412c8acda3eb63e33678ebec1845;hb=cfc1b9a6a683c835a20d5b565ade55baf639f72f;hp=d0f5fce77d95b9f8afa7c0879a3e211b937365b8;hpb=67350a5c4514c280665cdb45439d32a008a264ba;p=safe%2Fjmp%2Flinux-2.6 diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index d0f5fce..455f3fe 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -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