Skip to content

Commit aa01d13

Browse files
committed
Merge branch 'fix-accessing-first-syscall-argument-on-rv64'
Pu Lehui says: ==================== Fix accessing first syscall argument on RV64 On RV64, as Ilya mentioned before [0], the first syscall parameter should be accessed through orig_a0 (see arch/riscv64/include/asm/syscall.h), otherwise it will cause selftests like bpf_syscall_macro, vmlinux, test_lsm, etc. to fail on RV64. Link: https://lore.kernel.org/bpf/[email protected] [0] v3: - Fix test case error. v2: https://lore.kernel.org/all/[email protected]/ - Access first syscall argument with CO-RE direct read. (Andrii) v1: https://lore.kernel.org/all/[email protected]/ ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Andrii Nakryiko <[email protected]>
2 parents eff5b5f + 9985742 commit aa01d13

File tree

3 files changed

+12
-11
lines changed

3 files changed

+12
-11
lines changed

tools/lib/bpf/bpf_tracing.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@
163163

164164
struct pt_regs___s390 {
165165
unsigned long orig_gpr2;
166-
};
166+
} __attribute__((preserve_access_index));
167167

168168
/* s390 provides user_pt_regs instead of struct pt_regs to userspace */
169169
#define __PT_REGS_CAST(x) ((const user_pt_regs *)(x))
@@ -179,7 +179,7 @@ struct pt_regs___s390 {
179179
#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG
180180
#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG
181181
#define __PT_PARM6_SYSCALL_REG gprs[7]
182-
#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x)
182+
#define PT_REGS_PARM1_SYSCALL(x) (((const struct pt_regs___s390 *)(x))->__PT_PARM1_SYSCALL_REG)
183183
#define PT_REGS_PARM1_CORE_SYSCALL(x) \
184184
BPF_CORE_READ((const struct pt_regs___s390 *)(x), __PT_PARM1_SYSCALL_REG)
185185

@@ -222,7 +222,7 @@ struct pt_regs___s390 {
222222

223223
struct pt_regs___arm64 {
224224
unsigned long orig_x0;
225-
};
225+
} __attribute__((preserve_access_index));
226226

227227
/* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */
228228
#define __PT_REGS_CAST(x) ((const struct user_pt_regs *)(x))
@@ -241,7 +241,7 @@ struct pt_regs___arm64 {
241241
#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG
242242
#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG
243243
#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG
244-
#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x)
244+
#define PT_REGS_PARM1_SYSCALL(x) (((const struct pt_regs___arm64 *)(x))->__PT_PARM1_SYSCALL_REG)
245245
#define PT_REGS_PARM1_CORE_SYSCALL(x) \
246246
BPF_CORE_READ((const struct pt_regs___arm64 *)(x), __PT_PARM1_SYSCALL_REG)
247247

@@ -351,6 +351,10 @@ struct pt_regs___arm64 {
351351
* https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc#risc-v-calling-conventions
352352
*/
353353

354+
struct pt_regs___riscv {
355+
unsigned long orig_a0;
356+
} __attribute__((preserve_access_index));
357+
354358
/* riscv provides struct user_regs_struct instead of struct pt_regs to userspace */
355359
#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x))
356360
#define __PT_PARM1_REG a0
@@ -362,12 +366,15 @@ struct pt_regs___arm64 {
362366
#define __PT_PARM7_REG a6
363367
#define __PT_PARM8_REG a7
364368

365-
#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG
369+
#define __PT_PARM1_SYSCALL_REG orig_a0
366370
#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG
367371
#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG
368372
#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG
369373
#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG
370374
#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG
375+
#define PT_REGS_PARM1_SYSCALL(x) (((const struct pt_regs___riscv *)(x))->__PT_PARM1_SYSCALL_REG)
376+
#define PT_REGS_PARM1_CORE_SYSCALL(x) \
377+
BPF_CORE_READ((const struct pt_regs___riscv *)(x), __PT_PARM1_SYSCALL_REG)
371378

372379
#define __PT_RET_REG ra
373380
#define __PT_FP_REG s0

tools/testing/selftests/bpf/prog_tests/test_bpf_syscall_macro.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,7 @@ void test_bpf_syscall_macro(void)
3838
/* check whether args of syscall are copied correctly */
3939
prctl(exp_arg1, exp_arg2, exp_arg3, exp_arg4, exp_arg5);
4040

41-
#if defined(__aarch64__) || defined(__s390__)
42-
ASSERT_NEQ(skel->bss->arg1, exp_arg1, "syscall_arg1");
43-
#else
4441
ASSERT_EQ(skel->bss->arg1, exp_arg1, "syscall_arg1");
45-
#endif
4642
ASSERT_EQ(skel->bss->arg2, exp_arg2, "syscall_arg2");
4743
ASSERT_EQ(skel->bss->arg3, exp_arg3, "syscall_arg3");
4844
/* it cannot copy arg4 when uses PT_REGS_PARM4 on x86_64 */

tools/testing/selftests/bpf/progs/bpf_syscall_macro.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ int BPF_KPROBE(handle_sys_prctl)
4343

4444
/* test for PT_REGS_PARM */
4545

46-
#if !defined(bpf_target_arm64) && !defined(bpf_target_s390)
4746
bpf_probe_read_kernel(&tmp, sizeof(tmp), &PT_REGS_PARM1_SYSCALL(real_regs));
48-
#endif
4947
arg1 = tmp;
5048
bpf_probe_read_kernel(&arg2, sizeof(arg2), &PT_REGS_PARM2_SYSCALL(real_regs));
5149
bpf_probe_read_kernel(&arg3, sizeof(arg3), &PT_REGS_PARM3_SYSCALL(real_regs));

0 commit comments

Comments
 (0)