diff --git a/src/arch/i386/Makefile b/src/arch/i386/Makefile index 7d3e7639..e376b481 100644 --- a/src/arch/i386/Makefile +++ b/src/arch/i386/Makefile @@ -22,11 +22,11 @@ endif CFLAGS += -mpreferred-stack-boundary=2 # Code size reduction. Use regparm for all functions - C functions -# called from assembly (or vice versa) need __cdecl now +# called from assembly (or vice versa) need __asmcall now # CFLAGS += -mregparm=3 -# Code size reduction. Use -mrtd (same __cdecl requirements as above) +# Code size reduction. Use -mrtd (same __asmcall requirements as above) CFLAGS += -mrtd # Code size reduction. This is the logical complement to -mregparm=3. diff --git a/src/arch/i386/core/dumpregs.c b/src/arch/i386/core/dumpregs.c index 89426d58..a2777a0b 100644 --- a/src/arch/i386/core/dumpregs.c +++ b/src/arch/i386/core/dumpregs.c @@ -1,7 +1,7 @@ #include #include -void __cdecl _dump_regs ( struct i386_all_regs *ix86 ) { +void __asmcall _dump_regs ( struct i386_all_regs *ix86 ) { __asm__ __volatile__ ( TEXT16_CODE ( ".globl dump_regs\n\t" diff --git a/src/arch/i386/core/gdbmach.c b/src/arch/i386/core/gdbmach.c index d07663c4..97827ecb 100644 --- a/src/arch/i386/core/gdbmach.c +++ b/src/arch/i386/core/gdbmach.c @@ -142,7 +142,7 @@ static void gdbmach_enable_hwbps ( void ) { __asm__ __volatile__ ( "movl %0, %%dr7\n" : : "r" ( dr7 ) ); } -__cdecl void gdbmach_handler ( int signo, gdbreg_t *regs ) { +__asmcall void gdbmach_handler ( int signo, gdbreg_t *regs ) { gdbmach_disable_hwbps(); gdbstub_handler ( signo, regs ); gdbmach_enable_hwbps(); diff --git a/src/arch/i386/core/relocate.c b/src/arch/i386/core/relocate.c index fd8df087..bdc8498e 100644 --- a/src/arch/i386/core/relocate.c +++ b/src/arch/i386/core/relocate.c @@ -39,7 +39,7 @@ extern char _etextdata[]; * address space, and returns the physical address of the new location * to the prefix in %edi. */ -__cdecl void relocate ( struct i386_all_regs *ix86 ) { +__asmcall void relocate ( struct i386_all_regs *ix86 ) { struct memory_map memmap; unsigned long start, end, size, padded_size; unsigned long new_start, new_end; diff --git a/src/arch/i386/include/bits/compiler.h b/src/arch/i386/include/bits/compiler.h new file mode 100644 index 00000000..af796069 --- /dev/null +++ b/src/arch/i386/include/bits/compiler.h @@ -0,0 +1,11 @@ +#ifndef _BITS_COMPILER_H +#define _BITS_COMPILER_H + +#ifndef ASSEMBLY + +/** Declare a function with standard calling conventions */ +#define __asmcall __attribute__ (( cdecl, regparm(0) )) + +#endif /* ASSEMBLY */ + +#endif /* _BITS_COMPILER_H */ diff --git a/src/arch/i386/include/pxe_call.h b/src/arch/i386/include/pxe_call.h index 7a38d314..2f3ea15a 100644 --- a/src/arch/i386/include/pxe_call.h +++ b/src/arch/i386/include/pxe_call.h @@ -30,6 +30,6 @@ extern void pxe_hook_int1a ( void ); extern int pxe_unhook_int1a ( void ); extern void pxe_init_structures ( void ); extern int pxe_start_nbp ( void ); -extern __cdecl void pxe_api_call ( struct i386_all_regs *ix86 ); +extern __asmcall void pxe_api_call ( struct i386_all_regs *ix86 ); #endif /* _PXE_CALL_H */ diff --git a/src/arch/i386/include/setjmp.h b/src/arch/i386/include/setjmp.h index bb0a100d..60e4b120 100644 --- a/src/arch/i386/include/setjmp.h +++ b/src/arch/i386/include/setjmp.h @@ -6,7 +6,7 @@ #define JBLEN 6 typedef unsigned long jmp_buf[JBLEN]; -extern int __cdecl setjmp (jmp_buf env); -extern void __cdecl longjmp (jmp_buf env, int val); +extern int __asmcall setjmp (jmp_buf env); +extern void __asmcall longjmp (jmp_buf env, int val); #endif /* ETHERBOOT_SETJMP_H */ diff --git a/src/arch/i386/interface/pcbios/int13.c b/src/arch/i386/interface/pcbios/int13.c index 6f61e4a1..a18039e0 100644 --- a/src/arch/i386/interface/pcbios/int13.c +++ b/src/arch/i386/interface/pcbios/int13.c @@ -322,7 +322,7 @@ static int int13_get_extended_parameters ( struct int13_drive *drive, * INT 13 handler * */ -static __cdecl void int13 ( struct i386_all_regs *ix86 ) { +static __asmcall void int13 ( struct i386_all_regs *ix86 ) { int command = ix86->regs.ah; unsigned int bios_drive = ix86->regs.dl; struct int13_drive *drive; diff --git a/src/arch/i386/interface/pxe/pxe_call.c b/src/arch/i386/interface/pxe/pxe_call.c index 7122c4eb..04aaf3b2 100644 --- a/src/arch/i386/interface/pxe/pxe_call.c +++ b/src/arch/i386/interface/pxe/pxe_call.c @@ -119,7 +119,7 @@ static PXENV_EXIT_t pxenv_unknown ( struct s_PXENV_UNKNOWN *pxenv_unknown ) { * @v es:di Address of PXE parameter block * @ret ax PXE exit code */ -__cdecl void pxe_api_call ( struct i386_all_regs *ix86 ) { +__asmcall void pxe_api_call ( struct i386_all_regs *ix86 ) { int opcode = ix86->regs.bx; userptr_t parameters = real_to_user ( ix86->segs.es, ix86->regs.di ); size_t param_len; @@ -339,7 +339,7 @@ __cdecl void pxe_api_call ( struct i386_all_regs *ix86 ) { * @v es:di Address of PXE parameter block * @ret ax PXE exit code */ -__cdecl void pxe_loader_call ( struct i386_all_regs *ix86 ) { +__asmcall void pxe_loader_call ( struct i386_all_regs *ix86 ) { userptr_t uparams = real_to_user ( ix86->segs.es, ix86->regs.di ); struct s_UNDI_LOADER params; PXENV_EXIT_t ret; diff --git a/src/arch/i386/interface/syslinux/com32_call.c b/src/arch/i386/interface/syslinux/com32_call.c index 586730cf..4a782dce 100644 --- a/src/arch/i386/interface/syslinux/com32_call.c +++ b/src/arch/i386/interface/syslinux/com32_call.c @@ -41,7 +41,7 @@ uint16_t __bss16 ( com32_saved_sp ); /** * Interrupt call helper */ -void __cdecl com32_intcall ( uint8_t interrupt, physaddr_t inregs_phys, physaddr_t outregs_phys ) { +void __asmcall com32_intcall ( uint8_t interrupt, physaddr_t inregs_phys, physaddr_t outregs_phys ) { memcpy_user ( virt_to_user( &com32_regs ), 0, phys_to_user ( inregs_phys ), 0, @@ -111,7 +111,7 @@ void __cdecl com32_intcall ( uint8_t interrupt, physaddr_t inregs_phys, physaddr /** * Farcall helper */ -void __cdecl com32_farcall ( uint32_t proc, physaddr_t inregs_phys, physaddr_t outregs_phys ) { +void __asmcall com32_farcall ( uint32_t proc, physaddr_t inregs_phys, physaddr_t outregs_phys ) { memcpy_user ( virt_to_user( &com32_regs ), 0, phys_to_user ( inregs_phys ), 0, @@ -170,7 +170,7 @@ void __cdecl com32_farcall ( uint32_t proc, physaddr_t inregs_phys, physaddr_t o /** * CDECL farcall helper */ -int __cdecl com32_cfarcall ( uint32_t proc, physaddr_t stack, size_t stacksz ) { +int __asmcall com32_cfarcall ( uint32_t proc, physaddr_t stack, size_t stacksz ) { int32_t eax; copy_user_to_rm_stack ( phys_to_user ( stack ), stacksz ); diff --git a/src/arch/i386/interface/syslinux/comboot_call.c b/src/arch/i386/interface/syslinux/comboot_call.c index 5a400ede..977d44f3 100644 --- a/src/arch/i386/interface/syslinux/comboot_call.c +++ b/src/arch/i386/interface/syslinux/comboot_call.c @@ -212,7 +212,7 @@ void comboot_run_kernel ( ) /** * Terminate program interrupt handler */ -static __cdecl void int20 ( struct i386_all_regs *ix86 __unused ) { +static __asmcall void int20 ( struct i386_all_regs *ix86 __unused ) { longjmp ( comboot_return, COMBOOT_RETURN_EXIT ); } @@ -220,7 +220,7 @@ static __cdecl void int20 ( struct i386_all_regs *ix86 __unused ) { /** * DOS-compatible API */ -static __cdecl void int21 ( struct i386_all_regs *ix86 ) { +static __asmcall void int21 ( struct i386_all_regs *ix86 ) { ix86->flags |= CF; switch ( ix86->regs.ah ) { @@ -287,7 +287,7 @@ static __cdecl void int21 ( struct i386_all_regs *ix86 ) { /** * SYSLINUX API */ -static __cdecl void int22 ( struct i386_all_regs *ix86 ) { +static __asmcall void int22 ( struct i386_all_regs *ix86 ) { ix86->flags |= CF; switch ( ix86->regs.ax ) { diff --git a/src/core/main.c b/src/core/main.c index aaf8111b..120f87f8 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -34,7 +34,7 @@ static struct feature features_end[0] __table_end ( struct feature, features ); * * @ret rc Return status code */ -__cdecl int main ( void ) { +__asmcall int main ( void ) { struct feature *feature; initialise(); diff --git a/src/include/compiler.h b/src/include/compiler.h index b6a6f8e2..4140a356 100644 --- a/src/include/compiler.h +++ b/src/include/compiler.h @@ -302,9 +302,6 @@ int __debug_disable; /** Declare a variable or data structure as unused. */ #define __unused __attribute__ (( unused )) -/** Apply standard C calling conventions */ -#define __cdecl __attribute__ (( cdecl , regparm(0) )) - /** * Declare a function as pure - i.e. without side effects */ @@ -372,4 +369,6 @@ int __debug_disable; #endif /* ASSEMBLY */ +#include + #endif /* COMPILER_H */ diff --git a/src/include/stdlib.h b/src/include/stdlib.h index f3dc7e41..838a22ac 100644 --- a/src/include/stdlib.h +++ b/src/include/stdlib.h @@ -68,6 +68,6 @@ static inline void srand ( unsigned int seed ) { */ extern int system ( const char *command ); -extern __cdecl int main ( void ); +extern __asmcall int main ( void ); #endif /* STDLIB_H */