bpf, riscv: Fix tail call count off by one in RV32 BPF JIT
authorLuke Nelson <lukenels@cs.washington.edu>
Tue, 21 Apr 2020 00:28:04 +0000 (17:28 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Sun, 26 Apr 2020 15:40:01 +0000 (08:40 -0700)
This patch fixes an off by one error in the RV32 JIT handling for BPF
tail call. Currently, the code decrements TCC before checking if it
is less than zero. This limits the maximum number of tail calls to 32
instead of 33 as in other JITs. The fix is to instead check the old
value of TCC before decrementing.

Fixes: 5f316b65e99f ("riscv, bpf: Add RV32G eBPF JIT")
Signed-off-by: Luke Nelson <luke.r.nels@gmail.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Xi Wang <xi.wang@gmail.com>
Link: https://lore.kernel.org/bpf/20200421002804.5118-1-luke.r.nels@gmail.com
arch/riscv/net/bpf_jit_comp32.c

index 302934177760f7481c9a2a0ad73427ac69e6fc0a..11083d4d5f2d5275e745fd6feebc57f88dec74c2 100644 (file)
@@ -770,12 +770,13 @@ static int emit_bpf_tail_call(int insn, struct rv_jit_context *ctx)
        emit_bcc(BPF_JGE, lo(idx_reg), RV_REG_T1, off, ctx);
 
        /*
-        * if ((temp_tcc = tcc - 1) < 0)
+        * temp_tcc = tcc - 1;
+        * if (tcc < 0)
         *   goto out;
         */
        emit(rv_addi(RV_REG_T1, RV_REG_TCC, -1), ctx);
        off = (tc_ninsn - (ctx->ninsns - start_insn)) << 2;
-       emit_bcc(BPF_JSLT, RV_REG_T1, RV_REG_ZERO, off, ctx);
+       emit_bcc(BPF_JSLT, RV_REG_TCC, RV_REG_ZERO, off, ctx);
 
        /*
         * prog = array->ptrs[index];