From f0b0cf3b884f0ad5f62329ecd7248b20afc90a62 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Thu, 10 Apr 2008 17:35:23 -0700 Subject: [PATCH] --- yaml --- r: 88238 b: refs/heads/master c: d10d89ec78114f925f63c5126a2b2490f501a462 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/asm-x86/linkage.h | 11 +++++++++++ trunk/include/linux/linkage.h | 13 +++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 8bb667f05cda..3db9fed710a2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 598af051a79d05b751fe793f1fe09fcf74763e02 +refs/heads/master: d10d89ec78114f925f63c5126a2b2490f501a462 diff --git a/trunk/include/asm-x86/linkage.h b/trunk/include/asm-x86/linkage.h index d605eeba0f70..c048353f4b85 100644 --- a/trunk/include/asm-x86/linkage.h +++ b/trunk/include/asm-x86/linkage.h @@ -14,6 +14,17 @@ */ #define asmregparm __attribute__((regparm(3))) +/* + * 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. + */ #define asmlinkage_protect(n, ret, args...) \ __asmlinkage_protect##n(ret, ##args) #define __asmlinkage_protect_n(ret, args...) \ diff --git a/trunk/include/linux/linkage.h b/trunk/include/linux/linkage.h index fe2a39c489b6..b163c5c40dbc 100644 --- a/trunk/include/linux/linkage.h +++ b/trunk/include/linux/linkage.h @@ -17,6 +17,19 @@ # define asmregparm #endif +/* + * This is used by architectures to keep arguments on the stack + * untouched by the compiler by keeping them live until the end. + * The argument stack may be owned by the assembly-language + * caller, not the callee, and gcc doesn't always understand + * that. + * + * We have the return value, and a maximum of six arguments. + * + * This should always be followed by a "return ret" for the + * protection to work (ie no more work that the compiler might + * end up needing stack temporaries for). + */ #ifndef asmlinkage_protect # define asmlinkage_protect(n, ret, args...) do { } while (0) #endif