Commit 469fb2c3 authored by Pu Lehui's avatar Pu Lehui Committed by Alexei Starovoitov

riscv, bpf: Fix missing exception handling and redundant zext for LDX_B/H/W

For LDX_B/H/W, when zext has been inserted by verifier, it'll return 1,
and no exception handling will continue. Also, when the offset is 12-bit
value, the redundant zext inserted by the verifier is not removed. Fix
both scenarios by moving down the removal of redundant zext.
Signed-off-by: default avatarPu Lehui <pulehui@huawei.com>
Link: https://lore.kernel.org/r/20230824095001.3408573-2-pulehui@huaweicloud.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 1b580c9b
...@@ -1512,8 +1512,6 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx, ...@@ -1512,8 +1512,6 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
insns_start = ctx->ninsns; insns_start = ctx->ninsns;
emit(rv_lbu(rd, 0, RV_REG_T1), ctx); emit(rv_lbu(rd, 0, RV_REG_T1), ctx);
insn_len = ctx->ninsns - insns_start; insn_len = ctx->ninsns - insns_start;
if (insn_is_zext(&insn[1]))
return 1;
break; break;
case BPF_H: case BPF_H:
if (is_12b_int(off)) { if (is_12b_int(off)) {
...@@ -1528,8 +1526,6 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx, ...@@ -1528,8 +1526,6 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
insns_start = ctx->ninsns; insns_start = ctx->ninsns;
emit(rv_lhu(rd, 0, RV_REG_T1), ctx); emit(rv_lhu(rd, 0, RV_REG_T1), ctx);
insn_len = ctx->ninsns - insns_start; insn_len = ctx->ninsns - insns_start;
if (insn_is_zext(&insn[1]))
return 1;
break; break;
case BPF_W: case BPF_W:
if (is_12b_int(off)) { if (is_12b_int(off)) {
...@@ -1544,8 +1540,6 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx, ...@@ -1544,8 +1540,6 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
insns_start = ctx->ninsns; insns_start = ctx->ninsns;
emit(rv_lwu(rd, 0, RV_REG_T1), ctx); emit(rv_lwu(rd, 0, RV_REG_T1), ctx);
insn_len = ctx->ninsns - insns_start; insn_len = ctx->ninsns - insns_start;
if (insn_is_zext(&insn[1]))
return 1;
break; break;
case BPF_DW: case BPF_DW:
if (is_12b_int(off)) { if (is_12b_int(off)) {
...@@ -1566,6 +1560,9 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx, ...@@ -1566,6 +1560,9 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
ret = add_exception_handler(insn, ctx, rd, insn_len); ret = add_exception_handler(insn, ctx, rd, insn_len);
if (ret) if (ret)
return ret; return ret;
if (BPF_SIZE(code) != BPF_DW && insn_is_zext(&insn[1]))
return 1;
break; break;
} }
/* speculation barrier */ /* speculation barrier */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment