diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-x86/linkage.h | 11 | ||||
-rw-r--r-- | include/linux/linkage.h | 13 |
2 files changed, 24 insertions, 0 deletions
diff --git a/include/asm-x86/linkage.h b/include/asm-x86/linkage.h index d605eeba0f70..c048353f4b85 100644 --- a/include/asm-x86/linkage.h +++ b/include/asm-x86/linkage.h | |||
@@ -14,6 +14,17 @@ | |||
14 | */ | 14 | */ |
15 | #define asmregparm __attribute__((regparm(3))) | 15 | #define asmregparm __attribute__((regparm(3))) |
16 | 16 | ||
17 | /* | ||
18 | * Make sure the compiler doesn't do anything stupid with the | ||
19 | * arguments on the stack - they are owned by the *caller*, not | ||
20 | * the callee. This just fools gcc into not spilling into them, | ||
21 | * and keeps it from doing tailcall recursion and/or using the | ||
22 | * stack slots for temporaries, since they are live and "used" | ||
23 | * all the way to the end of the function. | ||
24 | * | ||
25 | * NOTE! On x86-64, all the arguments are in registers, so this | ||
26 | * only matters on a 32-bit kernel. | ||
27 | */ | ||
17 | #define asmlinkage_protect(n, ret, args...) \ | 28 | #define asmlinkage_protect(n, ret, args...) \ |
18 | __asmlinkage_protect##n(ret, ##args) | 29 | __asmlinkage_protect##n(ret, ##args) |
19 | #define __asmlinkage_protect_n(ret, args...) \ | 30 | #define __asmlinkage_protect_n(ret, args...) \ |
diff --git a/include/linux/linkage.h b/include/linux/linkage.h index fe2a39c489b6..b163c5c40dbc 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h | |||
@@ -17,6 +17,19 @@ | |||
17 | # define asmregparm | 17 | # define asmregparm |
18 | #endif | 18 | #endif |
19 | 19 | ||
20 | /* | ||
21 | * This is used by architectures to keep arguments on the stack | ||
22 | * untouched by the compiler by keeping them live until the end. | ||
23 | * The argument stack may be owned by the assembly-language | ||
24 | * caller, not the callee, and gcc doesn't always understand | ||
25 | * that. | ||
26 | * | ||
27 | * We have the return value, and a maximum of six arguments. | ||
28 | * | ||
29 | * This should always be followed by a "return ret" for the | ||
30 | * protection to work (ie no more work that the compiler might | ||
31 | * end up needing stack temporaries for). | ||
32 | */ | ||
20 | #ifndef asmlinkage_protect | 33 | #ifndef asmlinkage_protect |
21 | # define asmlinkage_protect(n, ret, args...) do { } while (0) | 34 | # define asmlinkage_protect(n, ret, args...) do { } while (0) |
22 | #endif | 35 | #endif |