2008-10-22 22:26:29 -07:00
# ifndef _ASM_X86_LINKAGE_H
# define _ASM_X86_LINKAGE_H
2008-01-30 13:31:07 +01:00
2009-03-09 20:19:51 +03:00
# include <linux/stringify.h>
2008-04-17 17:40:51 +02:00
# undef notrace
# define notrace __attribute__((no_instrument_function))
2007-10-11 11:20:03 +02:00
# ifdef CONFIG_X86_32
2008-01-30 13:31:07 +01:00
# define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
2008-04-10 15:37:38 -07:00
2008-04-10 17:35:23 -07:00
/*
* Make sure the compiler doesn ' t do anything stupid with the
* arguments on the stack - they are owned by the * caller * , not
* the callee . This just fools gcc into not spilling into them ,
* and keeps it from doing tailcall recursion and / or using the
* stack slots for temporaries , since they are live and " used "
* all the way to the end of the function .
*
* NOTE ! On x86 - 64 , all the arguments are in registers , so this
* only matters on a 32 - bit kernel .
*/
2008-04-10 15:37:38 -07:00
# define asmlinkage_protect(n, ret, args...) \
__asmlinkage_protect # # n ( ret , # # args )
# define __asmlinkage_protect_n(ret, args...) \
__asm__ __volatile__ ( " " : " =r " ( ret ) : " 0 " ( ret ) , # # args )
# define __asmlinkage_protect0(ret) \
__asmlinkage_protect_n ( ret )
# define __asmlinkage_protect1(ret, arg1) \
__asmlinkage_protect_n ( ret , " g " ( arg1 ) )
# define __asmlinkage_protect2(ret, arg1, arg2) \
__asmlinkage_protect_n ( ret , " g " ( arg1 ) , " g " ( arg2 ) )
# define __asmlinkage_protect3(ret, arg1, arg2, arg3) \
__asmlinkage_protect_n ( ret , " g " ( arg1 ) , " g " ( arg2 ) , " g " ( arg3 ) )
# define __asmlinkage_protect4(ret, arg1, arg2, arg3, arg4) \
__asmlinkage_protect_n ( ret , " g " ( arg1 ) , " g " ( arg2 ) , " g " ( arg3 ) , \
" g " ( arg4 ) )
# define __asmlinkage_protect5(ret, arg1, arg2, arg3, arg4, arg5) \
__asmlinkage_protect_n ( ret , " g " ( arg1 ) , " g " ( arg2 ) , " g " ( arg3 ) , \
" g " ( arg4 ) , " g " ( arg5 ) )
# define __asmlinkage_protect6(ret, arg1, arg2, arg3, arg4, arg5, arg6) \
__asmlinkage_protect_n ( ret , " g " ( arg1 ) , " g " ( arg2 ) , " g " ( arg3 ) , \
" g " ( arg4 ) , " g " ( arg5 ) , " g " ( arg6 ) )
2009-03-06 19:08:34 +03:00
# endif /* CONFIG_X86_32 */
# ifdef __ASSEMBLY__
2008-01-30 13:31:07 +01:00
2009-02-14 00:50:18 +03:00
# define GLOBAL(name) \
. globl name ; \
name :
2009-03-09 20:19:51 +03:00
# if defined(CONFIG_X86_64) || defined(CONFIG_X86_ALIGNMENT_16)
# define __ALIGN .p2align 4, 0x90
# define __ALIGN_STR __stringify(__ALIGN)
2008-01-30 13:31:07 +01:00
# endif
2009-03-06 19:08:34 +03:00
# endif /* __ASSEMBLY__ */
2008-10-22 22:26:29 -07:00
# endif /* _ASM_X86_LINKAGE_H */
2008-01-30 13:31:07 +01:00