Messages in this thread Patch in this message | | | Subject | Re: [PATCH fsgsbase v2 4/4] x86/fsgsbase: Fix Xen PV support | From | Jürgen Groß <> | Date | Mon, 29 Jun 2020 07:17:20 +0200 |
| |
On 26.06.20 19:24, Andy Lutomirski wrote: > On Xen PV, SWAPGS doesn't work. Teach __rdfsbase_inactive() and > __wrgsbase_inactive() to use rdmsrl()/wrmsrl() on Xen PV. The Xen > pvop code will understand this and issue the correct hypercalls. > > Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> > Cc: Juergen Gross <jgross@suse.com> > Cc: Stefano Stabellini <sstabellini@kernel.org> > Cc: xen-devel@lists.xenproject.org > Signed-off-by: Andy Lutomirski <luto@kernel.org> > --- > arch/x86/kernel/process_64.c | 20 ++++++++++++++------ > 1 file changed, 14 insertions(+), 6 deletions(-) > > diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c > index cb8e37d3acaa..457d02aa10d8 100644 > --- a/arch/x86/kernel/process_64.c > +++ b/arch/x86/kernel/process_64.c > @@ -163,9 +163,13 @@ static noinstr unsigned long __rdgsbase_inactive(void) > > lockdep_assert_irqs_disabled(); > > - native_swapgs(); > - gsbase = rdgsbase(); > - native_swapgs(); > + if (!static_cpu_has(X86_FEATURE_XENPV)) { > + native_swapgs(); > + gsbase = rdgsbase(); > + native_swapgs(); > + } else { > + rdmsrl(MSR_KERNEL_GS_BASE, gsbase); > + } > > return gsbase; > } > @@ -182,9 +186,13 @@ static noinstr void __wrgsbase_inactive(unsigned long gsbase) > { > lockdep_assert_irqs_disabled(); > > - native_swapgs(); > - wrgsbase(gsbase); > - native_swapgs(); > + if (!static_cpu_has(X86_FEATURE_XENPV)) { > + native_swapgs(); > + wrgsbase(gsbase); > + native_swapgs(); > + } else { > + wrmsrl(MSR_KERNEL_GS_BASE, gsbase); > + } > } > > /* >
Another possibility would be to just do (I'm fine either way):
diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c index acc49fa6a097..b78dd373adbf 100644 --- a/arch/x86/xen/enlighten_pv.c +++ b/arch/x86/xen/enlighten_pv.c @@ -318,6 +318,8 @@ static void __init xen_init_capabilities(void) setup_clear_cpu_cap(X86_FEATURE_XSAVE); setup_clear_cpu_cap(X86_FEATURE_OSXSAVE); } + + setup_clear_cpu_cap(X86_FEATURE_FSGSBASE); }
static void xen_set_debugreg(int reg, unsigned long val)
Juergen
| |