mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	arm64: Add support for function error injection
Inspired by the commit 7cd01b08d3 ("powerpc: Add support for function
error injection"), this patch supports function error injection for
Arm64.
This patch mainly support two functions: one is regs_set_return_value()
which is used to overwrite the return value; the another function is
override_function_with_return() which is to override the probed
function returning and jump to its caller.
Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Leo Yan <leo.yan@linaro.org>
Signed-off-by: Will Deacon <will@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									45880f7b7b
								
							
						
					
					
						commit
						42d038c4fb
					
				
					 4 changed files with 26 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -148,6 +148,7 @@ config ARM64
 | 
			
		|||
	select HAVE_FAST_GUP
 | 
			
		||||
	select HAVE_FTRACE_MCOUNT_RECORD
 | 
			
		||||
	select HAVE_FUNCTION_TRACER
 | 
			
		||||
	select HAVE_FUNCTION_ERROR_INJECTION
 | 
			
		||||
	select HAVE_FUNCTION_GRAPH_TRACER
 | 
			
		||||
	select HAVE_GCC_PLUGINS
 | 
			
		||||
	select HAVE_HW_BREAKPOINT if PERF_EVENTS
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -301,6 +301,11 @@ static inline unsigned long regs_return_value(struct pt_regs *regs)
 | 
			
		|||
	return regs->regs[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
 | 
			
		||||
{
 | 
			
		||||
	regs->regs[0] = rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * regs_get_kernel_argument() - get Nth function argument in kernel
 | 
			
		||||
 * @regs:	pt_regs of that context
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,3 +33,5 @@ UBSAN_SANITIZE_atomic_ll_sc.o	:= n
 | 
			
		|||
lib-$(CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE) += uaccess_flushcache.o
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_CRC32) += crc32.o
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								arch/arm64/lib/error-inject.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								arch/arm64/lib/error-inject.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
// SPDX-License-Identifier: GPL-2.0
 | 
			
		||||
 | 
			
		||||
#include <linux/error-injection.h>
 | 
			
		||||
#include <linux/kprobes.h>
 | 
			
		||||
 | 
			
		||||
void override_function_with_return(struct pt_regs *regs)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	 * 'regs' represents the state on entry of a predefined function in
 | 
			
		||||
	 * the kernel/module and which is captured on a kprobe.
 | 
			
		||||
	 *
 | 
			
		||||
	 * When kprobe returns back from exception it will override the end
 | 
			
		||||
	 * of probed function and directly return to the predefined
 | 
			
		||||
	 * function's caller.
 | 
			
		||||
	 */
 | 
			
		||||
	instruction_pointer_set(regs, procedure_link_pointer(regs));
 | 
			
		||||
}
 | 
			
		||||
NOKPROBE_SYMBOL(override_function_with_return);
 | 
			
		||||
		Loading…
	
		Reference in a new issue