| From a0ae2ba37ca479c6edddec8634b25686be965e0d Mon Sep 17 00:00:00 2001 | 
| From: Peter Korsgaard <peter@korsgaard.com> | 
| Date: Mon, 27 Aug 2018 22:50:57 +0200 | 
| Subject: [PATCH] bn_mul.h: fix x86 PIC inline ASM compilation with GCC < 5 | 
| MIME-Version: 1.0 | 
| Content-Type: text/plain; charset=UTF-8 | 
| Content-Transfer-Encoding: 8bit | 
|   | 
| Fixes #1910 | 
|   | 
| With ebx added to the MULADDC_STOP clobber list to fix #1550, the inline | 
| assembly fails to build with GCC < 5 in PIC mode with the following error: | 
|   | 
| include/mbedtls/bn_mul.h:46:13: error: PIC register clobbered by ‘ebx’ in ‘asm’ | 
|   | 
| This is because older GCC versions treated the x86 ebx register (which is | 
| used for the GOT) as a fixed reserved register when building as PIC. | 
|   | 
| This is fixed by an improved register allocator in GCC 5+.  From the release | 
| notes: | 
|   | 
| Register allocation improvements: Reuse of the PIC hard register, instead of | 
| using a fixed register, was implemented on x86/x86-64 targets.  This | 
| improves generated PIC code performance as more hard registers can be used. | 
|   | 
| https://www.gnu.org/software/gcc/gcc-5/changes.html | 
|   | 
| As a workaround, detect this situation and disable the inline assembly, | 
| similar to the MULADDC_CANNOT_USE_R7 logic. | 
|   | 
| Signed-off-by: Peter Korsgaard <peter@korsgaard.com> | 
| Upstream: https://github.com/ARMmbed/mbedtls/pull/1986 | 
| --- | 
|  include/mbedtls/bn_mul.h | 18 +++++++++++++++++- | 
|  1 file changed, 17 insertions(+), 1 deletion(-) | 
|   | 
| diff --git a/include/mbedtls/bn_mul.h b/include/mbedtls/bn_mul.h | 
| index b587317d9..74a2d29be 100644 | 
| --- a/include/mbedtls/bn_mul.h | 
| +++ b/include/mbedtls/bn_mul.h | 
| @@ -50,13 +50,29 @@ | 
|  #if defined(__GNUC__) && \ | 
|      ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) | 
|   | 
| +/* | 
| + * GCC < 5.0 treated the x86 ebx (which is used for the GOT) as a | 
| + * fixed reserved register when building as PIC, leading to errors | 
| + * like: bn_mul.h:46:13: error: PIC register clobbered by ‘ebx’ in ‘asm’ | 
| + * | 
| + * This is fixed by an improved register allocator in GCC 5+. From the | 
| + * release notes: | 
| + * Register allocation improvements: Reuse of the PIC hard register, | 
| + * instead of using a fixed register, was implemented on x86/x86-64 | 
| + * targets. This improves generated PIC code performance as more hard | 
| + * registers can be used. | 
| + */ | 
| +#if defined(__GNUC__) && __GNUC__ < 5 && defined(__PIC__) | 
| +#define MULADDC_CANNOT_USE_EBX | 
| +#endif | 
| + | 
|  /* | 
|   * Disable use of the i386 assembly code below if option -O0, to disable all | 
|   * compiler optimisations, is passed, detected with __OPTIMIZE__ | 
|   * This is done as the number of registers used in the assembly code doesn't | 
|   * work with the -O0 option. | 
|   */ | 
| -#if defined(__i386__) && defined(__OPTIMIZE__) | 
| +#if defined(__i386__) && defined(__OPTIMIZE__) && !defined(MULADDC_CANNOT_USE_EBX) | 
|   | 
|  #define MULADDC_INIT                        \ | 
|      asm(                                    \ | 
| --  | 
| 2.11.0 |