bpf: Add helper functions for r11-based stack argument insns

Add three static inline helper functions — is_stack_arg_ldx(),
is_stack_arg_st(), and is_stack_arg_stx() — that identify r11-based
(BPF_REG_PARAMS) instructions used for stack argument passing. These
helpers encapsulate the detailed encoding requirements (operand size,
register, offset alignment and sign) and hide raw BPF_REG_PARAMS usage
from the verifier, making call sites more readable and explicit.

A later patch ("bpf: Enable r11 based insns") will wire these helpers
into the verifier. Until then, check_and_resolve_insns() rejects any
r11-based registers.

Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/r/20260513045005.2383881-1-yonghong.song@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Yonghong Song 2026-05-12 21:50:05 -07:00 committed by Alexei Starovoitov
parent 1cb229a54a
commit 78bbe61632

View File

@ -749,6 +749,27 @@ static inline u32 bpf_prog_run_pin_on_cpu(const struct bpf_prog *prog,
return ret;
}
static inline bool is_stack_arg_ldx(const struct bpf_insn *insn)
{
return insn->code == (BPF_LDX | BPF_MEM | BPF_DW) &&
insn->src_reg == BPF_REG_PARAMS &&
insn->off > 0 && insn->off % 8 == 0;
}
static inline bool is_stack_arg_st(const struct bpf_insn *insn)
{
return insn->code == (BPF_ST | BPF_MEM | BPF_DW) &&
insn->dst_reg == BPF_REG_PARAMS &&
insn->off < 0 && insn->off % 8 == 0;
}
static inline bool is_stack_arg_stx(const struct bpf_insn *insn)
{
return insn->code == (BPF_STX | BPF_MEM | BPF_DW) &&
insn->dst_reg == BPF_REG_PARAMS &&
insn->off < 0 && insn->off % 8 == 0;
}
#define BPF_SKB_CB_LEN QDISC_CB_PRIV_LEN
struct bpf_skb_data_end {