From: Vineet Gupta <vineet.gupta@linux.dev>
To: bpf@vger.kernel.org
Cc: ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
eddyz87@gmail.com, memxor@gmail.com, martin.lau@linux.dev,
song@kernel.org, yonghong.song@linux.dev, jolsa@kernel.org,
emil@etsalapatis.com, ihor.solodrai@linux.dev,
john.fastabend@gmail.com, shuah@kernel.org,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
jose.marchesi@oracle.com, david.faust@oss.qualcomm.com,
Vineet Gupta <vineet.gupta@linux.dev>
Subject: [PATCH bpf-next v4 4/8] selftests/bpf: spell the addr_space_cast address spaces in decimal
Date: Tue, 3 Nov 2026 10:18:12 -0800 [thread overview]
Message-ID: <20261103181816.254686-5-vineet.gupta@linux.dev> (raw)
In-Reply-To: <20261103181816.254686-1-vineet.gupta@linux.dev>
The inline asm in the arena tests writes the two address spaces of
addr_space_cast() in hex which trips up a GNU assembler bug:
progs/jit_insns_arena.c:49: Error: unrecognized instruction `r7 =addr_space_cast(r7,0x0,0x1)'
progs/jit_insns_arena.c:49: Error: expected ',', got 'x'
This has been fixed and landed binutils commit 835aee81fa93 ("bpf: accept
any spelling of the addr_space_cast address spaces"), but will only land
in the 2.47 release, so add the workarounds for now.
A GCC that defines __BPF_FEATURE_ADDR_SPACE_CAST would be paired with
a capable binutils.
No functional change.
Signed-off-by: Vineet Gupta <vineet.gupta@linux.dev>
---
v3 -> v4: new patch.
.../selftests/bpf/progs/arena_atomics.c | 32 +++++++++----------
.../selftests/bpf/progs/jit_insns_arena.c | 8 ++---
.../selftests/bpf/progs/verifier_arena.c | 16 +++++-----
.../selftests/bpf/progs/verifier_hmul_arena.c | 4 +--
.../selftests/bpf/progs/verifier_ldsx.c | 10 +++---
5 files changed, 35 insertions(+), 35 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/arena_atomics.c b/tools/testing/selftests/bpf/progs/arena_atomics.c
index ce76a73d197b..2a9664f54399 100644
--- a/tools/testing/selftests/bpf/progs/arena_atomics.c
+++ b/tools/testing/selftests/bpf/progs/arena_atomics.c
@@ -227,11 +227,11 @@ int fetch_r0(const void *ctx)
#if defined(ENABLE_ATOMICS_TESTS) && defined(__BPF_FEATURE_ADDR_SPACE_CAST)
asm volatile (
"r1 = %[fetch_src_r0_value] ll;"
- "r1 = addr_space_cast(r1, 0x0, 0x1);"
+ "r1 = addr_space_cast(r1, 0, 1);"
"r0 = 0x1100000011 ll;"
".8byte %[fetch_src_r0_insn];"
"r2 = %[fetch_src_r0_result] ll;"
- "r2 = addr_space_cast(r2, 0x0, 0x1);"
+ "r2 = addr_space_cast(r2, 0, 1);"
"*(u64 *)(r2 + 0) = r0;"
:
: __imm_addr(fetch_src_r0_value),
@@ -242,16 +242,16 @@ int fetch_r0(const void *ctx)
asm volatile (
"r0 = %[fetch_dst_r0_value] ll;"
- "r0 = addr_space_cast(r0, 0x0, 0x1);"
+ "r0 = addr_space_cast(r0, 0, 1);"
"r1 = 0x1100000011 ll;"
".8byte %[fetch_dst_r0_insn];"
"r2 = %[fetch_dst_r0_result] ll;"
- "r2 = addr_space_cast(r2, 0x0, 0x1);"
+ "r2 = addr_space_cast(r2, 0, 1);"
"*(u64 *)(r2 + 0) = r1;"
/* r0 is only read by the atomic, so it must still be the pointer. */
"r3 = *(u64 *)(r0 + 0);"
"r2 = %[fetch_dst_r0_readback] ll;"
- "r2 = addr_space_cast(r2, 0x0, 0x1);"
+ "r2 = addr_space_cast(r2, 0, 1);"
"*(u64 *)(r2 + 0) = r3;"
:
: __imm_addr(fetch_dst_r0_value),
@@ -363,17 +363,17 @@ int uaf(const void *ctx)
asm volatile (
"r0 = %[page];"
"r0 += 4096;"
- "r0 = addr_space_cast(r0, 0x0, 0x1);"
+ "r0 = addr_space_cast(r0, 0, 1);"
"r1 = 1;"
"r2 = %[uaf_r0_before_dst_r0] ll;"
- "r2 = addr_space_cast(r2, 0x0, 0x1);"
+ "r2 = addr_space_cast(r2, 0, 1);"
"*(u64 *)(r2 + 0) = r0;"
".8byte %[fetch_dst_r0];"
"r2 = %[uaf_r0_after_dst_r0] ll;"
- "r2 = addr_space_cast(r2, 0x0, 0x1);"
+ "r2 = addr_space_cast(r2, 0, 1);"
"*(u64 *)(r2 + 0) = r0;"
"r2 = %[uaf_r1_after_dst_r0] ll;"
- "r2 = addr_space_cast(r2, 0x0, 0x1);"
+ "r2 = addr_space_cast(r2, 0, 1);"
"*(u64 *)(r2 + 0) = r1;"
: : [page]"r"(page64),
__imm_insn(fetch_dst_r0,
@@ -387,11 +387,11 @@ int uaf(const void *ctx)
asm volatile (
"r1 = %[page];"
"r1 += 4096;"
- "r1 = addr_space_cast(r1, 0x0, 0x1);"
+ "r1 = addr_space_cast(r1, 0, 1);"
"r0 = 1;"
".8byte %[fetch_src_r0];"
"r2 = %[uaf_r0_after_src_r0] ll;"
- "r2 = addr_space_cast(r2, 0x0, 0x1);"
+ "r2 = addr_space_cast(r2, 0, 1);"
"*(u64 *)(r2 + 0) = r0;"
: : [page]"r"(page64),
__imm_insn(fetch_src_r0,
@@ -409,10 +409,10 @@ int uaf(const void *ctx)
asm volatile (
"r1 = %[page];"
"r1 += 4096;"
- "r1 = addr_space_cast(r1, 0x0, 0x1);"
+ "r1 = addr_space_cast(r1, 0, 1);"
"r3 = *(u64 *)(r1 + 0);"
"r2 = %[uaf_reread] ll;"
- "r2 = addr_space_cast(r2, 0x0, 0x1);"
+ "r2 = addr_space_cast(r2, 0, 1);"
"*(u64 *)(r2 + 0) = r3;"
: : [page]"r"(page64),
__imm_addr(uaf_reread)
@@ -460,10 +460,10 @@ int load_acquire(const void *ctx)
#define LOAD_ACQUIRE_ARENA(SIZEOP, SIZE, SRC, DST) \
{ asm volatile ( \
"r1 = %[" #SRC "] ll;" \
- "r1 = addr_space_cast(r1, 0x0, 0x1);" \
+ "r1 = addr_space_cast(r1, 0, 1);" \
".8byte %[load_acquire_insn];" \
"r3 = %[" #DST "] ll;" \
- "r3 = addr_space_cast(r3, 0x0, 0x1);" \
+ "r3 = addr_space_cast(r3, 0, 1);" \
"*(" #SIZE " *)(r3 + 0) = r2;" \
: \
: __imm_addr(SRC), \
@@ -515,7 +515,7 @@ int store_release(const void *ctx)
{ asm volatile ( \
"r1 = " VAL ";" \
"r2 = %[" #DST "] ll;" \
- "r2 = addr_space_cast(r2, 0x0, 0x1);" \
+ "r2 = addr_space_cast(r2, 0, 1);" \
".8byte %[store_release_insn];" \
: \
: __imm_addr(DST), \
diff --git a/tools/testing/selftests/bpf/progs/jit_insns_arena.c b/tools/testing/selftests/bpf/progs/jit_insns_arena.c
index 95736eae2a58..997a897d66eb 100644
--- a/tools/testing/selftests/bpf/progs/jit_insns_arena.c
+++ b/tools/testing/selftests/bpf/progs/jit_insns_arena.c
@@ -47,7 +47,7 @@ int arena_zero_off(void *ctx)
/* Accesses through two base registers */
asm volatile (" \
r7 = %[res]; \
- r7 = addr_space_cast(r7, 0x0, 0x1); \
+ r7 = addr_space_cast(r7, 0, 1); \
r1 = r7; \
r8 = 0x1122334455667788 ll; \
*(u64 *)(r7 + 0) = r8; \
@@ -93,12 +93,12 @@ int cast_to_user(void *ctx)
/* The user address comes back from the kernel one, NULL stays NULL */
asm volatile (" \
r7 = %[page]; \
- r1 = addr_space_cast(r7, 0x0, 0x1); \
- r1 = addr_space_cast(r1, 0x1, 0x0); \
+ r1 = addr_space_cast(r7, 0, 1); \
+ r1 = addr_space_cast(r1, 1, 0); \
r9 = r1; \
r9 ^= r7; \
r2 = 0; \
- r2 = addr_space_cast(r2, 0x1, 0x0); \
+ r2 = addr_space_cast(r2, 1, 0); \
r9 |= r2; \
%[res] = r9; \
" : [res]"=r"(res)
diff --git a/tools/testing/selftests/bpf/progs/verifier_arena.c b/tools/testing/selftests/bpf/progs/verifier_arena.c
index b17a6dfc100d..9b149c724160 100644
--- a/tools/testing/selftests/bpf/progs/verifier_arena.c
+++ b/tools/testing/selftests/bpf/progs/verifier_arena.c
@@ -524,7 +524,7 @@ int scalar_add_arena_ptr(void *ctx)
asm volatile (
"%[arena_ptr] = 8192;"
- "%[arena_ptr] = addr_space_cast(%[arena_ptr], 0x0, 0x1);"
+ "%[arena_ptr] = addr_space_cast(%[arena_ptr], 0, 1);"
"%[scalar] = 12;"
"%[scalar] += %[arena_ptr];"
: [scalar] "=r"(scalar),
@@ -549,9 +549,9 @@ int arena_ptr_add_arena_ptr(void *ctx)
asm volatile (
"%[arena_ptr1] = 8192;"
- "%[arena_ptr1] = addr_space_cast(%[arena_ptr1], 0x0, 0x1);"
+ "%[arena_ptr1] = addr_space_cast(%[arena_ptr1], 0, 1);"
"%[arena_ptr2] = 4096;"
- "%[arena_ptr2] = addr_space_cast(%[arena_ptr2], 0x0, 0x1);"
+ "%[arena_ptr2] = addr_space_cast(%[arena_ptr2], 0, 1);"
"%[arena_ptr2] += %[arena_ptr1];"
: [arena_ptr2] "=r"(arena_ptr2),
[arena_ptr1] "=&r"(arena_ptr1)
@@ -574,7 +574,7 @@ int mixed_arena_scalar_alu64_scalar_first(void *ctx)
asm volatile (
"r9 = %[arena] ll;"
"%[reg] = 0;"
- "%[reg] = addr_space_cast(%[reg], 0x0, 0x1);"
+ "%[reg] = addr_space_cast(%[reg], 0, 1);"
: [reg] "=r"(reg)
: __imm_addr(arena)
: "r9"
@@ -596,7 +596,7 @@ int mixed_arena_scalar_alu64_arena_first(void *ctx)
asm volatile (
"r9 = %[arena] ll;"
"%[reg] = 0;"
- "%[reg] = addr_space_cast(%[reg], 0x0, 0x1);"
+ "%[reg] = addr_space_cast(%[reg], 0, 1);"
: [reg] "=r"(reg)
: __imm_addr(arena)
: "r9"
@@ -635,7 +635,7 @@ int scalar_xor_arena_ptr(void *ctx)
asm volatile (
"%[arena_ptr] = 8192;"
- "%[arena_ptr] = addr_space_cast(%[arena_ptr], 0x0, 0x1);"
+ "%[arena_ptr] = addr_space_cast(%[arena_ptr], 0, 1);"
"%[scalar] = 12;"
"%[scalar] ^= %[arena_ptr];"
: [scalar] "=r"(scalar),
@@ -660,7 +660,7 @@ int arena_ptr_add_to_non_arena_ptr(void *ctx)
asm volatile (
"%[arena_ptr] = 8192;"
- "%[arena_ptr] = addr_space_cast(%[arena_ptr], 0x0, 0x1);"
+ "%[arena_ptr] = addr_space_cast(%[arena_ptr], 0, 1);"
"%[dst] = %[ctx];"
"%[dst] += %[arena_ptr];"
: [arena_ptr] "=&r"(arena_ptr),
@@ -685,7 +685,7 @@ int non_arena_ptr_add_to_arena_ptr(void *ctx)
asm volatile (
"%[arena_ptr] = 8192;"
- "%[arena_ptr] = addr_space_cast(%[arena_ptr], 0x0, 0x1);"
+ "%[arena_ptr] = addr_space_cast(%[arena_ptr], 0, 1);"
"%[src] = %[ctx];"
"%[arena_ptr] += %[src];"
: [arena_ptr] "=&r"(arena_ptr),
diff --git a/tools/testing/selftests/bpf/progs/verifier_hmul_arena.c b/tools/testing/selftests/bpf/progs/verifier_hmul_arena.c
index a8709ec447aa..b94892fff2f8 100644
--- a/tools/testing/selftests/bpf/progs/verifier_hmul_arena.c
+++ b/tools/testing/selftests/bpf/progs/verifier_hmul_arena.c
@@ -29,7 +29,7 @@ __naked void uhmul64_arena_ptr(void)
asm volatile (
"r1 = %[arena] ll;"
"r0 = 1;"
- "r0 = addr_space_cast(r0, 0x0, 0x1);"
+ "r0 = addr_space_cast(r0, 0, 1);"
".8byte %[hmul];"
"exit;"
:
@@ -48,7 +48,7 @@ __naked void shmul64_arena_ptr(void)
asm volatile (
"r1 = %[arena] ll;"
"r1 = 1;"
- "r1 = addr_space_cast(r1, 0x0, 0x1);"
+ "r1 = addr_space_cast(r1, 0, 1);"
"r0 = 2;"
".8byte %[hmul];"
"exit;"
diff --git a/tools/testing/selftests/bpf/progs/verifier_ldsx.c b/tools/testing/selftests/bpf/progs/verifier_ldsx.c
index 49e8cd4bb4f9..45b2e52fd715 100644
--- a/tools/testing/selftests/bpf/progs/verifier_ldsx.c
+++ b/tools/testing/selftests/bpf/progs/verifier_ldsx.c
@@ -310,7 +310,7 @@ __naked void arena_ldsx_disasm(void *ctx)
"r4 = %[numa_no_node];"
"r5 = 0;"
"call %[bpf_arena_alloc_pages];"
- "r0 = addr_space_cast(r0, 0x0, 0x1);"
+ "r0 = addr_space_cast(r0, 0, 1);"
"r1 = r0;"
"r8 = *(s32 *)(r0 + 16);"
"r8 = *(s16 *)(r0 + 24);"
@@ -338,7 +338,7 @@ __naked void arena_ldsx_exception(void *ctx)
asm volatile (
"r1 = %[arena] ll;"
"r0 = 0xdeadbeef;"
- "r0 = addr_space_cast(r0, 0x0, 0x1);"
+ "r0 = addr_space_cast(r0, 0, 1);"
"r1 = 0x3fe;"
"*(u64 *)(r0 + 0) = r1;"
"r0 = *(s8 *)(r0 + 0);"
@@ -364,7 +364,7 @@ __naked void arena_ldsx_s8(void *ctx)
"r4 = %[numa_no_node];"
"r5 = 0;"
"call %[bpf_arena_alloc_pages];"
- "r0 = addr_space_cast(r0, 0x0, 0x1);"
+ "r0 = addr_space_cast(r0, 0, 1);"
"r1 = 0x3fe;"
"*(u64 *)(r0 + 0) = r1;"
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
@@ -396,7 +396,7 @@ __naked void arena_ldsx_s16(void *ctx)
"r4 = %[numa_no_node];"
"r5 = 0;"
"call %[bpf_arena_alloc_pages];"
- "r0 = addr_space_cast(r0, 0x0, 0x1);"
+ "r0 = addr_space_cast(r0, 0, 1);"
"r1 = 0x3fffe;"
"*(u64 *)(r0 + 0) = r1;"
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
@@ -428,7 +428,7 @@ __naked void arena_ldsx_s32(void *ctx)
"r4 = %[numa_no_node];"
"r5 = 0;"
"call %[bpf_arena_alloc_pages];"
- "r0 = addr_space_cast(r0, 0x0, 0x1);"
+ "r0 = addr_space_cast(r0, 0, 1);"
"r1 = 0xfffffffe;"
"*(u64 *)(r0 + 0) = r1;"
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
--
2.53.0-Meta
next prev parent reply other threads:[~2026-11-03 18:18 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 18:18 [PATCH bpf-next v4 0/8] selftests/bpf: let the arena tests build with GCC Vineet Gupta
2026-11-03 18:18 ` [PATCH bpf-next v4 1/8] selftests/bpf: Build callx tests with GCC that defines __BPF_FEATURE_CALLX Vineet Gupta
2026-11-03 18:18 ` [PATCH bpf-next v4 2/8] selftests/bpf: don't pass clang-only warning flags to GCC Vineet Gupta
2026-11-03 18:18 ` [PATCH bpf-next v4 3/8] selftests/bpf: make arena_base() opaque to GCC's -Warray-bounds Vineet Gupta
2026-11-03 18:18 ` Vineet Gupta [this message]
2026-11-03 18:57 ` [PATCH bpf-next v4 4/8] selftests/bpf: spell the addr_space_cast address spaces in decimal bot+bpf-ci
2026-11-03 18:18 ` [PATCH bpf-next v4 5/8] selftests/bpf: write the mixed arena/scalar ALU tests in asm Vineet Gupta
2026-11-03 18:57 ` bot+bpf-ci
2026-11-03 18:18 ` [PATCH bpf-next v4 6/8] selftests/bpf: drop the arena guards and tag the tests that need arena Vineet Gupta
2026-11-03 18:57 ` bot+bpf-ci
2026-11-03 18:18 ` [PATCH bpf-next v4 7/8] selftests/bpf: cast explicitly in the struct_ops arena triggers Vineet Gupta
2026-11-03 18:18 ` [PATCH bpf-next v4 8/8] selftests/bpf: cast explicitly in the arena subprog and callback faults Vineet Gupta
2026-11-03 21:20 ` [PATCH bpf-next v4 0/8] selftests/bpf: let the arena tests build with GCC patchwork-bot+netdevbpf
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=20261103181816.254686-5-vineet.gupta@linux.dev \
--to=vineet.gupta@linux.dev \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=david.faust@oss.qualcomm.com \
--cc=eddyz87@gmail.com \
--cc=emil@etsalapatis.com \
--cc=ihor.solodrai@linux.dev \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=jose.marchesi@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--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
all inboxes | Powered by JetHome®