1From a0ae2ba37ca479c6edddec8634b25686be965e0d Mon Sep 17 00:00:00 2001 2From: Peter Korsgaard <peter@korsgaard.com> 3Date: Mon, 27 Aug 2018 22:50:57 +0200 4Subject: [PATCH] bn_mul.h: fix x86 PIC inline ASM compilation with GCC < 5 5MIME-Version: 1.0 6Content-Type: text/plain; charset=UTF-8 7Content-Transfer-Encoding: 8bit 8 9Fixes #1910 10 11With ebx added to the MULADDC_STOP clobber list to fix #1550, the inline 12assembly fails to build with GCC < 5 in PIC mode with the following error: 13 14include/mbedtls/bn_mul.h:46:13: error: PIC register clobbered by ‘ebx’ in ‘asm’ 15 16This is because older GCC versions treated the x86 ebx register (which is 17used for the GOT) as a fixed reserved register when building as PIC. 18 19This is fixed by an improved register allocator in GCC 5+. From the release 20notes: 21 22Register allocation improvements: Reuse of the PIC hard register, instead of 23using a fixed register, was implemented on x86/x86-64 targets. This 24improves generated PIC code performance as more hard registers can be used. 25 26https://www.gnu.org/software/gcc/gcc-5/changes.html 27 28As a workaround, detect this situation and disable the inline assembly, 29similar to the MULADDC_CANNOT_USE_R7 logic. 30 31Signed-off-by: Peter Korsgaard <peter@korsgaard.com> 32Upstream: https://github.com/ARMmbed/mbedtls/pull/1986 33--- 34 include/mbedtls/bn_mul.h | 18 +++++++++++++++++- 35 1 file changed, 17 insertions(+), 1 deletion(-) 36 37diff --git a/include/mbedtls/bn_mul.h b/include/mbedtls/bn_mul.h 38index b587317d9..74a2d29be 100644 39--- a/include/mbedtls/bn_mul.h 40+++ b/include/mbedtls/bn_mul.h 41@@ -50,13 +50,29 @@ 42 #if defined(__GNUC__) && \ 43 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) 44 45+/* 46+ * GCC < 5.0 treated the x86 ebx (which is used for the GOT) as a 47+ * fixed reserved register when building as PIC, leading to errors 48+ * like: bn_mul.h:46:13: error: PIC register clobbered by ‘ebx’ in ‘asm’ 49+ * 50+ * This is fixed by an improved register allocator in GCC 5+. From the 51+ * release notes: 52+ * Register allocation improvements: Reuse of the PIC hard register, 53+ * instead of using a fixed register, was implemented on x86/x86-64 54+ * targets. This improves generated PIC code performance as more hard 55+ * registers can be used. 56+ */ 57+#if defined(__GNUC__) && __GNUC__ < 5 && defined(__PIC__) 58+#define MULADDC_CANNOT_USE_EBX 59+#endif 60+ 61 /* 62 * Disable use of the i386 assembly code below if option -O0, to disable all 63 * compiler optimisations, is passed, detected with __OPTIMIZE__ 64 * This is done as the number of registers used in the assembly code doesn't 65 * work with the -O0 option. 66 */ 67-#if defined(__i386__) && defined(__OPTIMIZE__) 68+#if defined(__i386__) && defined(__OPTIMIZE__) && !defined(MULADDC_CANNOT_USE_EBX) 69 70 #define MULADDC_INIT \ 71 asm( \ 72-- 732.11.0 74 75