![]() | ||||||||||
Messages in this thread |
On Tue, 17 Dec 2002, H. Peter Anvin wrote: > > This confuses me -- there seems to be no reason this shouldn't work as > long as %esp == %ebp on sysexit. The SYSEXIT-trashed GPRs seem like a > bigger problem. The thing is, the argument save area == the kernel stack frame. This is part of the reason why Linux has very fast system calls - there is absolutely _zero_ extraneous setup. No argument fetching and marshalling, it's all part of just setting up the regular kernel stack. So to get the right argument in arg6, the argument _needs_ to be saved in the %ebp entry on the kernel stack. Which means that on return from the system call (which may not actually be through a "sysenter" at all, if signals happen it will go through the generic paths), %ebp will have been updated as part of the kernel stack unwinding. Which is ok for a regular fast system call (ebp will get restored immediately), but it is NOT ok for the system call restart case, since in that case we want %ebp to contain the old stack pointer, not the sixth argument. If we just save the stack pointer value (== the initial %ebx value), the right thing will get restored, but then system calls will see the stack pointer value as arg6 - because of the 1:1 relationship between arguments and stack save. Linus - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ | |||||||||
| Last update: 2005-03-22 11:31 [W:0.713 / U:0.100 seconds] ©2003-2008 Jasper Spaans | ||||||||||