On Fri, Aug 1, 2014 at 7:48 AM, Denys Vlasenko <dvlas...@redhat.com> wrote: > 64-bit code was using six stack slots fewer by not saving/restoring > registers which a callee-preserved according to C ABI, > and not allocating space for them. > > Only when syscall needed a complete "struct pt_regs", > the complete area was allocated and filled in. > > This proved to be a source of significant obfuscation and subtle bugs. > For example, stub_fork had to pop the return address, > extend the struct, save registers, and push return address back. Ugly. > ia32_ptregs_common pops return address and "returns" via jmp insn, > throwing a wrench into CPU return stack cache. > > This patch changes code to always allocate a complete "struct pt_regs". > The saving of registers is still done lazily. > > Macros which manipulate "struct pt_regs" on stack are reworked: > ALLOC_PTREGS_ON_STACK allocates the structure. > SAVE_C_REGS saves to it those registers which are clobbered by C code. > SAVE_EXTRA_REGS saves to it all other registers. > Corresponding RESTORE_* and REMOVE_PTREGS_FROM_STACK macros reverse it.
Looks like a nice cleanup at the cost of extra 48 byte stack gap for fast path. I'm guessing the gap shouldn't affect performance, but would be nice to see performance numbers before/after. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/