|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/emul: Remove fallback path from SWAPGS
commit 4bedbe47eef4ff68265a63d89ab55401334424b2
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Mon Feb 23 15:38:14 2026 +0000
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Apr 7 16:26:34 2026 +0100
x86/emul: Remove fallback path from SWAPGS
In real hardware, accesses to the registers cannot fail. The error paths
are
just an artefact of the hook functions needing to return something.
The best effort unwind is also something that doesn't exist in real
hardware,
and makes the logic more complicated to follow. Instead, use an
ASSERT_UNREACHABLE() with a fallback of injecting #DF. Hitting this path is
an error in Xen.
While adjusting, remove {read,write}_segment() and use {read,write}_msr() to
access MSR_GS_BASE. There's no need to access the other parts of the GS
segment, and this is less work behind the scenes.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/arch/x86/x86_emulate/0f01.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/xen/arch/x86/x86_emulate/0f01.c b/xen/arch/x86/x86_emulate/0f01.c
index 6c10979dd6..54bd6faf0f 100644
--- a/xen/arch/x86/x86_emulate/0f01.c
+++ b/xen/arch/x86/x86_emulate/0f01.c
@@ -189,22 +189,24 @@ int x86emul_0f01(struct x86_emulate_state *s,
generate_exception_if(!mode_ring0(), X86_EXC_GP, 0);
fail_if(!ops->read_segment || !ops->read_msr ||
!ops->write_segment || !ops->write_msr);
- if ( (rc = ops->read_segment(x86_seg_gs, &sreg,
- ctxt)) != X86EMUL_OKAY ||
- (rc = ops->read_msr(MSR_SHADOW_GS_BASE, &msr_val,
+ if ( (rc = ops->read_msr(MSR_GS_BASE, &sreg.base,
ctxt)) != X86EMUL_OKAY ||
- (rc = ops->write_msr(MSR_SHADOW_GS_BASE, sreg.base,
- ctxt, false)) != X86EMUL_OKAY )
+ (rc = ops->read_msr(MSR_SHADOW_GS_BASE, &msr_val,
+ ctxt)) != X86EMUL_OKAY )
goto done;
- sreg.base = msr_val;
- if ( (rc = ops->write_segment(x86_seg_gs, &sreg,
- ctxt)) != X86EMUL_OKAY )
+ if ( (rc = ops->write_msr(MSR_SHADOW_GS_BASE, sreg.base,
+ ctxt, false)) != X86EMUL_OKAY ||
+ (rc = ops->write_msr(MSR_GS_BASE, msr_val,
+ ctxt, false)) != X86EMUL_OKAY )
{
- /* Best effort unwind (i.e. no real error checking). */
- if ( ops->write_msr(MSR_SHADOW_GS_BASE, msr_val,
- ctxt, false) == X86EMUL_EXCEPTION )
- x86_emul_reset_event(ctxt);
- goto done;
+ /*
+ * In real hardware, access to the registers cannot fail. It is
+ * an error in Xen if the writes fail given that both MSRs have
+ * equivalent checks.
+ */
+ ASSERT_UNREACHABLE();
+ x86_emul_reset_event(ctxt);
+ generate_exception(X86_EXC_DF, 0);
}
break;
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |