All of lore.kernel.org
 help / color / mirror / Atom feed
From: Borislav Petkov <bp@alien8.de>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Garnier <thgarnie@chromium.org>,
	kernel-hardening@lists.openwall.com, kristen@linux.intel.com,
	keescook@chromium.org, Juergen Gross <jgross@suse.com>,
	Thomas Hellstrom <thellstrom@vmware.com>,
	"VMware, Inc." <pv-drivers@vmware.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	x86@kernel.org, virtualization@lists.linux-foundation.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v9 10/11] x86/paravirt: Adapt assembly for PIE support
Date: Mon, 12 Aug 2019 14:55:40 +0200	[thread overview]
Message-ID: <20190812125540.GD23772@zn.tnic> (raw)
In-Reply-To: <20190731125306.GU31381@hirez.programming.kicks-ass.net>

On Wed, Jul 31, 2019 at 02:53:06PM +0200, Peter Zijlstra wrote:
> On Tue, Jul 30, 2019 at 12:12:54PM -0700, Thomas Garnier wrote:
> > if PIE is enabled, switch the paravirt assembly constraints to be
> > compatible. The %c/i constrains generate smaller code so is kept by
> > default.
> > 
> > Position Independent Executable (PIE) support will allow to extend the
> > KASLR randomization range below 0xffffffff80000000.
> > 
> > Signed-off-by: Thomas Garnier <thgarnie@chromium.org>
> > Acked-by: Juergen Gross <jgross@suse.com>
> > ---
> >  arch/x86/include/asm/paravirt_types.h | 25 +++++++++++++++++++++----
> >  1 file changed, 21 insertions(+), 4 deletions(-)
> > 
> > diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
> > index 70b654f3ffe5..fd7dc37d0010 100644
> > --- a/arch/x86/include/asm/paravirt_types.h
> > +++ b/arch/x86/include/asm/paravirt_types.h
> > @@ -338,9 +338,25 @@ extern struct paravirt_patch_template pv_ops;
> >  #define PARAVIRT_PATCH(x)					\
> >  	(offsetof(struct paravirt_patch_template, x) / sizeof(void *))
> >  
> > +#ifdef CONFIG_X86_PIE
> > +#define paravirt_opptr_call "a"
> > +#define paravirt_opptr_type "p"
> > +
> > +/*
> > + * Alternative patching requires a maximum of 7 bytes but the relative call is
> > + * only 6 bytes. If PIE is enabled, add an additional nop to the call
> > + * instruction to ensure patching is possible.
> > + */
> > +#define PARAVIRT_CALL_POST  "nop;"
> 
> I'm confused; where does the 7 come from? The relative call is 6 bytes,

Well, before it, the relative CALL is a CALL reg/mem64, i.e. the target
is mem64. For example:


ffffffff81025c45:       ff 14 25 68 37 02 82    callq  *0xffffffff82023768

That address there is practically pv_ops + offset.

Now, in the opcode bytes you have 0xff opcode, ModRM byte 0x14 and SIB
byte 0x25, and 4 bytes imm32 offset. And this is 7 bytes.

What it becomes is:

ffffffff81025cd0:       ff 15 fa d9 ff 00       callq  *0xffd9fa(%rip)        # ffffffff820236d0 <pv_ops+0x30>
ffffffff81025cd6:       90                      nop

which is a RIP-relative, i.e., opcode 0xff, ModRM byte 0x15 and imm32.
And this is 6 bytes.

And since the paravirt patching doesn't do NOP padding like the
alternatives patching does, you need to pad with a byte.

Thomas, please add the gist of this to the comments because this
incomprehensible machinery better be documented as detailed as possible.

Thx.

-- 
Regards/Gruss,
    Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.

  reply	other threads:[~2019-08-12 12:55 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-30 19:12 [PATCH v9 00/11] x86: PIE support to extend KASLR randomization Thomas Garnier
2019-07-30 19:12 ` [PATCH v9 01/11] x86/crypto: Adapt assembly for PIE support Thomas Garnier
2019-08-05 16:32   ` Borislav Petkov
2019-08-05 16:54     ` Kees Cook
2019-08-05 17:27       ` Borislav Petkov
2019-08-05 17:53         ` Thomas Garnier
2019-07-30 19:12 ` [PATCH v9 02/11] x86: Add macro to get symbol address " Thomas Garnier
2019-07-30 19:12 ` [PATCH v9 03/11] x86: relocate_kernel - Adapt assembly " Thomas Garnier
2019-07-30 19:12 ` [PATCH v9 04/11] x86/entry/64: " Thomas Garnier
2019-08-05 17:28   ` Borislav Petkov
2019-08-05 17:50     ` Thomas Garnier
2019-08-06  5:08       ` Borislav Petkov
2019-08-06  8:30         ` Peter Zijlstra
2019-08-06 12:35           ` Borislav Petkov
2019-08-06 13:59     ` Steven Rostedt
2019-08-06 15:35       ` Borislav Petkov
2019-07-30 19:12 ` [PATCH v9 05/11] x86: pm-trace - " Thomas Garnier
2019-07-30 19:12 ` [PATCH v9 06/11] x86/CPU: " Thomas Garnier
2019-07-30 19:12 ` [PATCH v9 07/11] x86/acpi: " Thomas Garnier
2019-07-30 19:12 ` [PATCH v9 08/11] x86/boot/64: " Thomas Garnier
2019-08-09 17:30   ` Borislav Petkov
2019-10-29 21:29     ` Thomas Garnier
2019-07-30 19:12 ` [PATCH v9 09/11] x86/power/64: " Thomas Garnier
2019-07-30 19:12 ` [PATCH v9 10/11] x86/paravirt: " Thomas Garnier
2019-07-31 12:53   ` Peter Zijlstra
2019-08-12 12:55     ` Borislav Petkov [this message]
2019-10-29 21:30       ` Thomas Garnier
2019-10-29 21:30       ` Thomas Garnier
2019-08-12 12:55     ` Borislav Petkov
2019-07-31 12:53   ` Peter Zijlstra
2019-07-30 19:12 ` Thomas Garnier
2019-07-30 19:12 ` [PATCH v9 11/11] x86/alternatives: " Thomas Garnier
2019-08-12 13:57   ` Borislav Petkov
2019-10-29 21:31     ` Thomas Garnier
2019-08-06 15:43 ` [PATCH v9 00/11] x86: PIE support to extend KASLR randomization Borislav Petkov
2019-08-06 15:50   ` Peter Zijlstra
2019-08-06 15:50     ` Peter Zijlstra
2019-08-29 19:55     ` Thomas Garnier
2019-09-06 23:22       ` Thomas Garnier
2019-09-06 23:22         ` Thomas Garnier
2019-08-29 19:55     ` Thomas Garnier
2019-08-06 15:43 ` Borislav Petkov

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=20190812125540.GD23772@zn.tnic \
    --to=bp@alien8.de \
    --cc=hpa@zytor.com \
    --cc=jgross@suse.com \
    --cc=keescook@chromium.org \
    --cc=kernel-hardening@lists.openwall.com \
    --cc=kristen@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=pv-drivers@vmware.com \
    --cc=tglx@linutronix.de \
    --cc=thellstrom@vmware.com \
    --cc=thgarnie@chromium.org \
    --cc=virtualization@lists.linux-foundation.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.