summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/armv7/include/arch/cpu.h25
-rw-r--r--src/arch/x86/boot/acpi.c2
-rw-r--r--src/arch/x86/include/arch/cpu.h5
-rw-r--r--src/arch/x86/include/arch/stages.h7
-rw-r--r--src/arch/x86/lib/cbfs_and_run.c4
-rw-r--r--src/cpu/x86/lapic/lapic_cpu_init.c2
-rw-r--r--src/device/oprom/realmode/x86.c8
-rw-r--r--src/device/oprom/realmode/x86.h10
-rw-r--r--src/include/cpu/cpu.h2
-rw-r--r--src/lib/gcc.c17
10 files changed, 58 insertions, 24 deletions
diff --git a/src/arch/armv7/include/arch/cpu.h b/src/arch/armv7/include/arch/cpu.h
new file mode 100644
index 0000000000..b68004a600
--- /dev/null
+++ b/src/arch/armv7/include/arch/cpu.h
@@ -0,0 +1,25 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2012 Google, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
+ */
+
+#ifndef __ARCH_CPU_H__
+#define __ARCH_CPU_H__
+
+#define asmlinkage
+
+#endif
diff --git a/src/arch/x86/boot/acpi.c b/src/arch/x86/boot/acpi.c
index 4d405d9fe0..fd6a1baf88 100644
--- a/src/arch/x86/boot/acpi.c
+++ b/src/arch/x86/boot/acpi.c
@@ -748,7 +748,7 @@ extern int lowmem_backup_size;
#define WAKEUP_BASE 0x600
void (*acpi_do_wakeup)(u32 vector, u32 backup_source, u32 backup_target,
- u32 backup_size) __attribute__((regparm(0))) = (void *)WAKEUP_BASE;
+ u32 backup_size) asmlinkage = (void *)WAKEUP_BASE;
extern unsigned char __wakeup, __wakeup_size;
diff --git a/src/arch/x86/include/arch/cpu.h b/src/arch/x86/include/arch/cpu.h
index abe3f7fba7..ed8148e465 100644
--- a/src/arch/x86/include/arch/cpu.h
+++ b/src/arch/x86/include/arch/cpu.h
@@ -1,6 +1,8 @@
#ifndef ARCH_CPU_H
#define ARCH_CPU_H
+#include <stdint.h>
+
/*
* EFLAGS bits
*/
@@ -205,6 +207,9 @@ static void inline get_fms(struct cpuinfo_x86 *c, uint32_t tfms)
c->x86_model += ((tfms >> 16) & 0xF) << 4;
}
+
+#define asmlinkage __attribute__((regparm(0)))
+
#endif
#endif /* ARCH_CPU_H */
diff --git a/src/arch/x86/include/arch/stages.h b/src/arch/x86/include/arch/stages.h
index 3ddba51783..0d00144cba 100644
--- a/src/arch/x86/include/arch/stages.h
+++ b/src/arch/x86/include/arch/stages.h
@@ -19,6 +19,9 @@
#ifndef __ARCH_STAGES_H
#define __ARCH_STAGES_H
-void __attribute__((regparm(0))) copy_and_run(unsigned cpu_reset);
-void __attribute__((regparm(0))) copy_and_run_ap_code_in_car(unsigned ret_addr);
+
+#include <arch/cpu.h>
+
+void asmlinkage copy_and_run(unsigned cpu_reset);
+void asmlinkage copy_and_run_ap_code_in_car(unsigned ret_addr);
#endif
diff --git a/src/arch/x86/lib/cbfs_and_run.c b/src/arch/x86/lib/cbfs_and_run.c
index 62b2789f53..1f87e7ab62 100644
--- a/src/arch/x86/lib/cbfs_and_run.c
+++ b/src/arch/x86/lib/cbfs_and_run.c
@@ -41,7 +41,7 @@ static void cbfs_and_run_core(const char *filename, unsigned ebp)
);
}
-void __attribute__((regparm(0))) copy_and_run(unsigned cpu_reset)
+void asmlinkage copy_and_run(unsigned cpu_reset)
{
// FIXME fix input parameters instead normalizing them here.
if (cpu_reset == 1) cpu_reset = -1;
@@ -51,7 +51,7 @@ void __attribute__((regparm(0))) copy_and_run(unsigned cpu_reset)
}
#if CONFIG_AP_CODE_IN_CAR
-void __attribute__((regparm(0))) copy_and_run_ap_code_in_car(unsigned ret_addr)
+void asmlinkage copy_and_run_ap_code_in_car(unsigned ret_addr)
{
cbfs_and_run_core(CONFIG_CBFS_PREFIX "/coreboot_ap", ret_addr);
}
diff --git a/src/cpu/x86/lapic/lapic_cpu_init.c b/src/cpu/x86/lapic/lapic_cpu_init.c
index 621990c0e5..71ae377808 100644
--- a/src/cpu/x86/lapic/lapic_cpu_init.c
+++ b/src/cpu/x86/lapic/lapic_cpu_init.c
@@ -408,7 +408,7 @@ static __inline__ __attribute__((always_inline)) void writecr4(unsigned long Dat
#endif
/* C entry point of secondary cpus */
-void __attribute__((regparm(0))) secondary_cpu_init(unsigned int index)
+void asmlinkage secondary_cpu_init(unsigned int index)
{
atomic_inc(&active_cpus);
#if CONFIG_SERIAL_CPU_INIT
diff --git a/src/device/oprom/realmode/x86.c b/src/device/oprom/realmode/x86.c
index 6a82a691b5..697d869821 100644
--- a/src/device/oprom/realmode/x86.c
+++ b/src/device/oprom/realmode/x86.c
@@ -38,11 +38,11 @@
X86EMU_sysEnv _X86EMU_env;
void (*realmode_call)(u32 addr, u32 eax, u32 ebx, u32 ecx, u32 edx,
- u32 esi, u32 edi) __attribute__((regparm(0))) =
+ u32 esi, u32 edi) asmlinkage =
(void *)&__realmode_call;
void (*realmode_interrupt)(u32 intno, u32 eax, u32 ebx, u32 ecx, u32 edx,
- u32 esi, u32 edi) __attribute__((regparm(0))) =
+ u32 esi, u32 edi) asmlinkage =
(void *)&__realmode_interrupt;
static void setup_rombios(void)
@@ -406,7 +406,7 @@ void do_vsmbios(void)
/* interrupt_handler() is called from assembler code only,
* so there is no use in putting the prototype into a header file.
*/
-int __attribute__((regparm(0))) interrupt_handler(u32 intnumber,
+int asmlinkage interrupt_handler(u32 intnumber,
u32 gsfs, u32 dses,
u32 edi, u32 esi,
u32 ebp, u32 esp,
@@ -414,7 +414,7 @@ int __attribute__((regparm(0))) interrupt_handler(u32 intnumber,
u32 ecx, u32 eax,
u32 cs_ip, u16 stackflags);
-int __attribute__((regparm(0))) interrupt_handler(u32 intnumber,
+int asmlinkage interrupt_handler(u32 intnumber,
u32 gsfs, u32 dses,
u32 edi, u32 esi,
u32 ebp, u32 esp,
diff --git a/src/device/oprom/realmode/x86.h b/src/device/oprom/realmode/x86.h
index 7dfa60f996..76d3e4643c 100644
--- a/src/device/oprom/realmode/x86.h
+++ b/src/device/oprom/realmode/x86.h
@@ -18,6 +18,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#ifndef __DEVICE_OPROM_REALMODE_X86_H__
+#define __DEVICE_OPROM_REALMODE_X86_H__
+
+#include <arch/cpu.h>
+
#define REALMODE_BASE ((void *)0x600)
struct realmode_idt {
@@ -33,10 +38,10 @@ extern unsigned char __realmode_call, __realmode_interrupt;
extern unsigned char __buffer;
extern void (*realmode_call)(u32 addr, u32 eax, u32 ebx, u32 ecx, u32 edx,
- u32 esi, u32 edi) __attribute__((regparm(0)));
+ u32 esi, u32 edi) asmlinkage;
extern void (*realmode_interrupt)(u32 intno, u32 eax, u32 ebx, u32 ecx, u32 edx,
- u32 esi, u32 edi) __attribute__((regparm(0)));
+ u32 esi, u32 edi) asmlinkage;
#define FAKE_MEMORY_SIZE (1024*1024) // only 1MB
#define INITIAL_EBDA_SEGMENT 0xF600
@@ -47,3 +52,4 @@ int int12_handler(void);
int int16_handler(void);
int int1a_handler(void);
+#endif
diff --git a/src/include/cpu/cpu.h b/src/include/cpu/cpu.h
index e8ea096a6c..cf2d38997d 100644
--- a/src/include/cpu/cpu.h
+++ b/src/include/cpu/cpu.h
@@ -7,7 +7,7 @@
void cpu_initialize(unsigned int cpu_index);
struct bus;
void initialize_cpus(struct bus *cpu_bus);
-void __attribute__((regparm(0))) secondary_cpu_init(unsigned int cpu_index);
+void asmlinkage secondary_cpu_init(unsigned int cpu_index);
#if CONFIG_HAVE_SMI_HANDLER
void smm_init(void);
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)