mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	bpf: Add bpf_get_func_ip helper for kprobe programs
Adding bpf_get_func_ip helper for BPF_PROG_TYPE_KPROBE programs, so it's now possible to call bpf_get_func_ip from both kprobe and kretprobe programs. Taking the caller's address from 'struct kprobe::addr', which is defined for both kprobe and kretprobe. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org> Link: https://lore.kernel.org/bpf/20210714094400.396467-5-jolsa@kernel.org
This commit is contained in:
		
							parent
							
								
									9b99edcae5
								
							
						
					
					
						commit
						9ffd9f3ff7
					
				
					 4 changed files with 20 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -4844,7 +4844,7 @@ union bpf_attr {
 | 
			
		|||
 *
 | 
			
		||||
 * u64 bpf_get_func_ip(void *ctx)
 | 
			
		||||
 * 	Description
 | 
			
		||||
 * 		Get address of the traced function (for tracing programs).
 | 
			
		||||
 * 		Get address of the traced function (for tracing and kprobe programs).
 | 
			
		||||
 * 	Return
 | 
			
		||||
 * 		Address of the traced function.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6175,6 +6175,8 @@ static int check_get_func_ip(struct bpf_verifier_env *env)
 | 
			
		|||
			return -ENOTSUPP;
 | 
			
		||||
		}
 | 
			
		||||
		return 0;
 | 
			
		||||
	} else if (type == BPF_PROG_TYPE_KPROBE) {
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	verbose(env, "func %s#%d not supported for program type %d\n",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -961,6 +961,20 @@ static const struct bpf_func_proto bpf_get_func_ip_proto_tracing = {
 | 
			
		|||
	.arg1_type	= ARG_PTR_TO_CTX,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
BPF_CALL_1(bpf_get_func_ip_kprobe, struct pt_regs *, regs)
 | 
			
		||||
{
 | 
			
		||||
	struct kprobe *kp = kprobe_running();
 | 
			
		||||
 | 
			
		||||
	return kp ? (u64) kp->addr : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const struct bpf_func_proto bpf_get_func_ip_proto_kprobe = {
 | 
			
		||||
	.func		= bpf_get_func_ip_kprobe,
 | 
			
		||||
	.gpl_only	= true,
 | 
			
		||||
	.ret_type	= RET_INTEGER,
 | 
			
		||||
	.arg1_type	= ARG_PTR_TO_CTX,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const struct bpf_func_proto *
 | 
			
		||||
bpf_tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -1092,6 +1106,8 @@ kprobe_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
 | 
			
		|||
	case BPF_FUNC_override_return:
 | 
			
		||||
		return &bpf_override_return_proto;
 | 
			
		||||
#endif
 | 
			
		||||
	case BPF_FUNC_get_func_ip:
 | 
			
		||||
		return &bpf_get_func_ip_proto_kprobe;
 | 
			
		||||
	default:
 | 
			
		||||
		return bpf_tracing_func_proto(func_id, prog);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4844,7 +4844,7 @@ union bpf_attr {
 | 
			
		|||
 *
 | 
			
		||||
 * u64 bpf_get_func_ip(void *ctx)
 | 
			
		||||
 * 	Description
 | 
			
		||||
 * 		Get address of the traced function (for tracing programs).
 | 
			
		||||
 * 		Get address of the traced function (for tracing and kprobe programs).
 | 
			
		||||
 * 	Return
 | 
			
		||||
 * 		Address of the traced function.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue