x86/fsgsbase: Fix Xen PV support
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. Signed-off-by: Andy Lutomirski <luto@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lkml.kernel.org/r/f07c08f178fe9711915862b656722a207cd52c28.1593192140.git.luto@kernel.org
This commit is contained in:
parent
40c45904f8
commit
d029bff60a
|
@ -163,9 +163,15 @@ 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 {
|
||||
instrumentation_begin();
|
||||
rdmsrl(MSR_KERNEL_GS_BASE, gsbase);
|
||||
instrumentation_end();
|
||||
}
|
||||
|
||||
return gsbase;
|
||||
}
|
||||
|
@ -182,9 +188,15 @@ 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 {
|
||||
instrumentation_begin();
|
||||
wrmsrl(MSR_KERNEL_GS_BASE, gsbase);
|
||||
instrumentation_end();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue