hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/tools/perf/util/bpf-prologue.c
....@@ -8,12 +8,12 @@
88 */
99
1010 #include <bpf/libbpf.h>
11
-#include "perf.h"
1211 #include "debug.h"
1312 #include "bpf-loader.h"
1413 #include "bpf-prologue.h"
1514 #include "probe-finder.h"
1615 #include <errno.h>
16
+#include <stdlib.h>
1717 #include <dwarf-regs.h>
1818 #include <linux/filter.h>
1919
....@@ -142,7 +142,8 @@
142142 gen_read_mem(struct bpf_insn_pos *pos,
143143 int src_base_addr_reg,
144144 int dst_addr_reg,
145
- long offset)
145
+ long offset,
146
+ int probeid)
146147 {
147148 /* mov arg3, src_base_addr_reg */
148149 if (src_base_addr_reg != BPF_REG_ARG3)
....@@ -159,7 +160,7 @@
159160 ins(BPF_MOV64_REG(BPF_REG_ARG1, dst_addr_reg), pos);
160161
161162 /* Call probe_read */
162
- ins(BPF_EMIT_CALL(BPF_FUNC_probe_read), pos);
163
+ ins(BPF_EMIT_CALL(probeid), pos);
163164 /*
164165 * Error processing: if read fail, goto error code,
165166 * will be relocated. Target should be the start of
....@@ -241,7 +242,7 @@
241242 gen_prologue_slowpath(struct bpf_insn_pos *pos,
242243 struct probe_trace_arg *args, int nargs)
243244 {
244
- int err, i;
245
+ int err, i, probeid;
245246
246247 for (i = 0; i < nargs; i++) {
247248 struct probe_trace_arg *arg = &args[i];
....@@ -276,11 +277,16 @@
276277 stack_offset), pos);
277278
278279 ref = arg->ref;
280
+ probeid = BPF_FUNC_probe_read_kernel;
279281 while (ref) {
280282 pr_debug("prologue: arg %d: offset %ld\n",
281283 i, ref->offset);
284
+
285
+ if (ref->user_access)
286
+ probeid = BPF_FUNC_probe_read_user;
287
+
282288 err = gen_read_mem(pos, BPF_REG_3, BPF_REG_7,
283
- ref->offset);
289
+ ref->offset, probeid);
284290 if (err) {
285291 pr_err("prologue: failed to generate probe_read function call\n");
286292 goto errout;