1*e2b5cfc9SAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
2*e2b5cfc9SAndrii Nakryiko /* Copyright (c) 2023 Meta Platforms, Inc. and affiliates. */
3*e2b5cfc9SAndrii Nakryiko #include "vmlinux.h"
4*e2b5cfc9SAndrii Nakryiko #include <bpf/bpf_helpers.h>
5*e2b5cfc9SAndrii Nakryiko #include <bpf/bpf_tracing.h>
6*e2b5cfc9SAndrii Nakryiko #include <bpf/bpf_core_read.h>
7*e2b5cfc9SAndrii Nakryiko #include "bpf_misc.h"
8*e2b5cfc9SAndrii Nakryiko 
9*e2b5cfc9SAndrii Nakryiko char _license[] SEC("license") = "GPL";
10*e2b5cfc9SAndrii Nakryiko 
11*e2b5cfc9SAndrii Nakryiko static long stack[256];
12*e2b5cfc9SAndrii Nakryiko 
13*e2b5cfc9SAndrii Nakryiko /*
14*e2b5cfc9SAndrii Nakryiko  * KPROBE contexts
15*e2b5cfc9SAndrii Nakryiko  */
16*e2b5cfc9SAndrii Nakryiko 
kprobe_typedef_ctx_subprog(bpf_user_pt_regs_t * ctx)17*e2b5cfc9SAndrii Nakryiko __weak int kprobe_typedef_ctx_subprog(bpf_user_pt_regs_t *ctx)
18*e2b5cfc9SAndrii Nakryiko {
19*e2b5cfc9SAndrii Nakryiko 	return bpf_get_stack(ctx, &stack, sizeof(stack), 0);
20*e2b5cfc9SAndrii Nakryiko }
21*e2b5cfc9SAndrii Nakryiko 
22*e2b5cfc9SAndrii Nakryiko SEC("?kprobe")
23*e2b5cfc9SAndrii Nakryiko __success
kprobe_typedef_ctx(void * ctx)24*e2b5cfc9SAndrii Nakryiko int kprobe_typedef_ctx(void *ctx)
25*e2b5cfc9SAndrii Nakryiko {
26*e2b5cfc9SAndrii Nakryiko 	return kprobe_typedef_ctx_subprog(ctx);
27*e2b5cfc9SAndrii Nakryiko }
28*e2b5cfc9SAndrii Nakryiko 
29*e2b5cfc9SAndrii Nakryiko #define pt_regs_struct_t typeof(*(__PT_REGS_CAST((struct pt_regs *)NULL)))
30*e2b5cfc9SAndrii Nakryiko 
kprobe_struct_ctx_subprog(pt_regs_struct_t * ctx)31*e2b5cfc9SAndrii Nakryiko __weak int kprobe_struct_ctx_subprog(pt_regs_struct_t *ctx)
32*e2b5cfc9SAndrii Nakryiko {
33*e2b5cfc9SAndrii Nakryiko 	return bpf_get_stack((void *)ctx, &stack, sizeof(stack), 0);
34*e2b5cfc9SAndrii Nakryiko }
35*e2b5cfc9SAndrii Nakryiko 
36*e2b5cfc9SAndrii Nakryiko SEC("?kprobe")
37*e2b5cfc9SAndrii Nakryiko __success
kprobe_resolved_ctx(void * ctx)38*e2b5cfc9SAndrii Nakryiko int kprobe_resolved_ctx(void *ctx)
39*e2b5cfc9SAndrii Nakryiko {
40*e2b5cfc9SAndrii Nakryiko 	return kprobe_struct_ctx_subprog(ctx);
41*e2b5cfc9SAndrii Nakryiko }
42*e2b5cfc9SAndrii Nakryiko 
43*e2b5cfc9SAndrii Nakryiko /* this is current hack to make this work on old kernels */
44*e2b5cfc9SAndrii Nakryiko struct bpf_user_pt_regs_t {};
45*e2b5cfc9SAndrii Nakryiko 
kprobe_workaround_ctx_subprog(struct bpf_user_pt_regs_t * ctx)46*e2b5cfc9SAndrii Nakryiko __weak int kprobe_workaround_ctx_subprog(struct bpf_user_pt_regs_t *ctx)
47*e2b5cfc9SAndrii Nakryiko {
48*e2b5cfc9SAndrii Nakryiko 	return bpf_get_stack(ctx, &stack, sizeof(stack), 0);
49*e2b5cfc9SAndrii Nakryiko }
50*e2b5cfc9SAndrii Nakryiko 
51*e2b5cfc9SAndrii Nakryiko SEC("?kprobe")
52*e2b5cfc9SAndrii Nakryiko __success
kprobe_workaround_ctx(void * ctx)53*e2b5cfc9SAndrii Nakryiko int kprobe_workaround_ctx(void *ctx)
54*e2b5cfc9SAndrii Nakryiko {
55*e2b5cfc9SAndrii Nakryiko 	return kprobe_workaround_ctx_subprog(ctx);
56*e2b5cfc9SAndrii Nakryiko }
57*e2b5cfc9SAndrii Nakryiko 
58*e2b5cfc9SAndrii Nakryiko /*
59*e2b5cfc9SAndrii Nakryiko  * RAW_TRACEPOINT contexts
60*e2b5cfc9SAndrii Nakryiko  */
61*e2b5cfc9SAndrii Nakryiko 
raw_tp_ctx_subprog(struct bpf_raw_tracepoint_args * ctx)62*e2b5cfc9SAndrii Nakryiko __weak int raw_tp_ctx_subprog(struct bpf_raw_tracepoint_args *ctx)
63*e2b5cfc9SAndrii Nakryiko {
64*e2b5cfc9SAndrii Nakryiko 	return bpf_get_stack(ctx, &stack, sizeof(stack), 0);
65*e2b5cfc9SAndrii Nakryiko }
66*e2b5cfc9SAndrii Nakryiko 
67*e2b5cfc9SAndrii Nakryiko SEC("?raw_tp")
68*e2b5cfc9SAndrii Nakryiko __success
raw_tp_ctx(void * ctx)69*e2b5cfc9SAndrii Nakryiko int raw_tp_ctx(void *ctx)
70*e2b5cfc9SAndrii Nakryiko {
71*e2b5cfc9SAndrii Nakryiko 	return raw_tp_ctx_subprog(ctx);
72*e2b5cfc9SAndrii Nakryiko }
73*e2b5cfc9SAndrii Nakryiko 
74*e2b5cfc9SAndrii Nakryiko /*
75*e2b5cfc9SAndrii Nakryiko  * RAW_TRACEPOINT_WRITABLE contexts
76*e2b5cfc9SAndrii Nakryiko  */
77*e2b5cfc9SAndrii Nakryiko 
raw_tp_writable_ctx_subprog(struct bpf_raw_tracepoint_args * ctx)78*e2b5cfc9SAndrii Nakryiko __weak int raw_tp_writable_ctx_subprog(struct bpf_raw_tracepoint_args *ctx)
79*e2b5cfc9SAndrii Nakryiko {
80*e2b5cfc9SAndrii Nakryiko 	return bpf_get_stack(ctx, &stack, sizeof(stack), 0);
81*e2b5cfc9SAndrii Nakryiko }
82*e2b5cfc9SAndrii Nakryiko 
83*e2b5cfc9SAndrii Nakryiko SEC("?raw_tp")
84*e2b5cfc9SAndrii Nakryiko __success
raw_tp_writable_ctx(void * ctx)85*e2b5cfc9SAndrii Nakryiko int raw_tp_writable_ctx(void *ctx)
86*e2b5cfc9SAndrii Nakryiko {
87*e2b5cfc9SAndrii Nakryiko 	return raw_tp_writable_ctx_subprog(ctx);
88*e2b5cfc9SAndrii Nakryiko }
89*e2b5cfc9SAndrii Nakryiko 
90*e2b5cfc9SAndrii Nakryiko /*
91*e2b5cfc9SAndrii Nakryiko  * PERF_EVENT contexts
92*e2b5cfc9SAndrii Nakryiko  */
93*e2b5cfc9SAndrii Nakryiko 
perf_event_ctx_subprog(struct bpf_perf_event_data * ctx)94*e2b5cfc9SAndrii Nakryiko __weak int perf_event_ctx_subprog(struct bpf_perf_event_data *ctx)
95*e2b5cfc9SAndrii Nakryiko {
96*e2b5cfc9SAndrii Nakryiko 	return bpf_get_stack(ctx, &stack, sizeof(stack), 0);
97*e2b5cfc9SAndrii Nakryiko }
98*e2b5cfc9SAndrii Nakryiko 
99*e2b5cfc9SAndrii Nakryiko SEC("?perf_event")
100*e2b5cfc9SAndrii Nakryiko __success
perf_event_ctx(void * ctx)101*e2b5cfc9SAndrii Nakryiko int perf_event_ctx(void *ctx)
102*e2b5cfc9SAndrii Nakryiko {
103*e2b5cfc9SAndrii Nakryiko 	return perf_event_ctx_subprog(ctx);
104*e2b5cfc9SAndrii Nakryiko }
105