Skip to content

Commit 1be84ca

Browse files
captain5050anakryiko
authored andcommitted
bpftool: Align bpf_load_and_run_opts insns and data
A C string lacks alignment so use aligned arrays to avoid potential alignment problems. Switch to using sizeof (less 1 for the \0 terminator) rather than a hardcode size constant. Signed-off-by: Ian Rogers <irogers@google.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Acked-by: Quentin Monnet <quentin@isovalent.com> Link: https://lore.kernel.org/bpf/20231007044439.25171-2-irogers@google.com
1 parent 23671f4 commit 1be84ca

File tree

1 file changed

+23
-20
lines changed

1 file changed

+23
-20
lines changed

tools/bpf/bpftool/gen.c

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -708,17 +708,22 @@ static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *h
708708

709709
codegen("\
710710
\n\
711-
skel->%1$s = skel_prep_map_data((void *)\"\\ \n\
712-
", ident);
711+
{ \n\
712+
static const char data[] __attribute__((__aligned__(8))) = \"\\\n\
713+
");
713714
mmap_data = bpf_map__initial_value(map, &mmap_size);
714715
print_hex(mmap_data, mmap_size);
715716
codegen("\
716717
\n\
717-
\", %1$zd, %2$zd); \n\
718-
if (!skel->%3$s) \n\
719-
goto cleanup; \n\
720-
skel->maps.%3$s.initial_value = (__u64) (long) skel->%3$s;\n\
721-
", bpf_map_mmap_sz(map), mmap_size, ident);
718+
\"; \n\
719+
\n\
720+
skel->%1$s = skel_prep_map_data((void *)data, %2$zd,\n\
721+
sizeof(data) - 1);\n\
722+
if (!skel->%1$s) \n\
723+
goto cleanup; \n\
724+
skel->maps.%1$s.initial_value = (__u64) (long) skel->%1$s;\n\
725+
} \n\
726+
", ident, bpf_map_mmap_sz(map));
722727
}
723728
codegen("\
724729
\n\
@@ -733,32 +738,30 @@ static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *h
733738
{ \n\
734739
struct bpf_load_and_run_opts opts = {}; \n\
735740
int err; \n\
736-
\n\
737-
opts.ctx = (struct bpf_loader_ctx *)skel; \n\
738-
opts.data_sz = %2$d; \n\
739-
opts.data = (void *)\"\\ \n\
741+
static const char opts_data[] __attribute__((__aligned__(8))) = \"\\\n\
740742
",
741-
obj_name, opts.data_sz);
743+
obj_name);
742744
print_hex(opts.data, opts.data_sz);
743745
codegen("\
744746
\n\
745747
\"; \n\
748+
static const char opts_insn[] __attribute__((__aligned__(8))) = \"\\\n\
746749
");
747-
748-
codegen("\
749-
\n\
750-
opts.insns_sz = %d; \n\
751-
opts.insns = (void *)\"\\ \n\
752-
",
753-
opts.insns_sz);
754750
print_hex(opts.insns, opts.insns_sz);
755751
codegen("\
756752
\n\
757753
\"; \n\
754+
\n\
755+
opts.ctx = (struct bpf_loader_ctx *)skel; \n\
756+
opts.data_sz = sizeof(opts_data) - 1; \n\
757+
opts.data = (void *)opts_data; \n\
758+
opts.insns_sz = sizeof(opts_insn) - 1; \n\
759+
opts.insns = (void *)opts_insn; \n\
760+
\n\
758761
err = bpf_load_and_run(&opts); \n\
759762
if (err < 0) \n\
760763
return err; \n\
761-
", obj_name);
764+
");
762765
bpf_object__for_each_map(map, obj) {
763766
const char *mmap_flags;
764767

0 commit comments

Comments
 (0)