mirror of
https://github.com/torvalds/linux.git
synced 2026-08-01 20:22:08 +02:00
bpf: Introduce bpf register BPF_REG_PARAMS
Introduce BPF_REG_PARAMS as a dedicated BPF register for stack argument accesses. It occupies the BPF register number 11 (R11), which is used as the base pointer for the stack argument area, keeping it separate from the R10-based (BPF_REG_FP) program stack. The kernel-internal hidden register BPF_REG_AX previously occupied slot 11 (MAX_BPF_REG). With BPF_REG_PARAMS taking that slot, BPF_REG_AX moves to slot 12 and MAX_BPF_EXT_REG increases accordingly. Acked-by: Puranjay Mohan <puranjay@kernel.org> Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Signed-off-by: Yonghong Song <yonghong.song@linux.dev> Link: https://lore.kernel.org/r/20260423033506.2542005-1-yonghong.song@linux.dev Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
9b9f0b4270
commit
246ad6e5ee
|
|
@ -58,8 +58,9 @@ struct ctl_table_header;
|
|||
#define BPF_REG_H BPF_REG_9 /* hlen, callee-saved */
|
||||
|
||||
/* Kernel hidden auxiliary/helper register. */
|
||||
#define BPF_REG_AX MAX_BPF_REG
|
||||
#define MAX_BPF_EXT_REG (MAX_BPF_REG + 1)
|
||||
#define BPF_REG_PARAMS MAX_BPF_REG
|
||||
#define BPF_REG_AX (MAX_BPF_REG + 1)
|
||||
#define MAX_BPF_EXT_REG (MAX_BPF_REG + 2)
|
||||
#define MAX_BPF_JIT_REG MAX_BPF_EXT_REG
|
||||
|
||||
/* unused opcode to mark special call to bpf_tail_call() helper */
|
||||
|
|
|
|||
|
|
@ -1299,8 +1299,8 @@ static int bpf_jit_blind_insn(const struct bpf_insn *from,
|
|||
u32 imm_rnd = get_random_u32();
|
||||
s16 off;
|
||||
|
||||
BUILD_BUG_ON(BPF_REG_AX + 1 != MAX_BPF_JIT_REG);
|
||||
BUILD_BUG_ON(MAX_BPF_REG + 1 != MAX_BPF_JIT_REG);
|
||||
BUILD_BUG_ON(BPF_REG_PARAMS + 2 != MAX_BPF_JIT_REG);
|
||||
BUILD_BUG_ON(BPF_REG_AX + 1 != MAX_BPF_JIT_REG);
|
||||
|
||||
/* Constraints on AX register:
|
||||
*
|
||||
|
|
|
|||
|
|
@ -69,19 +69,19 @@ static struct test_case test_cases[] = {
|
|||
#if defined(__x86_64__) || defined(__aarch64__)
|
||||
{
|
||||
N(SCHED_CLS, struct __sk_buff, tstamp),
|
||||
.read = "r11 = *(u8 *)($ctx + sk_buff::__mono_tc_offset);"
|
||||
"if w11 & 0x4 goto pc+1;"
|
||||
.read = "r12 = *(u8 *)($ctx + sk_buff::__mono_tc_offset);"
|
||||
"if w12 & 0x4 goto pc+1;"
|
||||
"goto pc+4;"
|
||||
"if w11 & 0x3 goto pc+1;"
|
||||
"if w12 & 0x3 goto pc+1;"
|
||||
"goto pc+2;"
|
||||
"$dst = 0;"
|
||||
"goto pc+1;"
|
||||
"$dst = *(u64 *)($ctx + sk_buff::tstamp);",
|
||||
.write = "r11 = *(u8 *)($ctx + sk_buff::__mono_tc_offset);"
|
||||
"if w11 & 0x4 goto pc+1;"
|
||||
.write = "r12 = *(u8 *)($ctx + sk_buff::__mono_tc_offset);"
|
||||
"if w12 & 0x4 goto pc+1;"
|
||||
"goto pc+2;"
|
||||
"w11 &= -4;"
|
||||
"*(u8 *)($ctx + sk_buff::__mono_tc_offset) = r11;"
|
||||
"w12 &= -4;"
|
||||
"*(u8 *)($ctx + sk_buff::__mono_tc_offset) = r12;"
|
||||
"*(u64 *)($ctx + sk_buff::tstamp) = $src;",
|
||||
},
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -630,13 +630,13 @@ __xlated("...")
|
|||
__xlated("4: r0 = &(void __percpu *)(r0)")
|
||||
__xlated("...")
|
||||
/* may_goto expansion starts */
|
||||
__xlated("6: r11 = *(u64 *)(r10 -24)")
|
||||
__xlated("7: if r11 == 0x0 goto pc+6")
|
||||
__xlated("8: r11 -= 1")
|
||||
__xlated("9: if r11 != 0x0 goto pc+2")
|
||||
__xlated("10: r11 = -24")
|
||||
__xlated("6: r12 = *(u64 *)(r10 -24)")
|
||||
__xlated("7: if r12 == 0x0 goto pc+6")
|
||||
__xlated("8: r12 -= 1")
|
||||
__xlated("9: if r12 != 0x0 goto pc+2")
|
||||
__xlated("10: r12 = -24")
|
||||
__xlated("11: call unknown")
|
||||
__xlated("12: *(u64 *)(r10 -24) = r11")
|
||||
__xlated("12: *(u64 *)(r10 -24) = r12")
|
||||
/* may_goto expansion ends */
|
||||
__xlated("13: *(u64 *)(r10 -8) = r1")
|
||||
__xlated("14: exit")
|
||||
|
|
@ -668,13 +668,13 @@ __xlated("1: *(u64 *)(r10 -16) =")
|
|||
__xlated("2: r1 = 1")
|
||||
__xlated("3: call bpf_get_smp_processor_id")
|
||||
/* may_goto expansion starts */
|
||||
__xlated("4: r11 = *(u64 *)(r10 -24)")
|
||||
__xlated("5: if r11 == 0x0 goto pc+6")
|
||||
__xlated("6: r11 -= 1")
|
||||
__xlated("7: if r11 != 0x0 goto pc+2")
|
||||
__xlated("8: r11 = -24")
|
||||
__xlated("4: r12 = *(u64 *)(r10 -24)")
|
||||
__xlated("5: if r12 == 0x0 goto pc+6")
|
||||
__xlated("6: r12 -= 1")
|
||||
__xlated("7: if r12 != 0x0 goto pc+2")
|
||||
__xlated("8: r12 = -24")
|
||||
__xlated("9: call unknown")
|
||||
__xlated("10: *(u64 *)(r10 -24) = r11")
|
||||
__xlated("10: *(u64 *)(r10 -24) = r12")
|
||||
/* may_goto expansion ends */
|
||||
__xlated("11: *(u64 *)(r10 -8) = r1")
|
||||
__xlated("12: exit")
|
||||
|
|
|
|||
|
|
@ -81,13 +81,13 @@ __arch_s390x
|
|||
__arch_arm64
|
||||
__xlated("0: *(u64 *)(r10 -16) = 65535")
|
||||
__xlated("1: *(u64 *)(r10 -8) = 0")
|
||||
__xlated("2: r11 = *(u64 *)(r10 -16)")
|
||||
__xlated("3: if r11 == 0x0 goto pc+6")
|
||||
__xlated("4: r11 -= 1")
|
||||
__xlated("5: if r11 != 0x0 goto pc+2")
|
||||
__xlated("6: r11 = -16")
|
||||
__xlated("2: r12 = *(u64 *)(r10 -16)")
|
||||
__xlated("3: if r12 == 0x0 goto pc+6")
|
||||
__xlated("4: r12 -= 1")
|
||||
__xlated("5: if r12 != 0x0 goto pc+2")
|
||||
__xlated("6: r12 = -16")
|
||||
__xlated("7: call unknown")
|
||||
__xlated("8: *(u64 *)(r10 -16) = r11")
|
||||
__xlated("8: *(u64 *)(r10 -16) = r12")
|
||||
__xlated("9: r0 = 1")
|
||||
__xlated("10: r0 = 2")
|
||||
__xlated("11: exit")
|
||||
|
|
|
|||
|
|
@ -778,10 +778,10 @@ __arch_x86_64
|
|||
__xlated("0: r2 = 0x8000000000000000")
|
||||
__xlated("2: r3 = -1")
|
||||
__xlated("3: r4 = r2")
|
||||
__xlated("4: r11 = r3")
|
||||
__xlated("5: r11 += 1")
|
||||
__xlated("6: if r11 > 0x1 goto pc+4")
|
||||
__xlated("7: if r11 == 0x0 goto pc+1")
|
||||
__xlated("4: r12 = r3")
|
||||
__xlated("5: r12 += 1")
|
||||
__xlated("6: if r12 > 0x1 goto pc+4")
|
||||
__xlated("7: if r12 == 0x0 goto pc+1")
|
||||
__xlated("8: r2 = 0")
|
||||
__xlated("9: r2 = -r2")
|
||||
__xlated("10: goto pc+1")
|
||||
|
|
@ -812,10 +812,10 @@ __success __retval(-5)
|
|||
__arch_x86_64
|
||||
__xlated("0: r2 = 5")
|
||||
__xlated("1: r3 = -1")
|
||||
__xlated("2: r11 = r3")
|
||||
__xlated("3: r11 += 1")
|
||||
__xlated("4: if r11 > 0x1 goto pc+4")
|
||||
__xlated("5: if r11 == 0x0 goto pc+1")
|
||||
__xlated("2: r12 = r3")
|
||||
__xlated("3: r12 += 1")
|
||||
__xlated("4: if r12 > 0x1 goto pc+4")
|
||||
__xlated("5: if r12 == 0x0 goto pc+1")
|
||||
__xlated("6: r2 = 0")
|
||||
__xlated("7: r2 = -r2")
|
||||
__xlated("8: goto pc+1")
|
||||
|
|
@ -890,10 +890,10 @@ __arch_x86_64
|
|||
__xlated("0: w2 = -2147483648")
|
||||
__xlated("1: w3 = -1")
|
||||
__xlated("2: w4 = w2")
|
||||
__xlated("3: r11 = r3")
|
||||
__xlated("4: w11 += 1")
|
||||
__xlated("5: if w11 > 0x1 goto pc+4")
|
||||
__xlated("6: if w11 == 0x0 goto pc+1")
|
||||
__xlated("3: r12 = r3")
|
||||
__xlated("4: w12 += 1")
|
||||
__xlated("5: if w12 > 0x1 goto pc+4")
|
||||
__xlated("6: if w12 == 0x0 goto pc+1")
|
||||
__xlated("7: w2 = 0")
|
||||
__xlated("8: w2 = -w2")
|
||||
__xlated("9: goto pc+1")
|
||||
|
|
@ -925,10 +925,10 @@ __arch_x86_64
|
|||
__xlated("0: w2 = -5")
|
||||
__xlated("1: w3 = -1")
|
||||
__xlated("2: w4 = w2")
|
||||
__xlated("3: r11 = r3")
|
||||
__xlated("4: w11 += 1")
|
||||
__xlated("5: if w11 > 0x1 goto pc+4")
|
||||
__xlated("6: if w11 == 0x0 goto pc+1")
|
||||
__xlated("3: r12 = r3")
|
||||
__xlated("4: w12 += 1")
|
||||
__xlated("5: if w12 > 0x1 goto pc+4")
|
||||
__xlated("6: if w12 == 0x0 goto pc+1")
|
||||
__xlated("7: w2 = 0")
|
||||
__xlated("8: w2 = -w2")
|
||||
__xlated("9: goto pc+1")
|
||||
|
|
@ -1004,10 +1004,10 @@ __arch_x86_64
|
|||
__xlated("0: r2 = 0x8000000000000000")
|
||||
__xlated("2: r3 = -1")
|
||||
__xlated("3: r4 = r2")
|
||||
__xlated("4: r11 = r3")
|
||||
__xlated("5: r11 += 1")
|
||||
__xlated("6: if r11 > 0x1 goto pc+3")
|
||||
__xlated("7: if r11 == 0x1 goto pc+3")
|
||||
__xlated("4: r12 = r3")
|
||||
__xlated("5: r12 += 1")
|
||||
__xlated("6: if r12 > 0x1 goto pc+3")
|
||||
__xlated("7: if r12 == 0x1 goto pc+3")
|
||||
__xlated("8: w2 = 0")
|
||||
__xlated("9: goto pc+1")
|
||||
__xlated("10: r2 s%= r3")
|
||||
|
|
@ -1034,10 +1034,10 @@ __arch_x86_64
|
|||
__xlated("0: r2 = 5")
|
||||
__xlated("1: r3 = -1")
|
||||
__xlated("2: r4 = r2")
|
||||
__xlated("3: r11 = r3")
|
||||
__xlated("4: r11 += 1")
|
||||
__xlated("5: if r11 > 0x1 goto pc+3")
|
||||
__xlated("6: if r11 == 0x1 goto pc+3")
|
||||
__xlated("3: r12 = r3")
|
||||
__xlated("4: r12 += 1")
|
||||
__xlated("5: if r12 > 0x1 goto pc+3")
|
||||
__xlated("6: if r12 == 0x1 goto pc+3")
|
||||
__xlated("7: w2 = 0")
|
||||
__xlated("8: goto pc+1")
|
||||
__xlated("9: r2 s%= r3")
|
||||
|
|
@ -1108,10 +1108,10 @@ __arch_x86_64
|
|||
__xlated("0: w2 = -2147483648")
|
||||
__xlated("1: w3 = -1")
|
||||
__xlated("2: w4 = w2")
|
||||
__xlated("3: r11 = r3")
|
||||
__xlated("4: w11 += 1")
|
||||
__xlated("5: if w11 > 0x1 goto pc+3")
|
||||
__xlated("6: if w11 == 0x1 goto pc+4")
|
||||
__xlated("3: r12 = r3")
|
||||
__xlated("4: w12 += 1")
|
||||
__xlated("5: if w12 > 0x1 goto pc+3")
|
||||
__xlated("6: if w12 == 0x1 goto pc+4")
|
||||
__xlated("7: w2 = 0")
|
||||
__xlated("8: goto pc+1")
|
||||
__xlated("9: w2 s%= w3")
|
||||
|
|
@ -1140,10 +1140,10 @@ __arch_x86_64
|
|||
__xlated("0: w2 = -5")
|
||||
__xlated("1: w3 = -1")
|
||||
__xlated("2: w4 = w2")
|
||||
__xlated("3: r11 = r3")
|
||||
__xlated("4: w11 += 1")
|
||||
__xlated("5: if w11 > 0x1 goto pc+3")
|
||||
__xlated("6: if w11 == 0x1 goto pc+4")
|
||||
__xlated("3: r12 = r3")
|
||||
__xlated("4: w12 += 1")
|
||||
__xlated("5: if w12 > 0x1 goto pc+3")
|
||||
__xlated("6: if w12 == 0x1 goto pc+4")
|
||||
__xlated("7: w2 = 0")
|
||||
__xlated("8: goto pc+1")
|
||||
__xlated("9: w2 s%= w3")
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user