All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
To: Dave Hansen <dave.hansen@intel.com>
Cc: linux-kernel@vger.kernel.org, x86@kernel.org,
	"Andy Lutomirski" <luto@kernel.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Radim Krčmář" <rkrcmar@redhat.com>,
	kvm@vger.kernel.org, "Jason A. Donenfeld" <Jason@zx2c4.com>,
	"Rik van Riel" <riel@surriel.com>,
	"Dave Hansen" <dave.hansen@linux.intel.com>
Subject: Re: [PATCH 14/22] x86/fpu: Eager switch PKRU state
Date: Mon, 11 Mar 2019 15:30:50 +0100	[thread overview]
Message-ID: <20190311143049.hclnlciq4rzqrtp6@linutronix.de> (raw)
In-Reply-To: <20190311110605.2xxjx2ym3n63lpr2@linutronix.de>

On 2019-03-11 12:06:05 [+0100], To Dave Hansen wrote:
> On 2019-03-08 11:01:25 [-0800], Dave Hansen wrote:
> > On 3/8/19 10:08 AM, Sebastian Andrzej Siewior wrote:
> > > On 2019-02-25 10:16:24 [-0800], Dave Hansen wrote:
> > >>> +	if (!cpu_feature_enabled(X86_FEATURE_OSPKE))
> > >>> +		return;
> > >>> +
> > >>> +	if (current->mm) {
> > >>> +		pk = get_xsave_addr(&new_fpu->state.xsave, XFEATURE_PKRU);
> > >>> +		WARN_ON_ONCE(!pk);
> …
> > Nothing will break, but the warning will trigger, which isn't nice.
> 
> the warning should trigger if something goes south, I was not expecting
> it to happen.
> 
> > > My understanding is that the in-kernel XSAVE will always save everything
> > > so we should never "lose" the XFEATURE_PKRU no matter what user space
> > > does.
> > > 
> > > So as test case you want
> > > 	xsave (-1 & ~XFEATURE_PKRU)
> > > 	xrestore (-1 & ~XFEATURE_PKRU)
> > > 
> > > in userland and then a context switch to see if the warning above
> > > triggers?
> > 
> > I think you need an XRSTOR with RFBM=-1 (or at least with the PKRU bit
> > set) and the PKRU bit in the XFEATURES field in the XSAVE buffer set to 0.
> 
> let me check that, write a test case in userland and I come back with
> the results. I can remove that warning but I wasn't expecting it to
> trigger so let me verify that first.

so I made dis:
	https://breakpoint.cc/tc-xsave.c

and it doesn't trigger. 
XSAVE saves what is specified and enabled. XRSTOR restores what is
specified, available in the header and enabled. Which means even if
userland disables a bit in the header, it is still available during
context switch by kernel's XSAVE as long as it is set in XSTATE_BV.
The user can't use XSETBV (can only query via XGETBV) which means that
XFEATURE_PKRU can't be removed by the user.

But you got me thinking: During signal delivery we save tasks' FPU
content on the signal stack. If the signal handler removes
XFEATURE_PKRU bit then __fpu__restore_sig() will load the "missing
state" from init_fpstate. Which means that the protection key will be
set to zero. Not sure we want this or not but this the case. A XRSTOR in
userland without XFEATURE_PKRU would leave the PKRU state unchanged.

The test case from above does this if you want to double check.

Sebastian

  reply	other threads:[~2019-03-11 14:30 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-21 11:49 [PATCH v7] x86: load FPU registers on return to userland Sebastian Andrzej Siewior
2019-02-21 11:49 ` [PATCH 01/22] x86/fpu: Remove fpu->initialized usage in __fpu__restore_sig() Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 02/22] x86/fpu: Remove fpu__restore() Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 03/22] x86/fpu: Remove preempt_disable() in fpu__clear() Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 04/22] x86/fpu: Always init the `state' " Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 05/22] x86/fpu: Remove fpu->initialized usage in copy_fpstate_to_sigframe() Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 06/22] x86/fpu: Don't save fxregs for ia32 frames " Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 07/22] x86/fpu: Remove fpu->initialized Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 08/22] x86/fpu: Remove user_fpu_begin() Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 09/22] x86/fpu: Add (__)make_fpregs_active helpers Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 10/22] x86/fpu: Make __raw_xsave_addr() use feature number instead of mask Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 11/22] x86/fpu: Make get_xsave_field_ptr() and get_xsave_addr() " Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 12/22] x86/fpu: Only write PKRU if it is different from current Sebastian Andrzej Siewior
2019-02-25 18:08   ` Dave Hansen
2019-03-08 17:24     ` Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 13/22] x86/pkeys: Don't check if PKRU is zero before writting it Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 14/22] x86/fpu: Eager switch PKRU state Sebastian Andrzej Siewior
2019-02-25 18:16   ` Dave Hansen
2019-03-08 18:08     ` Sebastian Andrzej Siewior
2019-03-08 19:01       ` Dave Hansen
2019-03-11 11:06         ` Sebastian Andrzej Siewior
2019-03-11 14:30           ` Sebastian Andrzej Siewior [this message]
     [not found]             ` <cd1a34e6-f122-33e3-864f-e23c1833a6c0@intel.com>
2019-03-21 17:10               ` Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 15/22] x86/entry: Add TIF_NEED_FPU_LOAD Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 16/22] x86/fpu: Always store the registers in copy_fpstate_to_sigframe() Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 17/22] x86/fpu: Prepare copy_fpstate_to_sigframe() for TIF_NEED_FPU_LOAD Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 18/22] x86/fpu: Update xstate's PKRU value on write_pkru() Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 19/22] x86/fpu: Inline copy_user_to_fpregs_zeroing() Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 20/22] x86/fpu: Let __fpu__restore_sig() restore the !32bit+fxsr frame from kernel memory Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 21/22] x86/fpu: Merge the two code paths in __fpu__restore_sig() Sebastian Andrzej Siewior
2019-02-21 11:50 ` [PATCH 22/22] x86/fpu: Defer FPU state load until return to userspace Sebastian Andrzej Siewior
  -- strict thread matches above, loose matches on Subject: below --
2019-01-09 11:47 [PATCH v6] x86: load FPU registers on return to userland Sebastian Andrzej Siewior
2019-01-09 11:47 ` [PATCH 14/22] x86/fpu: Eager switch PKRU state Sebastian Andrzej Siewior

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=20190311143049.hclnlciq4rzqrtp6@linutronix.de \
    --to=bigeasy@linutronix.de \
    --cc=Jason@zx2c4.com \
    --cc=dave.hansen@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=riel@surriel.com \
    --cc=rkrcmar@redhat.com \
    --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.