From: Mohamed Mediouni <mohamed@unpredictable.fr>
target/i386/emulate now has new ops for fetching whether the guest is in
protected mode, long mode or user mode without fetching control
registers.
Use those for faster vmexits.
Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
Link: https://lore.kernel.org/r/20260324151323.74473-8-mohamed@unpredictable.fr
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
target/i386/whpx/whpx-all.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c
index 69d141e7cce..b97dc9fd514 100644
--- a/target/i386/whpx/whpx-all.c
+++ b/target/i386/whpx/whpx-all.c
@@ -885,10 +885,32 @@ static void read_segment_descriptor(CPUState *cpu,
}
}
+static bool is_protected_mode(CPUState *cpu)
+{
+ AccelCPUState *vcpu = cpu->accel;
+
+ return vcpu->exit_ctx.VpContext.ExecutionState.Cr0Pe == 1;
+}
+
+static bool is_long_mode(CPUState *cpu)
+{
+ AccelCPUState *vcpu = cpu->accel;
+
+ return vcpu->exit_ctx.VpContext.ExecutionState.EferLma == 1;
+}
+
+static bool is_user_mode(CPUState *cpu)
+{
+ AccelCPUState *vcpu = cpu->accel;
+ return vcpu->exit_ctx.VpContext.ExecutionState.Cpl == 3;
+}
static const struct x86_emul_ops whpx_x86_emul_ops = {
.read_segment_descriptor = read_segment_descriptor,
- .handle_io = handle_io
+ .handle_io = handle_io,
+ .is_protected_mode = is_protected_mode,
+ .is_long_mode = is_long_mode,
+ .is_user_mode = is_user_mode
};
static void whpx_init_emu(void)
--
2.53.0