]> err.no Git - linux-2.6/commitdiff
Add commentary about the new "asmlinkage_protect()" macro
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 11 Apr 2008 00:35:23 +0000 (17:35 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 11 Apr 2008 00:35:23 +0000 (17:35 -0700)
It's really a pretty ugly thing to need, and some day it will hopefully
be obviated by teaching gcc about the magic calling conventions for the
low-level system call code, but in the meantime we can at least add big
honking comments about why we need these insane and strange macros.

I took my comments from my version of the macro, but I ended up deciding
to just pick Roland's version of the actual code instead (with his
prettier syntax that uses vararg macros).  Thus the previous two commits
that actually implement it.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/asm-x86/linkage.h
include/linux/linkage.h

index d605eeba0f700292f1373d36167c97e79a4ae006..c048353f4b8558f73b8939980c8de947a5fd0513 100644 (file)
  */
 #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...) \
index fe2a39c489b6735f396d5f661c4b0c1781f2c230..b163c5c40dbcf2bb7a156d8a04b4f88731c025d7 100644 (file)
 # 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