aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib/bpf
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2022-04-07 23:44:10 +0200
committerAndrii Nakryiko <andrii@kernel.org>2022-04-07 20:59:10 -0700
commit6f403d9d530635f533577d37929c61474d6c5d7f (patch)
tree5fbfede8553008d503ceb38367cbf286ff453318 /tools/lib/bpf
parentlibbpf: Minor style improvements in USDT code (diff)
downloadlinux-dev-6f403d9d530635f533577d37929c61474d6c5d7f.tar.xz
linux-dev-6f403d9d530635f533577d37929c61474d6c5d7f.zip
libbpf: Make BPF-side of USDT support work on big-endian machines
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
Diffstat (limited to 'tools/lib/bpf')
-rw-r--r--tools/lib/bpf/usdt.bpf.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/tools/lib/bpf/usdt.bpf.h b/tools/lib/bpf/usdt.bpf.h
index 420d743734e1..881a2422a8ef 100644
--- a/tools/lib/bpf/usdt.bpf.h
+++ b/tools/lib/bpf/usdt.bpf.h
@@ -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;