Skip to content

Commit eab2a71

Browse files
puranjaymohanAlexei Starovoitov
authored andcommitted
bpf, arm64: Add support for signed arena loads
Add support for signed loads from arena which are internally converted to loads with mode set BPF_PROBE_MEM32SX by the verifier. The implementation is similar to BPF_PROBE_MEMSX and BPF_MEMSX but for BPF_PROBE_MEM32SX, arena_vm_base is added to the src register to form the address. Signed-off-by: Puranjay Mohan <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent a91ae3c commit eab2a71

File tree

1 file changed

+17
-13
lines changed

1 file changed

+17
-13
lines changed

arch/arm64/net/bpf_jit_comp.c

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,12 +1133,14 @@ static int add_exception_handler(const struct bpf_insn *insn,
11331133
return 0;
11341134

11351135
if (BPF_MODE(insn->code) != BPF_PROBE_MEM &&
1136-
BPF_MODE(insn->code) != BPF_PROBE_MEMSX &&
1137-
BPF_MODE(insn->code) != BPF_PROBE_MEM32 &&
1138-
BPF_MODE(insn->code) != BPF_PROBE_ATOMIC)
1136+
BPF_MODE(insn->code) != BPF_PROBE_MEMSX &&
1137+
BPF_MODE(insn->code) != BPF_PROBE_MEM32 &&
1138+
BPF_MODE(insn->code) != BPF_PROBE_MEM32SX &&
1139+
BPF_MODE(insn->code) != BPF_PROBE_ATOMIC)
11391140
return 0;
11401141

11411142
is_arena = (BPF_MODE(insn->code) == BPF_PROBE_MEM32) ||
1143+
(BPF_MODE(insn->code) == BPF_PROBE_MEM32SX) ||
11421144
(BPF_MODE(insn->code) == BPF_PROBE_ATOMIC);
11431145

11441146
if (!ctx->prog->aux->extable ||
@@ -1659,7 +1661,11 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
16591661
case BPF_LDX | BPF_PROBE_MEM32 | BPF_H:
16601662
case BPF_LDX | BPF_PROBE_MEM32 | BPF_W:
16611663
case BPF_LDX | BPF_PROBE_MEM32 | BPF_DW:
1662-
if (BPF_MODE(insn->code) == BPF_PROBE_MEM32) {
1664+
case BPF_LDX | BPF_PROBE_MEM32SX | BPF_B:
1665+
case BPF_LDX | BPF_PROBE_MEM32SX | BPF_H:
1666+
case BPF_LDX | BPF_PROBE_MEM32SX | BPF_W:
1667+
if (BPF_MODE(insn->code) == BPF_PROBE_MEM32 ||
1668+
BPF_MODE(insn->code) == BPF_PROBE_MEM32SX) {
16631669
emit(A64_ADD(1, tmp2, src, arena_vm_base), ctx);
16641670
src = tmp2;
16651671
}
@@ -1671,7 +1677,8 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
16711677
off_adj = off;
16721678
}
16731679
sign_extend = (BPF_MODE(insn->code) == BPF_MEMSX ||
1674-
BPF_MODE(insn->code) == BPF_PROBE_MEMSX);
1680+
BPF_MODE(insn->code) == BPF_PROBE_MEMSX ||
1681+
BPF_MODE(insn->code) == BPF_PROBE_MEM32SX);
16751682
switch (BPF_SIZE(code)) {
16761683
case BPF_W:
16771684
if (is_lsi_offset(off_adj, 2)) {
@@ -1879,9 +1886,11 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
18791886
if (ret)
18801887
return ret;
18811888

1882-
ret = add_exception_handler(insn, ctx, dst);
1883-
if (ret)
1884-
return ret;
1889+
if (BPF_MODE(insn->code) == BPF_PROBE_ATOMIC) {
1890+
ret = add_exception_handler(insn, ctx, dst);
1891+
if (ret)
1892+
return ret;
1893+
}
18851894
break;
18861895

18871896
default:
@@ -3064,11 +3073,6 @@ bool bpf_jit_supports_insn(struct bpf_insn *insn, bool in_arena)
30643073
if (!bpf_atomic_is_load_store(insn) &&
30653074
!cpus_have_cap(ARM64_HAS_LSE_ATOMICS))
30663075
return false;
3067-
break;
3068-
case BPF_LDX | BPF_MEMSX | BPF_B:
3069-
case BPF_LDX | BPF_MEMSX | BPF_H:
3070-
case BPF_LDX | BPF_MEMSX | BPF_W:
3071-
return false;
30723076
}
30733077
return true;
30743078
}

0 commit comments

Comments
 (0)