All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frederic Weisbecker <fweisbec@gmail.com>
To: Denys Vlasenko <dvlasenk@redhat.com>
Cc: linux-kernel@vger.kernel.org, Oleg Nesterov <oleg@redhat.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Andy Lutomirski <luto@amacapital.net>, X86 ML <x86@kernel.org>,
	Alexei Starovoitov <ast@plumgrid.com>,
	Will Drewry <wad@chromium.org>, Kees Cook <keescook@chromium.org>
Subject: Re: [PATCH 4/5] x86: entry_64.S: always allocate complete "struct pt_regs"
Date: Sat, 2 Aug 2014 00:52:16 +0200	[thread overview]
Message-ID: <20140801225214.GA26491@localhost.localdomain> (raw)
In-Reply-To: <1406904498-21647-4-git-send-email-dvlasenk@redhat.com>

On Fri, Aug 01, 2014 at 04:48:17PM +0200, Denys Vlasenko 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.
> 
> ia32_ptregs_common, stub_fork and friends lost their ugly dance with
> return pointer.
> 
> LOAD_ARGS32 in ia32entry.S now uses a symbolic stack offsets
> instead of magic numbers.
> 
> 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.
> 
> Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
> CC: Oleg Nesterov <oleg@redhat.com>
> CC: "H. Peter Anvin" <hpa@zytor.com>
> CC: Andy Lutomirski <luto@amacapital.net>
> CC: Frederic Weisbecker <fweisbec@gmail.com>
> CC: X86 ML <x86@kernel.org>
> CC: Alexei Starovoitov <ast@plumgrid.com>
> CC: Will Drewry <wad@chromium.org>
> CC: Kees Cook <keescook@chromium.org>
> CC: linux-kernel@vger.kernel.org
> ---
>  arch/x86/ia32/ia32entry.S              |  47 +++----
>  arch/x86/include/asm/calling.h         | 224 ++++++++++++++++-----------------
>  arch/x86/include/asm/irqflags.h        |   4 +-
>  arch/x86/include/asm/ptrace.h          |  13 +-
>  arch/x86/include/uapi/asm/ptrace-abi.h |  16 ++-
>  arch/x86/include/uapi/asm/ptrace.h     |  13 +-
>  arch/x86/kernel/entry_64.S             | 132 ++++++++-----------
>  arch/x86/kernel/preempt.S              |  16 ++-
>  8 files changed, 232 insertions(+), 233 deletions(-)
> 
> diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S
> index 4299eb0..ef9ee16 100644
> --- a/arch/x86/ia32/ia32entry.S
> +++ b/arch/x86/ia32/ia32entry.S
> @@ -62,12 +62,12 @@
>  	 */
>  	.macro LOAD_ARGS32 offset, _r9=0
>  	.if \_r9
> -	movl \offset+16(%rsp),%r9d
> +	movl \offset+R9(%rsp),%r9d
>  	.endif
> -	movl \offset+40(%rsp),%ecx
> -	movl \offset+48(%rsp),%edx
> -	movl \offset+56(%rsp),%esi
> -	movl \offset+64(%rsp),%edi
> +	movl \offset+RCX(%rsp),%ecx
> +	movl \offset+RDX(%rsp),%edx
> +	movl \offset+RSI(%rsp),%esi
> +	movl \offset+RDI(%rsp),%edi
>  	movl %eax,%eax			/* zero extension */
>  	.endm
>  	
> @@ -144,7 +144,8 @@ ENTRY(ia32_sysenter_target)
>  	CFI_REL_OFFSET rip,0
>  	pushq_cfi %rax
>  	cld
> -	SAVE_ARGS 0,1,0
> +	ALLOC_PTREGS_ON_STACK
> +	SAVE_C_REGS_EXCEPT_R891011
>   	/* no need to do an access_ok check here because rbp has been
>   	   32bit zero extended */ 
>  	ASM_STAC
> @@ -172,7 +173,8 @@ sysexit_from_sys_call:
>  	andl  $~0x200,EFLAGS-R11(%rsp) 
>  	movl	RIP-R11(%rsp),%edx		/* User %eip */
>  	CFI_REGISTER rip,rdx
> -	RESTORE_ARGS 0,24,0,0,0,0
> +	RESTORE_RSI_RDI

I heard there will be a v2 so I'll probably wait for it to review this patch
which really requires 0db where I sit.

But the macro names like above look much clearer as well!

  parent reply	other threads:[~2014-08-01 22:52 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-01 14:48 [PATCH 1/5] x86: entry_64.S: delete unused code Denys Vlasenko
2014-08-01 14:48 ` [PATCH 2/5] x86: open-code register save/restore in trace_hardirqs thunks Denys Vlasenko
2014-08-01 14:48 ` [PATCH 3/5] x86: entry_64.S: fold SAVE_ARGS_IRQ macro into its sole user Denys Vlasenko
2014-08-01 18:30   ` Frederic Weisbecker
2014-08-01 14:48 ` [PATCH 4/5] x86: entry_64.S: always allocate complete "struct pt_regs" Denys Vlasenko
2014-08-01 17:04   ` Andy Lutomirski
2014-08-04 14:28     ` Denys Vlasenko
2014-08-04 14:47       ` Oleg Nesterov
2014-08-04 15:34         ` Oleg Nesterov
2014-08-04 21:03       ` Andy Lutomirski
2014-08-04 21:23         ` Borislav Petkov
2014-08-05 10:35         ` Denys Vlasenko
2014-08-05 14:53           ` Andy Lutomirski
2014-08-05 15:17             ` Denys Vlasenko
2014-08-05 23:02               ` Andy Lutomirski
2014-08-07  9:54             ` Denys Vlasenko
2014-08-01 18:09   ` Alexei Starovoitov
2014-08-01 18:30   ` Oleg Nesterov
2014-08-01 18:35   ` H. Peter Anvin
2014-08-01 22:11     ` Denys Vlasenko
2014-08-01 22:13       ` H. Peter Anvin
2014-08-02 21:14         ` Andy Lutomirski
2014-08-02 21:23           ` H. Peter Anvin
2014-08-02 21:38             ` Andy Lutomirski
2014-08-01 22:52   ` Frederic Weisbecker [this message]
2014-08-01 23:19   ` Frederic Weisbecker
2014-08-04  3:03     ` Denys Vlasenko
2014-08-04  7:57       ` Borislav Petkov
2014-08-11  0:46       ` Frederic Weisbecker
2014-08-11  8:40         ` Jan Beulich
2014-08-11  9:07           ` Andy Lutomirski
2014-08-11  9:31             ` Jan Beulich
2014-08-11 13:26           ` Denys Vlasenko
2014-08-11 14:17             ` Jan Beulich
2014-08-11 14:53               ` H. Peter Anvin
2014-08-11 15:08                 ` Jan Beulich
2014-08-11 15:13                   ` H. Peter Anvin
2014-08-12  9:31                     ` Denys Vlasenko
2014-08-12  9:50                       ` Jan Beulich
2014-08-01 14:48 ` [PATCH 5/5] x86: mass removal of ARGOFFSET Denys Vlasenko
2014-08-01 18:00 ` [PATCH 1/5] x86: entry_64.S: delete unused code Frederic Weisbecker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140801225214.GA26491@localhost.localdomain \
    --to=fweisbec@gmail.com \
    --cc=ast@plumgrid.com \
    --cc=dvlasenk@redhat.com \
    --cc=hpa@zytor.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=oleg@redhat.com \
    --cc=wad@chromium.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.