[lkml]   [2018]   [Sep]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH 4.14 152/165] MIPS: lib: Provide MIPS64r6 __multi3() for GCC < 7
    4.14-stable review patch.  If anyone has any objections, please let me know.


    From: Paul Burton <>

    commit 690d9163bf4b8563a2682e619f938e6a0443947f upstream.

    Some versions of GCC suboptimally generate calls to the __multi3()
    intrinsic for MIPS64r6 builds, resulting in link failures due to the
    missing function:

    LD vmlinux.o
    MODPOST vmlinux.o
    kernel/bpf/verifier.o: In function `kmalloc_array':
    include/linux/slab.h:631: undefined reference to `__multi3'
    fs/select.o: In function `kmalloc_array':
    include/linux/slab.h:631: undefined reference to `__multi3'

    We already have a workaround for this in which we provide the
    instrinsic, but we do so selectively for GCC 7 only. Unfortunately the
    issue occurs with older GCC versions too - it has been observed with
    both GCC 5.4.0 & GCC 6.4.0.

    MIPSr6 support was introduced in GCC 5, so all major GCC versions prior
    to GCC 8 are affected and we extend our workaround accordingly to all
    MIPS64r6 builds using GCC versions older than GCC 8.

    Signed-off-by: Paul Burton <>
    Reported-by: Vladimir Kondratiev <>
    Fixes: ebabcf17bcd7 ("MIPS: Implement __multi3 for GCC7 MIPS64r6 builds")
    Cc: James Hogan <>
    Cc: Ralf Baechle <>
    Cc: # 4.15+
    Signed-off-by: Greg Kroah-Hartman <>

    diff --git a/arch/mips/lib/multi3.c b/arch/mips/lib/multi3.c
    index 111ad475aa0c..4c2483f410c2 100644
    --- a/arch/mips/lib/multi3.c
    +++ b/arch/mips/lib/multi3.c
    @@ -4,12 +4,12 @@
    #include "libgcc.h"

    - * GCC 7 suboptimally generates __multi3 calls for mips64r6, so for that
    - * specific case only we'll implement it here.
    + * GCC 7 & older can suboptimally generate __multi3 calls for mips64r6, so for
    + * that specific case only we implement that intrinsic here.
    * See
    -#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6) && (__GNUC__ == 7)
    +#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6) && (__GNUC__ < 8)

    /* multiply 64-bit values, low 64-bits returned */
    static inline long long notrace dmulu(long long a, long long b)

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