From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753957AbbBKUbT (ORCPT ); Wed, 11 Feb 2015 15:31:19 -0500 Received: from mail-la0-f49.google.com ([209.85.215.49]:41832 "EHLO mail-la0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752614AbbBKUbR (ORCPT ); Wed, 11 Feb 2015 15:31:17 -0500 MIME-Version: 1.0 In-Reply-To: <1421272101-16847-1-git-send-email-dvlasenk@redhat.com> References: <1421272101-16847-1-git-send-email-dvlasenk@redhat.com> From: Andy Lutomirski Date: Wed, 11 Feb 2015 12:30:55 -0800 Message-ID: Subject: Re: [PATCH 01/11] x86: entry_64.S: always allocate complete "struct pt_regs" To: Denys Vlasenko Cc: Linus Torvalds , Oleg Nesterov , Borislav Petkov , "H. Peter Anvin" , Frederic Weisbecker , X86 ML , Alexei Starovoitov , Will Drewry , Kees Cook , "linux-kernel@vger.kernel.org" Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jan 14, 2015 at 1:48 PM, Denys Vlasenko wrote: > 64-bit code was using six stack slots less by not saving/restoring > registers which are 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. > 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 code to always allocate a complete "struct pt_regs". > The saving of registers is still done lazily. > > "Partial pt_regs" trick on interrupt stack is retained, but with added comments > which explain what we are doing, and why. Existing comments are improved. > > 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 > 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. > > Misleading and slightly wrong comments in "struct pt_regs" are fixed > (four instances). > > 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. I like this. However, can you split it? I think it would be easier to review and more bisect-friendly if there were first a patch to do all the macro and comment cleanup without any layout changes followed by bite-sized layout changes. As it stands, I can't just go through this to make sure that nothing is changing, because things are changing. --Andy