Commit 94ab400266 for qemu.org
commit 94ab4002661071c7de101da764230c25452f34fe
Author: Mohamed Mediouni <mohamed@unpredictable.fr>
Date: Tue Mar 24 16:13:17 2026 +0100
target/i386: emulate: add new callbacks
On Hyper-V fetching some guest registers is really expensive, so
add a way to query some state from information provided by Hyper-V
to save time on vmexits.
Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
Link: https://lore.kernel.org/r/20260324151323.74473-7-mohamed@unpredictable.fr
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
diff --git a/target/i386/emulate/x86_emu.h b/target/i386/emulate/x86_emu.h
index 0f284b0c3d..4ed970bd53 100644
--- a/target/i386/emulate/x86_emu.h
+++ b/target/i386/emulate/x86_emu.h
@@ -32,6 +32,9 @@ struct x86_emul_ops {
int size, int count);
void (*simulate_rdmsr)(CPUState *cs);
void (*simulate_wrmsr)(CPUState *cs);
+ bool (*is_protected_mode)(CPUState *cpu);
+ bool (*is_long_mode)(CPUState *cpu);
+ bool (*is_user_mode)(CPUState *cpu);
};
extern const struct x86_emul_ops *emul_ops;
diff --git a/target/i386/emulate/x86_helpers.c b/target/i386/emulate/x86_helpers.c
index 024f9a2afc..ebbf40f2b0 100644
--- a/target/i386/emulate/x86_helpers.c
+++ b/target/i386/emulate/x86_helpers.c
@@ -211,6 +211,9 @@ bool x86_is_protected(CPUState *cpu)
X86CPU *x86_cpu = X86_CPU(cpu);
CPUX86State *env = &x86_cpu->env;
uint64_t cr0 = env->cr[0];
+ if (emul_ops->is_protected_mode) {
+ return emul_ops->is_protected_mode(cpu);
+ }
return cr0 & CR0_PE_MASK;
}
@@ -234,6 +237,9 @@ bool x86_is_long_mode(CPUState *cpu)
uint64_t efer = env->efer;
uint64_t lme_lma = (MSR_EFER_LME | MSR_EFER_LMA);
+ if (emul_ops->is_long_mode) {
+ return emul_ops->is_long_mode(cpu);
+ }
return ((efer & lme_lma) == lme_lma);
}
diff --git a/target/i386/emulate/x86_mmu.c b/target/i386/emulate/x86_mmu.c
index 4e39bae025..670939acdb 100644
--- a/target/i386/emulate/x86_mmu.c
+++ b/target/i386/emulate/x86_mmu.c
@@ -49,6 +49,9 @@
static bool is_user(CPUState *cpu)
{
+ if (emul_ops->is_user_mode) {
+ return emul_ops->is_user_mode(cpu);
+ }
return false;
}