summaryrefslogtreecommitdiffstats
path: root/recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch')
-rw-r--r--recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch165
1 files changed, 81 insertions, 84 deletions
diff --git a/recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch b/recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch
index 83e223f..7540b74 100644
--- a/recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch
+++ b/recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch
@@ -1,44 +1,38 @@
1From d5bea58bf85522a289194d59dfab00207ffdfb4f Mon Sep 17 00:00:00 2001 1From ab0d7e270d89f6eb99582197d2d58bf60c9c3d26 Mon Sep 17 00:00:00 2001
2From: Anton Gerasimov <anton@advancedtelematic.com> 2From: Anton Gerasimov <anton@advancedtelematic.com>
3Date: Fri, 26 Aug 2016 13:51:30 +0200 3Date: Thu, 15 Sep 2016 16:49:32 +0200
4Subject: [PATCH 2/2] Replace wraps with built-in code to remove dependency on 4Subject: [PATCH 2/2] Replace wraps with built-in code to remove dependency on
5 multilib 5 multilib
6 6
7--- 7---
8 arch/x86/config.mk | 3 -- 8 arch/x86/config.mk | 2 --
9 arch/x86/lib/gcc.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++------- 9 arch/x86/lib/gcc.c | 104 ++++++++++++++++++++++++++++++++++++++++++++---------
10 2 files changed, 86 insertions(+), 14 deletions(-) 10 2 files changed, 87 insertions(+), 19 deletions(-)
11 11
12diff --git a/arch/x86/config.mk b/arch/x86/config.mk 12diff --git a/arch/x86/config.mk b/arch/x86/config.mk
13index d7addd8..892e0fc 100644 13index 999143e..139576e 100644
14--- a/arch/x86/config.mk 14--- a/arch/x86/config.mk
15+++ b/arch/x86/config.mk 15+++ b/arch/x86/config.mk
16@@ -21,9 +21,6 @@ PLATFORM_RELFLAGS += -ffunction-sections -fvisibility=hidden 16@@ -22,5 +22,3 @@ PLATFORM_RELFLAGS += -ffunction-sections -fvisibility=hidden
17 17 PLATFORM_LDFLAGS += --emit-relocs -Bsymbolic -Bsymbolic-functions -m elf_i386
18 PLATFORM_LDFLAGS += -Bsymbolic -Bsymbolic-functions -m elf_i386
19 18
19 LDFLAGS_FINAL += --gc-sections -pie
20-LDFLAGS_FINAL += --wrap=__divdi3 --wrap=__udivdi3 20-LDFLAGS_FINAL += --wrap=__divdi3 --wrap=__udivdi3
21-LDFLAGS_FINAL += --wrap=__moddi3 --wrap=__umoddi3 21-LDFLAGS_FINAL += --wrap=__moddi3 --wrap=__umoddi3
22-
23 # This is used in the top-level Makefile which does not include
24 # PLATFORM_LDFLAGS
25 LDFLAGS_EFI_PAYLOAD := -Bsymbolic -Bsymbolic-functions -shared --no-undefined
26diff --git a/arch/x86/lib/gcc.c b/arch/x86/lib/gcc.c 22diff --git a/arch/x86/lib/gcc.c b/arch/x86/lib/gcc.c
27index 3c70d79..6b47785 100644 23index 497ad75..c321b11 100644
28--- a/arch/x86/lib/gcc.c 24--- a/arch/x86/lib/gcc.c
29+++ b/arch/x86/lib/gcc.c 25+++ b/arch/x86/lib/gcc.c
30@@ -8,22 +8,97 @@ 26@@ -19,22 +19,92 @@
31 27
32 #ifdef __GNUC__ 28 #ifdef __GNUC__
33 29
34+#include <stdint.h> 30-/*
35+#include <stddef.h> 31- * GCC's libgcc handling is quite broken. While the libgcc functions
36 /* 32- * are always regparm(0) the code that calls them uses whatever the
37 * GCC's libgcc handling is quite broken. While the libgcc functions 33- * compiler call specifies. Therefore we need a wrapper around those
38 * are always regparm(0) the code that calls them uses whatever the 34- * functions. See gcc bug PR41055 for more information.
39 * compiler call specifies. Therefore we need a wrapper around those 35- */
40 * functions. See gcc bug PR41055 for more information.
41 */
42-#define WRAP_LIBGCC_CALL(type, name) \ 36-#define WRAP_LIBGCC_CALL(type, name) \
43- type __normal_##name(type a, type b) __attribute__((regparm(0))); \ 37- type __normal_##name(type a, type b) __attribute__((regparm(0))); \
44- type __wrap_##name(type a, type b); \ 38- type __wrap_##name(type a, type b); \
@@ -50,92 +44,95 @@ index 3c70d79..6b47785 100644
50-WRAP_LIBGCC_CALL(unsigned long long, __udivdi3) 44-WRAP_LIBGCC_CALL(unsigned long long, __udivdi3)
51-WRAP_LIBGCC_CALL(long long, __moddi3) 45-WRAP_LIBGCC_CALL(long long, __moddi3)
52-WRAP_LIBGCC_CALL(unsigned long long, __umoddi3) 46-WRAP_LIBGCC_CALL(unsigned long long, __umoddi3)
47+#include <stdint.h>
48+#include <stddef.h>
49+
53+uint64_t __udivmoddi4 ( uint64_t num, 50+uint64_t __udivmoddi4 ( uint64_t num,
54+ uint64_t den, 51+ uint64_t den,
55+ uint64_t *rem_p ) 52+ uint64_t *rem_p )
56+{ 53+{
57+ uint64_t quot = 0, qbit = 1; 54+ uint64_t quot = 0, qbit = 1;
58+ 55+
59+ if ( den == 0 ) { 56+ if ( den == 0 ) {
60+ return 1/((unsigned)den); /* Intentional divide by zero, without 57+ return 1/((unsigned)den); /* Intentional divide by zero, without
61+ triggering a compiler warning which 58+ triggering a compiler warning which
62+ would abort the build */ 59+ would abort the build */
63+ } 60+ }
64+
65+ /* Left-justify denominator and count shift */
66+ while ( (int64_t)den >= 0 ) {
67+ den <<= 1;
68+ qbit <<= 1;
69+ }
70+
71+ while ( qbit ) {
72+ if ( den <= num ) {
73+ num -= den;
74+ quot += qbit;
75+ }
76+ den >>= 1;
77+ qbit >>= 1;
78+ }
79+
80+ if ( rem_p )
81+ *rem_p = num;
82+
83+ return quot;
84+}
85+ 61+
62+ /* Left-justify denominator and count shift */
63+ while ( (int64_t)den >= 0 ) {
64+ den <<= 1;
65+ qbit <<= 1;
66+ }
67+
68+ while ( qbit ) {
69+ if ( den <= num ) {
70+ num -= den;
71+ quot += qbit;
72+ }
73+ den >>= 1;
74+ qbit >>= 1;
75+ }
76+
77+ if ( rem_p )
78+ *rem_p = num;
79+
80+ return quot;
81+}
86+uint64_t __udivdi3( uint64_t num, uint64_t den ) 82+uint64_t __udivdi3( uint64_t num, uint64_t den )
87+{ 83+{
88+ return __udivmoddi4(num, den, NULL); 84+ return __udivmoddi4(num, den, NULL);
89+} 85+}
90+ 86+
91+uint64_t __umoddi3 ( uint64_t num, uint64_t den ) 87+uint64_t __umoddi3 ( uint64_t num, uint64_t den )
92+{ 88+{
93+ uint64_t v; 89+ uint64_t v;
94+ 90+
95+ (void) __udivmoddi4(num, den, &v); 91+ (void) __udivmoddi4(num, den, &v);
96+ return v; 92+ return v;
97+} 93+}
98+ 94+
99+int64_t __divmoddi4 ( int64_t num, 95+int64_t __divmoddi4 ( int64_t num,
100+ int64_t den, 96+ int64_t den,
101+ int64_t* rem_p ) 97+ int64_t* rem_p )
102+{ 98+{
103+ int minus = 0; 99+ int minus = 0;
104+ int64_t v; 100+ int64_t v;
105+ 101+
106+ if ( num < 0 ) { 102+ if ( num < 0 ) {
107+ num = -num; 103+ num = -num;
108+ minus = 1; 104+ minus = 1;
109+ } 105+ }
110+ if ( den < 0 ) { 106+ if ( den < 0 ) {
111+ den = -den; 107+ den = -den;
112+ minus ^= 1; 108+ minus ^= 1;
113+ } 109+ }
114+ 110+
115+ v = __udivmoddi4(num, den, (uint64_t *)rem_p); 111+ v = __udivmoddi4(num, den, (uint64_t *)rem_p);
116+ if ( minus ) { 112+ if ( minus ) {
117+ v = -v; 113+ v = -v;
118+ if ( rem_p ) 114+ if ( rem_p )
119+ *rem_p = -(*rem_p); 115+ *rem_p = -(*rem_p);
120+ } 116+ }
121+ 117+
122+ return v; 118+ return v;
123+} 119+}
124+ 120+
121+
125+int64_t __moddi3 (int64_t num, int64_t den) 122+int64_t __moddi3 (int64_t num, int64_t den)
126+{ 123+{
127+ int64_t v; 124+ int64_t v;
128+ 125+
129+ (void) __divmoddi4(num, den, &v); 126+ (void) __divmoddi4(num, den, &v);
130+ return v; 127+ return v;
131+} 128+}
132+ 129+
133+int64_t __divdi3(int64_t num, int64_t den) 130+int64_t __divdi3(int64_t num, int64_t den)
134+{ 131+{
135+ return __divmoddi4(num, den, NULL); 132+ return __divmoddi4(num, den, NULL);
136+} 133+}
137 134
138 #endif 135 #endif
139-- 136--
1402.9.2 1372.9.3
141 138