The RV64 JIT now supports the private stack. Allow the existing verifier and struct_ops private-stack tests to run on riscv64 and add the expected RV64 JITed instruction patterns. Signed-off-by: Chen Pei --- .../bpf/prog_tests/struct_ops_private_stack.c | 3 +- .../bpf/progs/verifier_private_stack.c | 41 ++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/struct_ops_private_stack.c b/tools/testing/selftests/bpf/prog_tests/struct_ops_private_stack.c index 2b3ec2b79091..103179ff8733 100644 --- a/tools/testing/selftests/bpf/prog_tests/struct_ops_private_stack.c +++ b/tools/testing/selftests/bpf/prog_tests/struct_ops_private_stack.c @@ -6,7 +6,8 @@ #include "struct_ops_private_stack_recur.skel.h" #include "struct_ops_private_stack_large.skel.h" -#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__) +#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__) || \ + (defined(__riscv) && __riscv_xlen == 64) static void test_private_stack(void) { struct struct_ops_private_stack *skel; diff --git a/tools/testing/selftests/bpf/progs/verifier_private_stack.c b/tools/testing/selftests/bpf/progs/verifier_private_stack.c index 3d9994a52464..d9cebbc7355d 100644 --- a/tools/testing/selftests/bpf/progs/verifier_private_stack.c +++ b/tools/testing/selftests/bpf/progs/verifier_private_stack.c @@ -8,7 +8,8 @@ /* From include/linux/filter.h */ #define MAX_BPF_STACK 512 -#if defined(__TARGET_ARCH_x86) || defined(__TARGET_ARCH_arm64) +#if defined(__TARGET_ARCH_x86) || defined(__TARGET_ARCH_arm64) || \ + (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64) struct elem { struct bpf_timer t; @@ -42,6 +43,14 @@ __jited(" mov x0, #0x2a") __jited(" str x0, [x27]") __jited("...") __jited(" ldp x25, x27, [sp], {{.*}}") +__arch_riscv64 +__jited(" addi sp, sp, -0x20") +__jited("...") +__jited(" sd s5, 0x10(sp)") +__jited("...") +__jited(" sd a0, -0x100(s5)") +__jited("...") +__jited(" ld s5, 0x10(sp)") __naked void private_stack_single_prog(void) { asm volatile (" \ @@ -60,6 +69,10 @@ __jited(" subq $0x8, %rsp") __arch_arm64 __jited(" mov x25, sp") __jited(" sub sp, sp, #0x10") +__arch_riscv64 +__jited(" addi sp, sp, -0x30") +__jited("...") +__jited(" addi s5, sp, 0x10") __naked void no_private_stack_nested(void) { asm volatile (" \ @@ -113,6 +126,14 @@ __jited(" str x0, [x27]") __jited(" bl {{.*}}") __jited("...") __jited(" ldp x25, x27, [sp], {{.*}}") +__arch_riscv64 +__jited(" addi sp, sp, -0x20") +__jited("...") +__jited(" sd s5, 0x8(sp)") +__jited("...") +__jited(" sd a0, -0x200(s5)") +__jited("...") +__jited(" ld s5, 0x8(sp)") __naked void private_stack_nested_1(void) { asm volatile (" \ @@ -183,6 +204,16 @@ __jited(" bl 0x{{.*}}") __jited(" mov x8, x0") __jited(" mov x8, #0x0") __jited(" ldp x25, x27, [sp], {{.*}}") +__arch_riscv64 +__jited("func #1") +__jited("...") +__jited(" addi sp, sp, -0x20") +__jited("...") +__jited(" sd s5, 0x8(sp)") +__jited("...") +__jited(" sd a0, -0x200(s5)") +__jited("...") +__jited(" ld s5, 0x8(sp)") __naked void private_stack_callback(void) { asm volatile (" \ @@ -313,6 +344,10 @@ __arch_arm64 __jited(" mrs x10, TPIDR_EL{{[0-1]}}") __jited(" add x27, x27, x10") __jited(" add x25, x27, {{.*}}") +__arch_riscv64 +__jited(" addi sp, sp, -0x20") +__jited("...") +__jited(" sd s5, 0x8(sp)") int private_stack_async_callback_1(void) { struct bpf_timer *arr_timer; @@ -342,6 +377,10 @@ __arch_x86_64 __jited(" subq $0x100, %rsp") __arch_arm64 __jited(" sub sp, sp, #0x100") +__arch_riscv64 +__jited(" addi sp, sp, -0x120") +__jited("...") +__jited(" addi s5, sp, 0x100") int private_stack_async_callback_2(void) { struct bpf_timer *arr_timer; -- 2.50.1