libbpf: Make BPF-side of USDT support work on big-endian machines
authorIlya Leoshkevich <iii@linux.ibm.com>
Thu, 7 Apr 2022 21:44:10 +0000 (23:44 +0200)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 8 Apr 2022 03:59:10 +0000 (20:59 -0700)
BPF_USDT_ARG_REG_DEREF handling always reads 8 bytes, regardless of
the actual argument size. On little-endian the relevant argument bits
end up in the lower bits of val, and later on the code that handles
all the argument types expects them to be there.

On big-endian they end up in the upper bits of val, breaking that
expectation. Fix by right-shifting val on big-endian.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20220407214411.257260-3-iii@linux.ibm.com
tools/lib/bpf/usdt.bpf.h

index 420d743734e12e094a8b8767352f655667715bd3..881a2422a8efb8765d33dbf4fcb48e6907bf4533 100644 (file)
@@ -177,6 +177,9 @@ int bpf_usdt_arg(struct pt_regs *ctx, __u64 arg_num, long *res)
                err = bpf_probe_read_user(&val, sizeof(val), (void *)val + arg_spec->val_off);
                if (err)
                        return err;
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+               val >>= arg_spec->arg_bitshift;
+#endif
                break;
        default:
                return -EINVAL;