lkml.org 
[lkml]   [2018]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 130/241] MIPS: BPF: Fix multiple problems in JIT skb access helpers.
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: David Daney <david.daney@cavium.com>


    [ Upstream commit a81507c79f4ae9a0f9fb1054b59b62a090620dd9 ]

    o Socket data is unsigned, so use unsigned accessors instructions.

    o Fix path result pointer generation arithmetic.

    o Fix half-word byte swapping code for unsigned semantics.

    Signed-off-by: David Daney <david.daney@cavium.com>
    Cc: James Hogan <james.hogan@imgtec.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Steven J. Hill <steven.hill@cavium.com>
    Cc: linux-mips@linux-mips.org
    Cc: netdev@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/15747/
    Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/mips/net/bpf_jit_asm.S | 23 ++++++++++++-----------
    1 file changed, 12 insertions(+), 11 deletions(-)

    --- a/arch/mips/net/bpf_jit_asm.S
    +++ b/arch/mips/net/bpf_jit_asm.S
    @@ -90,18 +90,14 @@ FEXPORT(sk_load_half_positive)
    is_offset_in_header(2, half)
    /* Offset within header boundaries */
    PTR_ADDU t1, $r_skb_data, offset
    - .set reorder
    - lh $r_A, 0(t1)
    - .set noreorder
    + lhu $r_A, 0(t1)
    #ifdef CONFIG_CPU_LITTLE_ENDIAN
    # if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
    - wsbh t0, $r_A
    - seh $r_A, t0
    + wsbh $r_A, $r_A
    # else
    - sll t0, $r_A, 24
    - andi t1, $r_A, 0xff00
    - sra t0, t0, 16
    - srl t1, t1, 8
    + sll t0, $r_A, 8
    + srl t1, $r_A, 8
    + andi t0, t0, 0xff00
    or $r_A, t0, t1
    # endif
    #endif
    @@ -115,7 +111,7 @@ FEXPORT(sk_load_byte_positive)
    is_offset_in_header(1, byte)
    /* Offset within header boundaries */
    PTR_ADDU t1, $r_skb_data, offset
    - lb $r_A, 0(t1)
    + lbu $r_A, 0(t1)
    jr $r_ra
    move $r_ret, zero
    END(sk_load_byte)
    @@ -139,6 +135,11 @@ FEXPORT(sk_load_byte_positive)
    * (void *to) is returned in r_s0
    *
    */
    +#ifdef CONFIG_CPU_LITTLE_ENDIAN
    +#define DS_OFFSET(SIZE) (4 * SZREG)
    +#else
    +#define DS_OFFSET(SIZE) ((4 * SZREG) + (4 - SIZE))
    +#endif
    #define bpf_slow_path_common(SIZE) \
    /* Quick check. Are we within reasonable boundaries? */ \
    LONG_ADDIU $r_s1, $r_skb_len, -SIZE; \
    @@ -150,7 +151,7 @@ FEXPORT(sk_load_byte_positive)
    PTR_LA t0, skb_copy_bits; \
    PTR_S $r_ra, (5 * SZREG)($r_sp); \
    /* Assign low slot to a2 */ \
    - move a2, $r_sp; \
    + PTR_ADDIU a2, $r_sp, DS_OFFSET(SIZE); \
    jalr t0; \
    /* Reset our destination slot (DS but it's ok) */ \
    INT_S zero, (4 * SZREG)($r_sp); \

    \
     
     \ /
      Last update: 2018-03-19 19:24    [W:4.120 / U:0.236 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site