diff options
Diffstat (limited to 'arch/arm64/net/bpf_jit_comp.c')
-rw-r--r-- | arch/arm64/net/bpf_jit_comp.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c index 71f930501ade..c870d6f01ac2 100644 --- a/arch/arm64/net/bpf_jit_comp.c +++ b/arch/arm64/net/bpf_jit_comp.c | |||
@@ -36,6 +36,7 @@ int bpf_jit_enable __read_mostly; | |||
36 | #define TMP_REG_1 (MAX_BPF_JIT_REG + 0) | 36 | #define TMP_REG_1 (MAX_BPF_JIT_REG + 0) |
37 | #define TMP_REG_2 (MAX_BPF_JIT_REG + 1) | 37 | #define TMP_REG_2 (MAX_BPF_JIT_REG + 1) |
38 | #define TCALL_CNT (MAX_BPF_JIT_REG + 2) | 38 | #define TCALL_CNT (MAX_BPF_JIT_REG + 2) |
39 | #define TMP_REG_3 (MAX_BPF_JIT_REG + 3) | ||
39 | 40 | ||
40 | /* Map BPF registers to A64 registers */ | 41 | /* Map BPF registers to A64 registers */ |
41 | static const int bpf2a64[] = { | 42 | static const int bpf2a64[] = { |
@@ -57,6 +58,7 @@ static const int bpf2a64[] = { | |||
57 | /* temporary registers for internal BPF JIT */ | 58 | /* temporary registers for internal BPF JIT */ |
58 | [TMP_REG_1] = A64_R(10), | 59 | [TMP_REG_1] = A64_R(10), |
59 | [TMP_REG_2] = A64_R(11), | 60 | [TMP_REG_2] = A64_R(11), |
61 | [TMP_REG_3] = A64_R(12), | ||
60 | /* tail_call_cnt */ | 62 | /* tail_call_cnt */ |
61 | [TCALL_CNT] = A64_R(26), | 63 | [TCALL_CNT] = A64_R(26), |
62 | /* temporary register for blinding constants */ | 64 | /* temporary register for blinding constants */ |
@@ -319,6 +321,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) | |||
319 | const u8 src = bpf2a64[insn->src_reg]; | 321 | const u8 src = bpf2a64[insn->src_reg]; |
320 | const u8 tmp = bpf2a64[TMP_REG_1]; | 322 | const u8 tmp = bpf2a64[TMP_REG_1]; |
321 | const u8 tmp2 = bpf2a64[TMP_REG_2]; | 323 | const u8 tmp2 = bpf2a64[TMP_REG_2]; |
324 | const u8 tmp3 = bpf2a64[TMP_REG_3]; | ||
322 | const s16 off = insn->off; | 325 | const s16 off = insn->off; |
323 | const s32 imm = insn->imm; | 326 | const s32 imm = insn->imm; |
324 | const int i = insn - ctx->prog->insnsi; | 327 | const int i = insn - ctx->prog->insnsi; |
@@ -689,10 +692,10 @@ emit_cond_jmp: | |||
689 | emit(A64_PRFM(tmp, PST, L1, STRM), ctx); | 692 | emit(A64_PRFM(tmp, PST, L1, STRM), ctx); |
690 | emit(A64_LDXR(isdw, tmp2, tmp), ctx); | 693 | emit(A64_LDXR(isdw, tmp2, tmp), ctx); |
691 | emit(A64_ADD(isdw, tmp2, tmp2, src), ctx); | 694 | emit(A64_ADD(isdw, tmp2, tmp2, src), ctx); |
692 | emit(A64_STXR(isdw, tmp2, tmp, tmp2), ctx); | 695 | emit(A64_STXR(isdw, tmp2, tmp, tmp3), ctx); |
693 | jmp_offset = -3; | 696 | jmp_offset = -3; |
694 | check_imm19(jmp_offset); | 697 | check_imm19(jmp_offset); |
695 | emit(A64_CBNZ(0, tmp2, jmp_offset), ctx); | 698 | emit(A64_CBNZ(0, tmp3, jmp_offset), ctx); |
696 | break; | 699 | break; |
697 | 700 | ||
698 | /* R0 = ntohx(*(size *)(((struct sk_buff *)R6)->data + imm)) */ | 701 | /* R0 = ntohx(*(size *)(((struct sk_buff *)R6)->data + imm)) */ |