• D
    x86/asm/entry/64: Always allocate a complete "struct pt_regs" on the kernel stack · 76f5df43
    Denys Vlasenko 提交于
    The 64-bit entry code was using six stack slots less by not
    saving/restoring registers which are callee-preserved according
    to the C ABI, and was not allocating space for them.
    
    Only when syscalls needed a complete "struct pt_regs" was
    the complete area allocated and filled in.
    
    As an additional twist, on interrupt entry a "slightly less
    truncated pt_regs" trick is used, to make nested interrupt
    stacks easier to unwind.
    
    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 the code to always allocate a complete
    "struct pt_regs" on the kernel stack. The saving of registers
    is still done lazily.
    
    "Partial pt_regs" trick on interrupt stack is retained.
    
    Macros which manipulate "struct pt_regs" on stack are reworked:
    
     - ALLOC_PT_GPREGS_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_PT_GPREGS_FROM_STACK macros
       reverse it.
    
    'ia32_ptregs_common', 'stub_fork' and friends lost their ugly dance
    with the return pointer.
    
    LOAD_ARGS32 in ia32entry.S now uses symbolic stack offsets
    instead of magic numbers.
    
    'error_entry' and 'save_paranoid' now use SAVE_C_REGS +
    SAVE_EXTRA_REGS instead of having it open-coded yet again.
    
    Patch was run-tested: 64-bit executables, 32-bit executables,
    strace works.
    
    Timing tests did not show measurable difference in 32-bit
    and 64-bit syscalls.
    Signed-off-by: NDenys Vlasenko <dvlasenk@redhat.com>
    Signed-off-by: NAndy Lutomirski <luto@amacapital.net>
    Cc: Alexei Starovoitov <ast@plumgrid.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Will Drewry <wad@chromium.org>
    Link: http://lkml.kernel.org/r/1423778052-21038-2-git-send-email-dvlasenk@redhat.com
    Link: http://lkml.kernel.org/r/b89763d354aa23e670b9bdf3a40ae320320a7c2e.1424989793.git.luto@amacapital.netSigned-off-by: NIngo Molnar <mingo@kernel.org>
    76f5df43
ia32entry.S 13.7 KB