From: Siddharth Chintamaneni <sidchintamaneni@gmail.com>
To: bpf@vger.kernel.org
Cc: Siddharth Chintamaneni <sidchintamaneni@gmail.com>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
John Fastabend <john.fastabend@gmail.com>,
Andrii Nakryiko <andrii@kernel.org>,
Eduard Zingerman <eddyz87@gmail.com>,
Kumar Kartikeya Dwivedi <memxor@gmail.com>,
Martin KaFai Lau <martin.lau@linux.dev>,
Song Liu <song@kernel.org>,
Yonghong Song <yonghong.song@linux.dev>,
Jiri Olsa <jolsa@kernel.org>,
Emil Tsalapatis <emil@etsalapatis.com>,
Ihor Solodrai <ihor.solodrai@linux.dev>,
Anton Protopopov <a.s.protopopov@gmail.com>,
Puranjay Mohan <puranjay@kernel.org>,
rachelmenge@gmail.com, hargar@microsoft.com, apais@microsoft.com
Subject: [PATCH bpf-next v1 2/2] selftests/bpf: Add compiler-layout terminal gotox test
Date: Sun, 30 Aug 2026 07:31:25 +0000 [thread overview]
Message-ID: <20260830073125.360934-2-sidchintamaneni@gmail.com> (raw)
In-Reply-To: <20260830073125.360934-1-sidchintamaneni@gmail.com>
Add coverage for the instruction layout emitted by LLVM for a computed
goto. The jump-table targets precede the dispatch block and gotox is the
final instruction in the subprogram.
An equivalent unoptimized C source is:
int bpf_prog_trigger_syscall_prog(void *ctx)
{
__label__ l1, l2;
void *tgt;
int ret = 0;
if (ctx)
tgt = &&l1;
else
tgt = &&l2;
goto *tgt;
l1:
ret += 1;
l2:
ret += 2;
return 0;
}
Tested:
#646/5 verifier_gotox/jump_table_compiler_layout:OK
#646 verifier_gotox:OK
Summary: 1/28 PASSED, 0 SKIPPED, 0/0 FAILED
Signed-off-by: Siddharth Chintamaneni <sidchintamaneni@gmail.com>
---
.../selftests/bpf/progs/verifier_gotox.c | 55 +++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/tools/testing/selftests/bpf/progs/verifier_gotox.c b/tools/testing/selftests/bpf/progs/verifier_gotox.c
index 5b18c9a27717..0ea445287175 100644
--- a/tools/testing/selftests/bpf/progs/verifier_gotox.c
+++ b/tools/testing/selftests/bpf/progs/verifier_gotox.c
@@ -47,6 +47,61 @@ DEFINE_SIMPLE_JUMP_TABLE_PROG(reserved_field_src_reg, BPF_REG_1, 0, 0, __fa
DEFINE_SIMPLE_JUMP_TABLE_PROG(reserved_field_non_zero_off, BPF_REG_0, 1, 0, __failure __msg("BPF_JA|BPF_X uses reserved fields"))
DEFINE_SIMPLE_JUMP_TABLE_PROG(reserved_field_non_zero_imm, BPF_REG_0, 0, 1, __failure __msg("BPF_JA|BPF_X uses reserved fields"))
+SEC("socket")
+__success __retval(0)
+__naked void jump_table_compiler_layout(void)
+{
+ asm volatile (" \
+ .pushsection .jumptables,\"\",@progbits; \
+jt_l1_%=: \
+ .quad l1_%= - socket; \
+ .size jt_l1_%=, 8; \
+ .global jt_l1_%=; \
+jt_l2_%=: \
+ .quad l2_%= - socket; \
+ .size jt_l2_%=, 8; \
+ .global jt_l2_%=; \
+ .popsection; \
+ \
+ *(u64 *)(r10 - 8) = r1; \
+ *(u32 *)(r10 - 20) = 0; \
+ r1 = *(u64 *)(r10 - 8); \
+ if r1 == 0 goto select_l2_%=; \
+ goto select_l1_%=; \
+select_l1_%=: \
+ r1 = jt_l1_%= ll; \
+ r1 = *(u64 *)(r1 + 0); \
+ *(u64 *)(r10 - 16) = r1; \
+ goto selected_%=; \
+select_l2_%=: \
+ r1 = jt_l2_%= ll; \
+ r1 = *(u64 *)(r1 + 0); \
+ *(u64 *)(r10 - 16) = r1; \
+ goto selected_%=; \
+selected_%=: \
+ r1 = *(u64 *)(r10 - 16); \
+ *(u64 *)(r10 - 32) = r1; \
+ goto dispatch_%=; \
+l1_%=: \
+ w1 = *(u32 *)(r10 - 20); \
+ w1 += 1; \
+ *(u32 *)(r10 - 20) = w1; \
+ goto l2_%=; \
+l2_%=: \
+ w1 = *(u32 *)(r10 - 20); \
+ w1 += 2; \
+ *(u32 *)(r10 - 20) = w1; \
+ w0 = 0; \
+ exit; \
+dispatch_%=: \
+ r1 = *(u64 *)(r10 - 32); \
+ .8byte %[gotox_r1]; \
+" :
+ : __imm_insn(gotox_r1, BPF_RAW_INSN(BPF_JMP | BPF_JA | BPF_X,
+ BPF_REG_1, 0, 0, 0))
+ : __clobber_all);
+}
+
/*
* Gotox is forbidden when there is no jump table loaded
* which points to the sub-function where the gotox is used
--
2.43.0
next prev parent reply other threads:[~2026-08-30 7:31 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-30 7:31 [PATCH bpf-next v1 1/2] bpf: allow terminal gotox instructions Siddharth Chintamaneni
2026-08-30 7:31 ` Siddharth Chintamaneni [this message]
2026-08-31 12:34 ` [PATCH bpf-next v1 2/2] selftests/bpf: Add compiler-layout terminal gotox test Anton Protopopov
2026-08-30 7:45 ` [PATCH bpf-next v1 1/2] bpf: allow terminal gotox instructions sashiko-bot
2026-08-30 8:34 ` bot+bpf-ci
2026-08-31 12:21 ` Anton Protopopov
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=20260830073125.360934-2-sidchintamaneni@gmail.com \
--to=sidchintamaneni@gmail.com \
--cc=a.s.protopopov@gmail.com \
--cc=andrii@kernel.org \
--cc=apais@microsoft.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=emil@etsalapatis.com \
--cc=hargar@microsoft.com \
--cc=ihor.solodrai@linux.dev \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=puranjay@kernel.org \
--cc=rachelmenge@gmail.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.