All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: LKML <linux-kernel@vger.kernel.org>,
	x86@kernel.org, Juergen Gross <jgross@suse.com>,
	Andi Kleen <ak@linux.intel.com>
Subject: Re: [patch 3/3] x86/paravirt: Replace paravirt patch asm magic
Date: Thu, 25 Apr 2019 08:52:09 +0200	[thread overview]
Message-ID: <20190425065209.GA89582@gmail.com> (raw)
In-Reply-To: <20190424134223.690835713@linutronix.de>


* Thomas Gleixner <tglx@linutronix.de> wrote:

> The magic macro DEF_NATIVE() in the paravirt patching code uses inline
> assembly to generate a data table for patching in the native instructions.
> 
> While clever this is falling apart with LTO and even aside of LTO the
> construct is just working by chance according to GCC folks.
> 
> Aside of that the tables are constant data and not some form of magic
> text.
> 
> As these constructs are not subject to frequent changes it is not a
> maintenance issue to convert them to regular data tables which are
> initialized with hex bytes.
> 
> Create a new set of macros and data structures to store the instruction
> sequences and convert the code over.
> 
> Reported-by: Andi Kleen <ak@linux.intel.com>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

> -# ifdef CONFIG_PARAVIRT_XXL
> -DEF_NATIVE(irq, irq_disable, "cli");
> -DEF_NATIVE(irq, irq_enable, "sti");
> -DEF_NATIVE(irq, restore_fl, "push %eax; popf");
> -DEF_NATIVE(irq, save_fl, "pushf; pop %eax");
> -DEF_NATIVE(cpu, iret, "iret");
> -DEF_NATIVE(mmu, read_cr2, "mov %cr2, %eax");
> -DEF_NATIVE(mmu, write_cr3, "mov %eax, %cr3");
> -DEF_NATIVE(mmu, read_cr3, "mov %cr3, %eax");

> +static const struct patch_xxl patch_data_xxl = {
> +	.irq_irq_disable	= { 0xfa },		// cli
> +	.irq_irq_enable		= { 0xfb },		// sti
> +	.irq_save_fl		= { 0x9c, 0x58 },	// pushf; pop %[re]ax
> +	.mmu_read_cr2		= { 0x0f, 0x20, 0xd0 },	// mov %cr2, %[re]ax
> +	.mmu_read_cr3		= { 0x0f, 0x20, 0xd8 },	// mov %cr3, %[re]ax
> +# ifdef CONFIG_X86_64
> +	.irq_restore_fl		= { 0x57, 0x9d },	// push %rdi; popfq
> +	.mmu_write_cr3		= { 0x0f, 0x22, 0xdf },	// mov %rdi, %cr3
> +	.cpu_wbinvd		= { 0x0f, 0x09 },	// wbinvd
> +	.cpu_usergs_sysret64	= { 0x0f, 0x01, 0xf8,
> +				    0x48, 0x0f, 0x07 },	// swapgs; sysretq
> +	.cpu_swapgs		= { 0x0f, 0x01, 0xf8 },	// swapgs
> +	.mov64			= { 0x48, 0x89, 0xf8 },	// mov %rdi, %rax
> +# else
> +	.irq_restore_fl		= { 0x50, 0x9d },	// push %eax; popf
> +	.mmu_write_cr3		= { 0x0f, 0x22, 0xd8 },	// mov %eax, %cr3
> +	.cpu_iret		= { 0xcf },		// iret
> +# endif

I think these open-coded hexa versions are somewhat fragile as well, how 
about putting these into a .S file and controlling the sections in an LTO 
safe manner there?

That will also allow us to write proper asm, and global labels can be 
used to extract the patchlets and their length?

Thanks,

	Ingo

  reply	other threads:[~2019-04-25  6:52 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-24 13:41 [patch 0/3] x86/paravirt: Rework paravirt patching Thomas Gleixner
2019-04-24 13:41 ` [patch 1/3] x86/paravirt: Remove bogus extern declarations Thomas Gleixner
2019-04-25  7:31   ` [tip:x86/paravirt] " tip-bot for Thomas Gleixner
2019-05-24  7:58   ` tip-bot for Thomas Gleixner
2019-04-24 13:41 ` [patch 2/3] x86/paravirt: Unify 32/64 bit patch code Thomas Gleixner
2019-04-25  7:32   ` [tip:x86/paravirt] " tip-bot for Thomas Gleixner
2019-05-24  8:00   ` [tip:x86/paravirt] x86/paravirt: Unify the 32/64 bit paravirt patching code tip-bot for Thomas Gleixner
2019-04-24 13:41 ` [patch 3/3] x86/paravirt: Replace paravirt patch asm magic Thomas Gleixner
2019-04-25  6:52   ` Ingo Molnar [this message]
2019-04-25  7:22     ` Thomas Gleixner
2019-04-25  7:46       ` Juergen Gross
2019-04-25  8:10       ` [PATCH] x86/paravirt: Match paravirt patchlet field definition ordering to initialization ordering Ingo Molnar
2019-04-25  9:17         ` [PATCH] x86/paravirt: Detect oversized patching bugs as they happen and BUG_ON() to avoid later crashes Ingo Molnar
2019-04-25  9:21           ` Peter Zijlstra
2019-04-25  9:50             ` x86/paravirt: Detect over-sized patching bugs in paravirt_patch_call() Ingo Molnar
2019-04-25 10:22               ` Peter Zijlstra
2019-04-25 10:57                 ` Ingo Molnar
2019-04-25 11:30                   ` Juergen Gross
2019-04-25 12:30                     ` Juergen Gross
2019-04-25 11:40                   ` Peter Zijlstra
2019-04-25 12:30                     ` Peter Zijlstra
2019-05-24  7:59               ` [tip:x86/paravirt] " tip-bot for Ingo Molnar
2019-05-24  7:58           ` [tip:x86/paravirt] x86/paravirt: Detect over-sized patching bugs in paravirt_patch_insns() tip-bot for Ingo Molnar
2019-05-24  8:01         ` [tip:x86/paravirt] x86/paravirt: Match paravirt patchlet field definition ordering to initialization ordering tip-bot for Ingo Molnar
2019-04-25  8:08     ` [patch 3/3] x86/paravirt: Replace paravirt patch asm magic Peter Zijlstra
2019-04-25  8:19       ` Peter Zijlstra
2019-04-25  9:20       ` Ingo Molnar
2019-05-24  8:00   ` [tip:x86/paravirt] x86/paravirt: Replace the " tip-bot for Thomas Gleixner

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=20190425065209.GA89582@gmail.com \
    --to=mingo@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=jgross@suse.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --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.