Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: Fix test_core_autosize on big-endian machines

The "probed" part of test_core_autosize copies an integer using
bpf_core_read() into an integer of a potentially different size.
On big-endian machines a destination offset is required for this to
produce a sensible result.

Fixes: 888d83b961f6 ("selftests/bpf: Validate libbpf's auto-sizing of LD/ST/STX instructions")
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20210812224814.187460-1-iii@linux.ibm.com

authored by

Ilya Leoshkevich and committed by
Andrii Nakryiko
d164dd9a 2211c825

+15 -5
+15 -5
tools/testing/selftests/bpf/progs/test_core_autosize.c
··· 125 125 return 0; 126 126 } 127 127 128 + #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 129 + #define bpf_core_read_int bpf_core_read 130 + #else 131 + #define bpf_core_read_int(dst, sz, src) ({ \ 132 + /* Prevent "subtraction from stack pointer prohibited" */ \ 133 + volatile long __off = sizeof(*dst) - (sz); \ 134 + bpf_core_read((char *)(dst) + __off, sz, src); \ 135 + }) 136 + #endif 137 + 128 138 SEC("raw_tp/sys_enter") 129 139 int handle_probed(void *ctx) 130 140 { ··· 142 132 __u64 tmp; 143 133 144 134 tmp = 0; 145 - bpf_core_read(&tmp, bpf_core_field_size(in->ptr), &in->ptr); 135 + bpf_core_read_int(&tmp, bpf_core_field_size(in->ptr), &in->ptr); 146 136 ptr_probed = tmp; 147 137 148 138 tmp = 0; 149 - bpf_core_read(&tmp, bpf_core_field_size(in->val1), &in->val1); 139 + bpf_core_read_int(&tmp, bpf_core_field_size(in->val1), &in->val1); 150 140 val1_probed = tmp; 151 141 152 142 tmp = 0; 153 - bpf_core_read(&tmp, bpf_core_field_size(in->val2), &in->val2); 143 + bpf_core_read_int(&tmp, bpf_core_field_size(in->val2), &in->val2); 154 144 val2_probed = tmp; 155 145 156 146 tmp = 0; 157 - bpf_core_read(&tmp, bpf_core_field_size(in->val3), &in->val3); 147 + bpf_core_read_int(&tmp, bpf_core_field_size(in->val3), &in->val3); 158 148 val3_probed = tmp; 159 149 160 150 tmp = 0; 161 - bpf_core_read(&tmp, bpf_core_field_size(in->val4), &in->val4); 151 + bpf_core_read_int(&tmp, bpf_core_field_size(in->val4), &in->val4); 162 152 val4_probed = tmp; 163 153 164 154 return 0;