On 08/05/2025 14:22, Alan Maguire wrote: > In the kernel we occasionally find empty structs as parameters to > functions, usually because some arch-specific field(s) are not present. > Ensure that when such structs are used as parameters to functions we > handle the fact that no registers are used in their representation. > > Deliberately not using a Fixes: tag here because for this to be useful > we need a more recent pahole with [1]. > apologies, this isn't quite right; we had exceptions in pahole encoding ensuring struct parameters didn't require strict parameter/register matching, it's just that moving to a size-based determination in the v1 of Tony's patch left zero-sized structs out. So we should probably mention Fixes: 34586d29f8df ("libbpf: Add new BPF_PROG2 macro") > [1] https://lore.kernel.org/dwarves/20250502070318.1561924-1-tony.ambardar@xxxxxxxxx/ > > Signed-off-by: Alan Maguire <alan.maguire@xxxxxxxxxx> > --- > tools/lib/bpf/bpf_tracing.h | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/tools/lib/bpf/bpf_tracing.h b/tools/lib/bpf/bpf_tracing.h > index a8f6cd4841b0..7629650251dc 100644 > --- a/tools/lib/bpf/bpf_tracing.h > +++ b/tools/lib/bpf/bpf_tracing.h > @@ -694,12 +694,13 @@ ____##name(unsigned long long *ctx, ##args) > #endif > > #define ___bpf_treg_cnt(t) \ > + __builtin_choose_expr(sizeof(t) == 0, 0, \ > __builtin_choose_expr(sizeof(t) == 1, 1, \ > __builtin_choose_expr(sizeof(t) == 2, 1, \ > __builtin_choose_expr(sizeof(t) == 4, 1, \ > __builtin_choose_expr(sizeof(t) == 8, 1, \ > __builtin_choose_expr(sizeof(t) == 16, 2, \ > - (void)0))))) > + (void)0)))))) > > #define ___bpf_reg_cnt0() (0) > #define ___bpf_reg_cnt1(t, x) (___bpf_reg_cnt0() + ___bpf_treg_cnt(t)) > @@ -717,12 +718,13 @@ ____##name(unsigned long long *ctx, ##args) > #define ___bpf_reg_cnt(args...) ___bpf_apply(___bpf_reg_cnt, ___bpf_narg2(args))(args) > > #define ___bpf_union_arg(t, x, n) \ > + __builtin_choose_expr(sizeof(t) == 0, ({ t ___t; ___t; }), \ > __builtin_choose_expr(sizeof(t) == 1, ({ union { __u8 z[1]; t x; } ___t = { .z = {ctx[n]}}; ___t.x; }), \ > __builtin_choose_expr(sizeof(t) == 2, ({ union { __u16 z[1]; t x; } ___t = { .z = {ctx[n]} }; ___t.x; }), \ > __builtin_choose_expr(sizeof(t) == 4, ({ union { __u32 z[1]; t x; } ___t = { .z = {ctx[n]} }; ___t.x; }), \ > __builtin_choose_expr(sizeof(t) == 8, ({ union { __u64 z[1]; t x; } ___t = {.z = {ctx[n]} }; ___t.x; }), \ > __builtin_choose_expr(sizeof(t) == 16, ({ union { __u64 z[2]; t x; } ___t = {.z = {ctx[n], ctx[n + 1]} }; ___t.x; }), \ > - (void)0))))) > + (void)0)))))) > > #define ___bpf_ctx_arg0(n, args...) > #define ___bpf_ctx_arg1(n, t, x) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt1(t, x))