lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 344/355] powerpc/bpf: Fix BPF_SUB when imm == 0x80000000
    Date
    From: "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com>

    upstream commit 5855c4c1f415ca3ba1046e77c0b3d3dfc96c9025

    We aren't handling subtraction involving an immediate value of
    0x80000000 properly. Fix the same.

    Fixes: 156d0e290e969c ("powerpc/ebpf/jit: Implement JIT compiler for extended BPF")
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    [mpe: Fold in fix from Naveen to use imm <= 32768]
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/fc4b1276eb10761fd7ce0814c8dd089da2815251.1633464148.git.naveen.n.rao@linux.vnet.ibm.com
    [adjust macros to account for commits 0654186510a40e and 3a181237916310]
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/powerpc/net/bpf_jit_comp64.c | 27 +++++++++++++++++----------
    1 file changed, 17 insertions(+), 10 deletions(-)

    --- a/arch/powerpc/net/bpf_jit_comp64.c
    +++ b/arch/powerpc/net/bpf_jit_comp64.c
    @@ -349,18 +349,25 @@ static int bpf_jit_build_body(struct bpf
    PPC_SUB(dst_reg, dst_reg, src_reg);
    goto bpf_alu32_trunc;
    case BPF_ALU | BPF_ADD | BPF_K: /* (u32) dst += (u32) imm */
    - case BPF_ALU | BPF_SUB | BPF_K: /* (u32) dst -= (u32) imm */
    case BPF_ALU64 | BPF_ADD | BPF_K: /* dst += imm */
    + if (!imm) {
    + goto bpf_alu32_trunc;
    + } else if (imm >= -32768 && imm < 32768) {
    + PPC_ADDI(dst_reg, dst_reg, IMM_L(imm));
    + } else {
    + PPC_LI32(b2p[TMP_REG_1], imm);
    + PPC_ADD(dst_reg, dst_reg, b2p[TMP_REG_1]);
    + }
    + goto bpf_alu32_trunc;
    + case BPF_ALU | BPF_SUB | BPF_K: /* (u32) dst -= (u32) imm */
    case BPF_ALU64 | BPF_SUB | BPF_K: /* dst -= imm */
    - if (BPF_OP(code) == BPF_SUB)
    - imm = -imm;
    - if (imm) {
    - if (imm >= -32768 && imm < 32768)
    - PPC_ADDI(dst_reg, dst_reg, IMM_L(imm));
    - else {
    - PPC_LI32(b2p[TMP_REG_1], imm);
    - PPC_ADD(dst_reg, dst_reg, b2p[TMP_REG_1]);
    - }
    + if (!imm) {
    + goto bpf_alu32_trunc;
    + } else if (imm > -32768 && imm <= 32768) {
    + PPC_ADDI(dst_reg, dst_reg, IMM_L(-imm));
    + } else {
    + PPC_LI32(b2p[TMP_REG_1], imm);
    + PPC_SUB(dst_reg, dst_reg, b2p[TMP_REG_1]);
    }
    goto bpf_alu32_trunc;
    case BPF_ALU | BPF_MUL | BPF_X: /* (u32) dst *= (u32) src */

    \
     
     \ /
      Last update: 2021-11-15 19:49    [W:4.536 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site