------- Comment #10 from acahalan at gmail dot com 2006-04-23 02:09 ------- A couple quotes from Linus on the linux-kernel mailing list, in response to the idea (expressed in comment #3 above) of having the assembly set up the normal stack:
-- 1 -- Sure, we could just do a slower system call entry. We always knew that. Suggesting that as the solution is pretty stupid, though. That's _the_ most timing-critical part in the whole kernel on many loads. We've literally spent time trying to remove single cycles there, and it matters. I'd much rather have an officially sanctioned way to do what Linux wants to do, but in the meantime, we can (and are forced to) rely on hacks like "prevent_tail_call()". They are hacks, and we _know_ they are hacks, but as long as gcc maintainers don't want to help us, we don't have much choice (although we could perhaps make the hacks a bit nicer ;). The fact is, the "official ABI" simply isn't appropriate. In fact, we don't use the "official ABI" _anywhere_ in the kernel any more, since we actually end up using other gcc calling conventions (ie regparm=3). Btw, this is not even unusual. A lot of embedded platforms have support for magic exception/interrupt calling conventions. Gcc even supports them: things like "__attribute__((interrupt))". This is also exactly analogous to stdcall/cdecl/regparm/longcall/naked/sp_switch/trap_exit etc attributes. So gcc already has support for the fact that people sometimes need special calling conventions. We've historically worked around it by hand instead, since our calling convention is very _close_ to the standard one In fact, the calling convention we want there is _so_ close to the standard one, that I'm not even convinced the i386 ABI really says that the callee owns the parameter space - it may well be a local gcc decision rather than any "official i386 ABI" issue. -- 2 -- I'd much rather have a real gcc attribute. I don't _like_ having horrible hacks like the above to make gcc do what I want it to do. And I know the gcc developers don't like it either when I force gcc to be my biatch. It would be much better for everybody if gcc helped a bit. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27234