summaryrefslogtreecommitdiff
path: root/src/lib/gcc.c
diff options
context:
space:
mode:
authorStefan Reinauer <stefan.reinauer@coreboot.org>2012-12-06 13:54:29 -0800
committerRonald G. Minnich <rminnich@gmail.com>2012-12-06 23:13:17 +0100
commit399486e8fb8f5b402f1833e496dbed11aa0ac669 (patch)
tree2dbf5ed01e8546eaf534c4dce8758f5b44624f8c /src/lib/gcc.c
parentc269a9b51cac8e6e24cd98b46543b89e1b836bf8 (diff)
Unify assembler function handling
Instead of adding regparm(0) to each assembler function called by coreboot, add an asmlinkage macro (like the Linux kernel does) that can be different per architecture (and that is empty on ARM right now) Change-Id: I7ad10c463f6c552f1201f77ae24ed354ac48e2d9 Signed-off-by: Stefan Reinauer <reinauer@google.com> Reviewed-on: http://review.coreboot.org/1973 Reviewed-by: David Hendricks <dhendrix@chromium.org> Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/lib/gcc.c')
-rw-r--r--src/lib/gcc.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/src/lib/gcc.c b/src/lib/gcc.c
index daba427d25..c5ef4afebe 100644
--- a/src/lib/gcc.c
+++ b/src/lib/gcc.c
@@ -17,26 +17,21 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
*/
+#include <arch/cpu.h>
+
/* GCC's libgcc handling is quite broken. While the libgcc functions
* are always regparm(0) the code that calls them uses whatever the
* compiler call specifies. Therefore we need a wrapper around those
* functions. See gcc bug PR41055 for more information.
*/
-#if CONFIG_ARCH_X86
-#define WRAP_LIBGCC_CALL(type, name) \
- type __real_##name(type a, type b) __attribute__((regparm(0))); \
- type __wrap_##name(type a, type b); \
- type __wrap_##name(type a, type b) { return __real_##name(a, b); }
-#elif CONFIG_ARCH_ARMV7
+/* TODO: maybe this code should move to arch/x86 as architecture
+ * specific implementations may vary
+ */
#define WRAP_LIBGCC_CALL(type, name) \
- type __real_##name(type a, type b); \
+ type __real_##name(type a, type b) asmlinkage; \
type __wrap_##name(type a, type b); \
type __wrap_##name(type a, type b) { return __real_##name(a, b); }
-#else
-#error Architecture unsupported.
-#endif
-
WRAP_LIBGCC_CALL(long long, __divdi3)
WRAP_LIBGCC_CALL(unsigned long long, __udivdi3)