From: Varun R Mallya <varunrmallya@gmail.com>
To: pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu,
ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
eddyz87@gmail.com, memxor@gmail.com, bjorn@kernel.org,
pulehui@huawei.com
Cc: alex@ghiti.fr, martin.lau@linux.dev, song@kernel.org,
yonghong.song@linux.dev, jolsa@kernel.org, emil@etsalapatis.com,
puranjay@kernel.org, shuah@kernel.org,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
bpf@vger.kernel.org, linux-kselftest@vger.kernel.org,
varunrmallya@gmail.com
Subject: [PATCH bpf-next v2 0/3] Add BPF Exceptions support for RISC-V
Date: Sun, 28 Jun 2026 13:47:07 +0530 [thread overview]
Message-ID: <20260628081710.113333-1-varunrmallya@gmail.com> (raw)
This patchset aims to add BPF exceptions supports for riscv64 by
implementing the arch_bpf_stack_walk function and then updating the
prologue and epilogue for BPF JIT on riscv. Also,
bpf_jit_supports_exceptions() returns true now so that the verifier does
not reject programs containing BPF exceptions on riscv64.
On riscv the unwinder used by arch_bpf_stack_walk() is the frame-pointer
unwinder, so exception support is gated on CONFIG_FRAME_POINTER.
In the prologue and epilogue of the RISC-V JIT, I saved the
return address and then the frame-pointer according to [1]. Also,
according to [2], s0 to s11 are callee saved registers, which is why a
new array (rv_exception_csave_regs) has been created to save these
registers which contains all the required registers along with the frame
pointer as well as return address.
The following demonstrates that all the selftests for BPF exceptions
apart from the ones that mix bpf-to-bpf calls and tailcalls pass.
This patch was tested using vmtest.sh to run the selftests.
test_exceptions_success:PASS:exceptions__open 0 nsec
libbpf: prog 'exception_tail_call': BPF program load failed: -EINVAL
libbpf: prog 'exception_tail_call': -- BEGIN PROG LOAD LOG --
0: R1=ctx() R10=fp0
; volatile int ret = 0; @ exceptions.c:106
0: (b4) w2 = 0 ; R2=0
1: (63) *(u32 *)(r10 -4) = r2 ; R2=0 R10=fp0
; ret = exception_tail_call_subprog(ctx); @ exceptions.c:108
2: (85) call pc+4
caller:
R10=fp0
callee:
frame1: R1=ctx() R2=0 R10=fp0
7: frame1: R1=ctx() R10=fp0
; int exception_tail_call_subprog(struct __sk_buff *ctx) @ exceptions.c:96
7: (bf) r6 = r1 ; frame1: R1=ctx() R6=ctx()
; volatile int ret = 10; @ exceptions.c:98
8: (b4) w1 = 10 ; frame1: R1=10
9: (63) *(u32 *)(r10 -4) = r1 ; frame1: R1=10 R10=fp0 fp-8=mmmm????
; asm volatile("r1 = %[ctx]\n\t" @ bpf_helpers.h:169
10: (18) r7 = 0xff60000080df1800 ; frame1: R7=map_ptr(map=jmp_table,ks=4,vs=4)
12: (bf) r1 = r6 ; frame1: R1=ctx() R6=ctx()
13: (bf) r2 = r7 ; frame1: R2=map_ptr(map=jmp_table,ks=4,vs=4) R7=map_ptr(map=jmp_table,ks=4,vs=4)
14: (b7) r3 = 0 ; frame1: R3=0
15: (85) call bpf_tail_call#12
mixing of tail_calls and bpf-to-bpf calls is not supported
processed 11 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
-- END PROG LOAD LOG --
libbpf: prog 'exception_tail_call': failed to load: -EINVAL
libbpf: failed to load object 'exceptions'
libbpf: failed to load BPF skeleton 'exceptions': -EINVAL
test_exceptions_success:FAIL:exceptions__load unexpected error: -22 (errno 22)
tester_init:PASS:tester_log_buf 0 nsec
process_subtest:PASS:obj_open_mem 0 nsec
process_subtest:PASS:specs_alloc 0 nsec
tester_init:PASS:tester_log_buf 0 nsec
process_subtest:PASS:obj_open_mem 0 nsec
process_subtest:PASS:specs_alloc 0 nsec
#113/1 exceptions/reject_exception_cb_type_1:OK
#113/2 exceptions/reject_exception_cb_type_2:OK
#113/3 exceptions/reject_exception_cb_type_3:OK
#113/4 exceptions/reject_exception_cb_type_4:OK
#113/5 exceptions/reject_exception_cb_type_5:OK
#113/6 exceptions/reject_async_callback_throw:OK
#113/7 exceptions/reject_with_lock:OK
#113/8 exceptions/reject_subprog_with_lock:OK
#113/9 exceptions/reject_with_rcu_read_lock:OK
#113/10 exceptions/reject_subprog_with_rcu_read_lock:OK
#113/11 exceptions/reject_with_rbtree_add_throw:OK
#113/12 exceptions/reject_with_reference:OK
#113/13 exceptions/reject_global_subprog_throw_with_reference:OK
#113/14 exceptions/reject_with_cb_reference:OK
#113/15 exceptions/reject_with_cb:OK
#113/16 exceptions/reject_with_subprog_reference:OK
#113/17 exceptions/reject_throwing_exception_cb:OK
#113/18 exceptions/reject_exception_cb_call_global_func:OK
#113/19 exceptions/reject_exception_cb_call_static_func:OK
#113/20 exceptions/reject_multiple_exception_cb:OK
#113/21 exceptions/reject_exception_throw_cb:OK
#113/22 exceptions/reject_exception_throw_cb_diff:OK
#113/23 exceptions/reject_subprog_rcu_lock_throw:OK
#113/24 exceptions/reject_subprog_throw_preempt_lock:OK
#113/25 exceptions/reject_subprog_throw_irq_lock:OK
#113/26 exceptions/reject_set_exception_cb_bad_ret1:OK
#113/27 exceptions/reject_set_exception_cb_bad_ret2:OK
#113/28 exceptions/reject_out_of_range_global_throw:OK
#113/29 exceptions/check_assert_eq_int_min:OK
#113/30 exceptions/check_assert_eq_int_max:OK
#113/31 exceptions/check_assert_eq_zero:OK
#113/32 exceptions/check_assert_eq_llong_min:OK
#113/33 exceptions/check_assert_eq_llong_max:OK
#113/34 exceptions/check_assert_lt_pos:OK
#113/35 exceptions/check_assert_lt_zero:OK
#113/36 exceptions/check_assert_lt_neg:OK
#113/37 exceptions/check_assert_le_pos:OK
#113/38 exceptions/check_assert_le_zero:OK
#113/39 exceptions/check_assert_le_neg:OK
#113/40 exceptions/check_assert_gt_pos:OK
#113/41 exceptions/check_assert_gt_zero:OK
#113/42 exceptions/check_assert_gt_neg:OK
#113/43 exceptions/check_assert_ge_pos:OK
#113/44 exceptions/check_assert_ge_zero:OK
#113/45 exceptions/check_assert_ge_neg:OK
#113/46 exceptions/check_assert_range_s64:OK
#113/47 exceptions/check_assert_range_u64:OK
#113/48 exceptions/check_assert_single_range_s64:OK
#113/49 exceptions/check_assert_single_range_u64:OK
#113/50 exceptions/check_assert_generic:OK
#113/51 exceptions/check_assert_with_return:OK
#113 exceptions:FAIL
All error logs:
test_exceptions_success:PASS:exceptions__open 0 nsec
libbpf: prog 'exception_tail_call': BPF program load failed: -EINVAL
libbpf: prog 'exception_tail_call': -- BEGIN PROG LOAD LOG --
0: R1=ctx() R10=fp0
; volatile int ret = 0; @ exceptions.c:106
0: (b4) w2 = 0 ; R2=0
1: (63) *(u32 *)(r10 -4) = r2 ; R2=0 R10=fp0
; ret = exception_tail_call_subprog(ctx); @ exceptions.c:108
2: (85) call pc+4
caller:
R10=fp0
callee:
frame1: R1=ctx() R2=0 R10=fp0
7: frame1: R1=ctx() R10=fp0
; int exception_tail_call_subprog(struct __sk_buff *ctx) @ exceptions.c:96
7: (bf) r6 = r1 ; frame1: R1=ctx() R6=ctx()
; volatile int ret = 10; @ exceptions.c:98
8: (b4) w1 = 10 ; frame1: R1=10
9: (63) *(u32 *)(r10 -4) = r1 ; frame1: R1=10 R10=fp0 fp-8=mmmm????
; asm volatile("r1 = %[ctx]\n\t" @ bpf_helpers.h:169
10: (18) r7 = 0xff60000080df1800 ; frame1: R7=map_ptr(map=jmp_table,ks=4,vs=4)
12: (bf) r1 = r6 ; frame1: R1=ctx() R6=ctx()
13: (bf) r2 = r7 ; frame1: R2=map_ptr(map=jmp_table,ks=4,vs=4) R7=map_ptr(map=jmp_table,ks=4,vs=4)
14: (b7) r3 = 0 ; frame1: R3=0
15: (85) call bpf_tail_call#12
mixing of tail_calls and bpf-to-bpf calls is not supported
processed 11 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
-- END PROG LOAD LOG --
libbpf: prog 'exception_tail_call': failed to load: -EINVAL
libbpf: failed to load object 'exceptions'
libbpf: failed to load BPF skeleton 'exceptions': -EINVAL
test_exceptions_success:FAIL:exceptions__load unexpected error: -22 (errno 22)
Changes in v1->v2:
v1: https://lore.kernel.org/bpf/20260621144259.288135-1-varunrmallya@gmail.com/
- resolve the ftrace trampoline address with ftrace_graph_ret_addr()
inside arch_bpf_stack_walk()
- Remove duplicated code in bpf_jit_build_prologue()
[1]: https://riscv-non-isa.github.io/riscv-elf-psabi-doc/#_frame_pointer_convention
[2]: https://riscv-non-isa.github.io/riscv-elf-psabi-doc/#_integer_register_convention
Varun R Mallya (3):
riscv: stacktrace: Implement arch_bpf_stack_walk() for BPF
riscv, bpf: Add support for BPF exceptions
riscv, bpf: Remove BPF exceptions from BPF CI denylist
arch/riscv/kernel/stacktrace.c | 31 +++++
arch/riscv/net/bpf_jit_comp64.c | 115 ++++++++++++++++---
tools/testing/selftests/bpf/DENYLIST.riscv64 | 1 -
3 files changed, 133 insertions(+), 14 deletions(-)
--
2.54.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next reply other threads:[~2026-06-28 8:17 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-28 8:17 Varun R Mallya [this message]
2026-06-28 8:17 ` [PATCH bpf-next v2 1/3] riscv: stacktrace: Implement arch_bpf_stack_walk() for BPF Varun R Mallya
2026-06-28 17:26 ` Björn Töpel
2026-06-29 2:45 ` Pu Lehui
2026-06-28 8:17 ` [PATCH bpf-next v2 2/3] riscv, bpf: Add support for BPF exceptions Varun R Mallya
2026-06-28 17:50 ` Björn Töpel
2026-06-29 3:01 ` Pu Lehui
2026-06-28 8:17 ` [PATCH bpf-next v2 3/3] riscv, bpf: Remove BPF exceptions from BPF CI denylist Varun R Mallya
2026-06-28 18:00 ` Björn Töpel
2026-07-06 8:55 ` Varun R Mallya
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260628081710.113333-1-varunrmallya@gmail.com \
--to=varunrmallya@gmail.com \
--cc=alex@ghiti.fr \
--cc=andrii@kernel.org \
--cc=aou@eecs.berkeley.edu \
--cc=ast@kernel.org \
--cc=bjorn@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=emil@etsalapatis.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=palmer@dabbelt.com \
--cc=pjw@kernel.org \
--cc=pulehui@huawei.com \
--cc=puranjay@kernel.org \
--cc=shuah@kernel.org \
--cc=song@kernel.org \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox