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
This commit is contained in:
parent
23671f4dfd
commit
1be84ca53c
|
@ -708,17 +708,22 @@ static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *h
|
||||||
|
|
||||||
codegen("\
|
codegen("\
|
||||||
\n\
|
\n\
|
||||||
skel->%1$s = skel_prep_map_data((void *)\"\\ \n\
|
{ \n\
|
||||||
", ident);
|
static const char data[] __attribute__((__aligned__(8))) = \"\\\n\
|
||||||
|
");
|
||||||
mmap_data = bpf_map__initial_value(map, &mmap_size);
|
mmap_data = bpf_map__initial_value(map, &mmap_size);
|
||||||
print_hex(mmap_data, mmap_size);
|
print_hex(mmap_data, mmap_size);
|
||||||
codegen("\
|
codegen("\
|
||||||
\n\
|
\n\
|
||||||
\", %1$zd, %2$zd); \n\
|
\"; \n\
|
||||||
if (!skel->%3$s) \n\
|
\n\
|
||||||
|
skel->%1$s = skel_prep_map_data((void *)data, %2$zd,\n\
|
||||||
|
sizeof(data) - 1);\n\
|
||||||
|
if (!skel->%1$s) \n\
|
||||||
goto cleanup; \n\
|
goto cleanup; \n\
|
||||||
skel->maps.%3$s.initial_value = (__u64) (long) skel->%3$s;\n\
|
skel->maps.%1$s.initial_value = (__u64) (long) skel->%1$s;\n\
|
||||||
", bpf_map_mmap_sz(map), mmap_size, ident);
|
} \n\
|
||||||
|
", ident, bpf_map_mmap_sz(map));
|
||||||
}
|
}
|
||||||
codegen("\
|
codegen("\
|
||||||
\n\
|
\n\
|
||||||
|
@ -733,32 +738,30 @@ static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *h
|
||||||
{ \n\
|
{ \n\
|
||||||
struct bpf_load_and_run_opts opts = {}; \n\
|
struct bpf_load_and_run_opts opts = {}; \n\
|
||||||
int err; \n\
|
int err; \n\
|
||||||
\n\
|
static const char opts_data[] __attribute__((__aligned__(8))) = \"\\\n\
|
||||||
opts.ctx = (struct bpf_loader_ctx *)skel; \n\
|
|
||||||
opts.data_sz = %2$d; \n\
|
|
||||||
opts.data = (void *)\"\\ \n\
|
|
||||||
",
|
",
|
||||||
obj_name, opts.data_sz);
|
obj_name);
|
||||||
print_hex(opts.data, opts.data_sz);
|
print_hex(opts.data, opts.data_sz);
|
||||||
codegen("\
|
codegen("\
|
||||||
\n\
|
\n\
|
||||||
\"; \n\
|
\"; \n\
|
||||||
|
static const char opts_insn[] __attribute__((__aligned__(8))) = \"\\\n\
|
||||||
");
|
");
|
||||||
|
|
||||||
codegen("\
|
|
||||||
\n\
|
|
||||||
opts.insns_sz = %d; \n\
|
|
||||||
opts.insns = (void *)\"\\ \n\
|
|
||||||
",
|
|
||||||
opts.insns_sz);
|
|
||||||
print_hex(opts.insns, opts.insns_sz);
|
print_hex(opts.insns, opts.insns_sz);
|
||||||
codegen("\
|
codegen("\
|
||||||
\n\
|
\n\
|
||||||
\"; \n\
|
\"; \n\
|
||||||
|
\n\
|
||||||
|
opts.ctx = (struct bpf_loader_ctx *)skel; \n\
|
||||||
|
opts.data_sz = sizeof(opts_data) - 1; \n\
|
||||||
|
opts.data = (void *)opts_data; \n\
|
||||||
|
opts.insns_sz = sizeof(opts_insn) - 1; \n\
|
||||||
|
opts.insns = (void *)opts_insn; \n\
|
||||||
|
\n\
|
||||||
err = bpf_load_and_run(&opts); \n\
|
err = bpf_load_and_run(&opts); \n\
|
||||||
if (err < 0) \n\
|
if (err < 0) \n\
|
||||||
return err; \n\
|
return err; \n\
|
||||||
", obj_name);
|
");
|
||||||
bpf_object__for_each_map(map, obj) {
|
bpf_object__for_each_map(map, obj) {
|
||||||
const char *mmap_flags;
|
const char *mmap_flags;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue