From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, James Hogan <jhogan@kernel.org>,
Ralf Baechle <ralf@linux-mips.org>,
Herbert Xu <herbert@gondor.apana.org.au>,
"David S. Miller" <davem@davemloft.net>,
linux-mips@linux-mips.org, linux-crypto@vger.kernel.org,
Sasha Levin <alexander.levin@microsoft.com>
Subject: [PATCH 4.4 12/34] lib/mpi: Fix umul_ppmm() for MIPS64r6
Date: Fri, 2 Mar 2018 09:51:08 +0100 [thread overview]
Message-ID: <20180302084436.750827407@linuxfoundation.org> (raw)
In-Reply-To: <20180302084435.842679610@linuxfoundation.org>
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <jhogan@kernel.org>
[ Upstream commit bbc25bee37d2b32cf3a1fab9195b6da3a185614a ]
Current MIPS64r6 toolchains aren't able to generate efficient
DMULU/DMUHU based code for the C implementation of umul_ppmm(), which
performs an unsigned 64 x 64 bit multiply and returns the upper and
lower 64-bit halves of the 128-bit result. Instead it widens the 64-bit
inputs to 128-bits and emits a __multi3 intrinsic call to perform a 128
x 128 multiply. This is both inefficient, and it results in a link error
since we don't include __multi3 in MIPS linux.
For example commit 90a53e4432b1 ("cfg80211: implement regdb signature
checking") merged in v4.15-rc1 recently broke the 64r6_defconfig and
64r6el_defconfig builds by indirectly selecting MPILIB. The same build
errors can be reproduced on older kernels by enabling e.g. CRYPTO_RSA:
lib/mpi/generic_mpih-mul1.o: In function `mpihelp_mul_1':
lib/mpi/generic_mpih-mul1.c:50: undefined reference to `__multi3'
lib/mpi/generic_mpih-mul2.o: In function `mpihelp_addmul_1':
lib/mpi/generic_mpih-mul2.c:49: undefined reference to `__multi3'
lib/mpi/generic_mpih-mul3.o: In function `mpihelp_submul_1':
lib/mpi/generic_mpih-mul3.c:49: undefined reference to `__multi3'
lib/mpi/mpih-div.o In function `mpihelp_divrem':
lib/mpi/mpih-div.c:205: undefined reference to `__multi3'
lib/mpi/mpih-div.c:142: undefined reference to `__multi3'
Therefore add an efficient MIPS64r6 implementation of umul_ppmm() using
inline assembly and the DMULU/DMUHU instructions, to prevent __multi3
calls being emitted.
Fixes: 7fd08ca58ae6 ("MIPS: Add build support for the MIPS R6 ISA")
Signed-off-by: James Hogan <jhogan@kernel.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: linux-mips@linux-mips.org
Cc: linux-crypto@vger.kernel.org
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
lib/mpi/longlong.h | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
--- a/lib/mpi/longlong.h
+++ b/lib/mpi/longlong.h
@@ -671,7 +671,23 @@ do { \
************** MIPS/64 **************
***************************************/
#if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64
-#if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
+#if defined(__mips_isa_rev) && __mips_isa_rev >= 6
+/*
+ * GCC ends up emitting a __multi3 intrinsic call for MIPS64r6 with the plain C
+ * code below, so we special case MIPS64r6 until the compiler can do better.
+ */
+#define umul_ppmm(w1, w0, u, v) \
+do { \
+ __asm__ ("dmulu %0,%1,%2" \
+ : "=d" ((UDItype)(w0)) \
+ : "d" ((UDItype)(u)), \
+ "d" ((UDItype)(v))); \
+ __asm__ ("dmuhu %0,%1,%2" \
+ : "=d" ((UDItype)(w1)) \
+ : "d" ((UDItype)(u)), \
+ "d" ((UDItype)(v))); \
+} while (0)
+#elif (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
#define umul_ppmm(w1, w0, u, v) \
do { \
typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \
next prev parent reply other threads:[~2018-03-02 8:51 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-02 8:50 [PATCH 4.4 00/34] 4.4.120-stable review Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.4 01/34] hrtimer: Ensure POSIX compliance (relative CLOCK_REALTIME hrtimers) Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.4 02/34] f2fs: fix a bug caused by NULL extent tree Greg Kroah-Hartman
2018-03-02 8:50 ` [PATCH 4.4 03/34] mtd: nand: gpmi: Fix failure when a erased page has a bitflip at BBM Greg Kroah-Hartman
2018-03-06 21:22 ` Ben Hutchings
2018-03-07 8:12 ` Boris Brezillon
2018-03-07 8:19 ` Richard Weinberger
2018-03-07 8:19 ` Richard Weinberger
2018-03-07 14:58 ` Sasha Levin
2018-03-02 8:51 ` [PATCH 4.4 04/34] ipv6: icmp6: Allow icmp messages to be looped back Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 05/34] ARM: 8731/1: Fix csum_partial_copy_from_user() stack mismatch Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 06/34] sget(): handle failures of register_shrinker() Greg Kroah-Hartman
2018-03-07 2:16 ` Ben Hutchings
2018-03-02 8:51 ` [PATCH 4.4 07/34] drm/nouveau/pci: do a msi rearm on init Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 08/34] spi: atmel: fixed spin_lock usage inside atmel_spi_remove Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 09/34] net: arc_emac: fix arc_emac_rx() error paths Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 10/34] scsi: storvsc: Fix scsi_cmd error assignments in storvsc_handle_error Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 11/34] ARM: dts: ls1021a: fix incorrect clock references Greg Kroah-Hartman
2018-03-02 8:51 ` Greg Kroah-Hartman [this message]
2018-03-02 8:51 ` [PATCH 4.4 13/34] tg3: Add workaround to restrict 5762 MRRS to 2048 Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 14/34] tg3: Enable PHY reset in MTU change path for 5720 Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 15/34] bnx2x: Improve reliability in case of nested PCI errors Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 16/34] led: core: Fix brightness setting when setting delay_off=0 Greg Kroah-Hartman
2018-03-07 15:30 ` Ben Hutchings
2018-03-07 15:32 ` Ben Hutchings
2018-03-07 20:39 ` Jacek Anaszewski
2018-03-08 17:24 ` Greg Kroah-Hartman
2018-03-08 18:04 ` Pavel Machek
2018-03-08 20:48 ` Jacek Anaszewski
2018-03-09 1:09 ` Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 17/34] s390/dasd: fix wrongly assigned configuration data Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 18/34] IB/mlx4: Fix mlx4_ib_alloc_mr error flow Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 19/34] IB/ipoib: Fix race condition in neigh creation Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 20/34] xfs: quota: fix missed destroy of qi_tree_lock Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 21/34] xfs: quota: check result of register_shrinker() Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 22/34] e1000: fix disabling already-disabled warning Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 23/34] drm/ttm: check the return value of kzalloc Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 24/34] mac80211: mesh: drop frames appearing to be from us Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 25/34] can: flex_can: Correct the checking for frame length in flexcan_start_xmit() Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 26/34] bnxt_en: Fix the Invalid VF id check in bnxt_vf_ndo_prep routine Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 27/34] xen-netfront: enable device after manual module load Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 28/34] mdio-sun4i: Fix a memory leak Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 29/34] SolutionEngine771x: fix Ether platform data Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 30/34] xen/gntdev: Fix off-by-one error when unmapping with holes Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 31/34] xen/gntdev: Fix partial gntdev_mmap() cleanup Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 32/34] sctp: make use of pre-calculated len Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 33/34] net: gianfar_ptp: move set_fipers() to spinlock protecting area Greg Kroah-Hartman
2018-03-02 8:51 ` [PATCH 4.4 34/34] MIPS: Implement __multi3 for GCC7 MIPS64r6 builds Greg Kroah-Hartman
2018-03-02 12:22 ` [PATCH 4.4 00/34] 4.4.120-stable review Nathan Chancellor
2018-03-02 18:53 ` Greg Kroah-Hartman
2018-03-02 13:58 ` kernelci.org bot
2018-03-02 16:59 ` Naresh Kamboju
2018-03-02 17:16 ` Guenter Roeck
2018-03-02 21:30 ` Shuah Khan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180302084436.750827407@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=alexander.levin@microsoft.com \
--cc=davem@davemloft.net \
--cc=herbert@gondor.apana.org.au \
--cc=jhogan@kernel.org \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=ralf@linux-mips.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.