mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	x86/kprobes: Refactor kprobes_fault() like kprobe_exceptions_notify()
This is an extension of commit b506a9d08b ("x86: code clarification patch
to Kprobes arch code"). As that commit explains, even though
kprobe_running() can't be called with preemption enabled, preemption does
not need to be disabled. If preemption is enabled, then this can't be
originate from a kprobe.
Also, use X86_TRAP_PF instead of 14.
Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Kees Cook <keescook@chromium.org>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: kernel-hardening@lists.openwall.com
Cc: dvyukov@google.com
Cc: "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com>
Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: linux-fsdevel@vger.kernel.org
Cc: Borislav Petkov <bp@alien8.de>
Link: https://lkml.kernel.org/r/20180828201421.157735-2-jannh@google.com
			
			
This commit is contained in:
		
							parent
							
								
									60c1f89241
								
							
						
					
					
						commit
						a980c0ef9f
					
				
					 1 changed files with 13 additions and 11 deletions
				
			
		| 
						 | 
					@ -44,17 +44,19 @@ kmmio_fault(struct pt_regs *regs, unsigned long addr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static nokprobe_inline int kprobes_fault(struct pt_regs *regs)
 | 
					static nokprobe_inline int kprobes_fault(struct pt_regs *regs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ret = 0;
 | 
						if (!kprobes_built_in())
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
	/* kprobe_running() needs smp_processor_id() */
 | 
						if (user_mode(regs))
 | 
				
			||||||
	if (kprobes_built_in() && !user_mode(regs)) {
 | 
							return 0;
 | 
				
			||||||
		preempt_disable();
 | 
						/*
 | 
				
			||||||
		if (kprobe_running() && kprobe_fault_handler(regs, 14))
 | 
						 * To be potentially processing a kprobe fault and to be allowed to call
 | 
				
			||||||
			ret = 1;
 | 
						 * kprobe_running(), we have to be non-preemptible.
 | 
				
			||||||
		preempt_enable();
 | 
						 */
 | 
				
			||||||
	}
 | 
						if (preemptible())
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
	return ret;
 | 
						if (!kprobe_running())
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						return kprobe_fault_handler(regs, X86_TRAP_PF);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue