On Thu, Sep 2, 2021 at 2:08 AM Jean-Philippe Brucker jean-philippe@linaro.org wrote:
struct pt_regs is not exported to userspace on all archs. arm64 and s390 export "user_pt_regs" instead, which causes build failure at the moment:
progs/test_task_pt_regs.c:8:16: error: variable has incomplete type 'struct pt_regs' struct pt_regs current_regs = {};
Right, which is 'bpf_user_pt_regs_t'. It's defined for all archs and arm64/s390/ppc/risv define it differently from pt_regs.
Use the multi-arch macros defined by tools/lib/bpf/bpf_tracing.h to copy the pt_regs into a locally-defined struct.
Copying the user_pt_regs struct on arm64 wouldn't work because the struct is too large and the compiler complains about using too much stack.
That's a different issue. I think the cleaner fix would be to make the test use bpf_user_pt_regs_t instead.
Fixes: 576d47bb1a92 ("bpf: selftests: Add bpf_task_pt_regs() selftest") Signed-off-by: Jean-Philippe Brucker jean-philippe@linaro.org
.../selftests/bpf/bpf_pt_regs_helpers.h | 30 +++++++++++++++++++ .../selftests/bpf/prog_tests/task_pt_regs.c | 1 + .../selftests/bpf/progs/test_task_pt_regs.c | 10 ++++--- 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 tools/testing/selftests/bpf/bpf_pt_regs_helpers.h
diff --git a/tools/testing/selftests/bpf/bpf_pt_regs_helpers.h b/tools/testing/selftests/bpf/bpf_pt_regs_helpers.h new file mode 100644 index 000000000000..7531f4824ead --- /dev/null +++ b/tools/testing/selftests/bpf/bpf_pt_regs_helpers.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __BPF_PT_REGS_HELPERS +#define __BPF_PT_REGS_HELPERS
+#include <bpf/bpf_tracing.h>
+struct bpf_pt_regs {
unsigned long long parm[5];
unsigned long long ret;
unsigned long long fp;
unsigned long long rc;
unsigned long long sp;
unsigned long long ip;
+};
+static inline void bpf_copy_pt_regs(struct bpf_pt_regs *dest, struct pt_regs *src) +{
dest->parm[0] = PT_REGS_PARM1(src);
dest->parm[1] = PT_REGS_PARM2(src);
dest->parm[2] = PT_REGS_PARM3(src);
dest->parm[3] = PT_REGS_PARM4(src);
dest->parm[4] = PT_REGS_PARM5(src);
dest->ret = PT_REGS_RET(src);
dest->fp = PT_REGS_FP(src);
dest->rc = PT_REGS_RC(src);
dest->sp = PT_REGS_SP(src);
dest->ip = PT_REGS_IP(src);
+}
+#endif /* __BPF_PT_REGS_HELPERS */ diff --git a/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c b/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c index 53f0e0fa1a53..196453b75937 100644 --- a/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c +++ b/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c @@ -2,6 +2,7 @@ #define _GNU_SOURCE #include <test_progs.h> #include <linux/ptrace.h> +#include "bpf_pt_regs_helpers.h" #include "test_task_pt_regs.skel.h"
void test_task_pt_regs(void) diff --git a/tools/testing/selftests/bpf/progs/test_task_pt_regs.c b/tools/testing/selftests/bpf/progs/test_task_pt_regs.c index 6c059f1cfa1b..348da3509093 100644 --- a/tools/testing/selftests/bpf/progs/test_task_pt_regs.c +++ b/tools/testing/selftests/bpf/progs/test_task_pt_regs.c @@ -5,8 +5,10 @@ #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h>
-struct pt_regs current_regs = {}; -struct pt_regs ctx_regs = {}; +#include "bpf_pt_regs_helpers.h"
+struct bpf_pt_regs current_regs = {}; +struct bpf_pt_regs ctx_regs = {}; int uprobe_res = 0;
SEC("uprobe/trigger_func") @@ -17,8 +19,8 @@ int handle_uprobe(struct pt_regs *ctx)
current = bpf_get_current_task_btf(); regs = (struct pt_regs *) bpf_task_pt_regs(current);
__builtin_memcpy(¤t_regs, regs, sizeof(*regs));
__builtin_memcpy(&ctx_regs, ctx, sizeof(*ctx));
bpf_copy_pt_regs(¤t_regs, regs);
bpf_copy_pt_regs(&ctx_regs, ctx); /* Prove that uprobe was run */ uprobe_res = 1;
-- 2.33.0