mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 15:41:36 +00:00
bpf: implement insn_is_cast_user() helper for JITs
Implement a helper function to check if an instruction is addr_space_cast from as(0) to as(1). Use this helper in the x86 JIT. Other JITs can use this helper when they add support for this instruction. Signed-off-by: Puranjay Mohan <puranjay12@gmail.com> Link: https://lore.kernel.org/r/20240324183226.29674-1-puranjay12@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
a8497506cd
commit
770546ae9f
@ -1351,8 +1351,7 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, u8 *rw_image
|
||||
break;
|
||||
|
||||
case BPF_ALU64 | BPF_MOV | BPF_X:
|
||||
if (insn->off == BPF_ADDR_SPACE_CAST &&
|
||||
insn->imm == 1U << 16) {
|
||||
if (insn_is_cast_user(insn)) {
|
||||
if (dst_reg != src_reg)
|
||||
/* 32-bit mov */
|
||||
emit_mov_reg(&prog, false, dst_reg, src_reg);
|
||||
|
@ -228,6 +228,16 @@ static inline bool insn_is_zext(const struct bpf_insn *insn)
|
||||
return insn->code == (BPF_ALU | BPF_MOV | BPF_X) && insn->imm == 1;
|
||||
}
|
||||
|
||||
/* addr_space_cast from as(0) to as(1) is for converting bpf arena pointers
|
||||
* to pointers in user vma.
|
||||
*/
|
||||
static inline bool insn_is_cast_user(const struct bpf_insn *insn)
|
||||
{
|
||||
return insn->code == (BPF_ALU64 | BPF_MOV | BPF_X) &&
|
||||
insn->off == BPF_ADDR_SPACE_CAST &&
|
||||
insn->imm == 1U << 16;
|
||||
}
|
||||
|
||||
/* BPF_LD_IMM64 macro encodes single 'load 64-bit immediate' insn */
|
||||
#define BPF_LD_IMM64(DST, IMM) \
|
||||
BPF_LD_IMM64_RAW(DST, 0, IMM)
|
||||
|
Loading…
Reference in New Issue
Block a user