0001-bn_mul.h-fix-x86-PIC-inline-ASM-compilation-with-GCC.patch 2.8 KB

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