Opens the door to implement SLDT in the instruction emulator.
Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
---
target/i386/emulate/x86_emu.h | 1 +
target/i386/hvf/hvf.c | 1 +
target/i386/mshv/mshv-cpu.c | 11 +++++++++++
target/i386/whpx/whpx-all.c | 10 ++++++++++
4 files changed, 23 insertions(+)
diff --git a/target/i386/emulate/x86_emu.h b/target/i386/emulate/x86_emu.h
index a8d4c93098..2397c24200 100644
--- a/target/i386/emulate/x86_emu.h
+++ b/target/i386/emulate/x86_emu.h
@@ -28,6 +28,7 @@ struct x86_emul_ops {
MMUTranslateResult (*mmu_gva_to_gpa) (CPUState *cpu, target_ulong gva, uint64_t *gpa, MMUTranslateFlags flags);
void (*read_segment_descriptor)(CPUState *cpu, struct x86_segment_descriptor *desc,
enum X86Seg seg);
+ x86_segment_selector (*read_segment_selector)(CPUState *cpu, enum X86Seg seg);
target_ulong (*read_cr) (CPUState *cpu, int cr);
void (*handle_io)(CPUState *cpu, uint16_t port, void *data, int direction,
int size, int count);
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index c0d028b147..8fda4429b3 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -254,6 +254,7 @@ static void hvf_read_segment_descriptor(CPUState *s, struct x86_segment_descript
static const struct x86_emul_ops hvf_x86_emul_ops = {
.read_segment_descriptor = hvf_read_segment_descriptor,
+ .read_segment_selector = vmx_read_segment_selector,
.handle_io = hvf_handle_io,
.simulate_rdmsr = hvf_simulate_rdmsr,
.simulate_wrmsr = hvf_simulate_wrmsr,
diff --git a/target/i386/mshv/mshv-cpu.c b/target/i386/mshv/mshv-cpu.c
index 2bc978deb2..25e0de2eab 100644
--- a/target/i386/mshv/mshv-cpu.c
+++ b/target/i386/mshv/mshv-cpu.c
@@ -1565,8 +1565,19 @@ static void read_segment_descriptor(CPUState *cpu,
}
}
+static x86_segment_selector read_segment_selector(CPUState *cpu, enum X86Seg seg_idx)
+{
+ X86CPU *x86_cpu = X86_CPU(cpu);
+ CPUX86State *env = &x86_cpu->env;
+ SegmentCache *seg = &env->segs[seg_idx];
+ x86_segment_selector sel = { .sel = seg->selector & 0xFFFF };
+
+ return sel;
+}
+
static const struct x86_emul_ops mshv_x86_emul_ops = {
.read_segment_descriptor = read_segment_descriptor,
+ .read_segment_selector = read_segment_selector
};
void mshv_init_mmio_emu(void)
diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c
index e56ae2b343..9a405118c5 100644
--- a/target/i386/whpx/whpx-all.c
+++ b/target/i386/whpx/whpx-all.c
@@ -998,6 +998,15 @@ static void read_segment_descriptor(CPUState *cpu,
whpx_segment_to_x86_descriptor(cpu, ®, desc);
}
+static x86_segment_selector read_segment_selector(CPUState *cpu, enum X86Seg seg_idx)
+{
+ WHV_X64_SEGMENT_REGISTER reg;
+ x86_segment_selector sel;
+ whpx_read_segment_descriptor(cpu, ®, seg_idx);
+ sel.sel = reg.Selector & 0xFFFF;
+ return sel;
+}
+
static bool is_protected_mode(CPUState *cpu)
{
AccelCPUState *vcpu = cpu->accel;
@@ -1049,6 +1058,7 @@ static target_ulong read_cr(CPUState *cpu, int cr)
static const struct x86_emul_ops whpx_x86_emul_ops = {
.read_segment_descriptor = read_segment_descriptor,
+ .read_segment_selector = read_segment_selector,
.handle_io = handle_io,
.is_protected_mode = is_protected_mode,
.is_long_mode = is_long_mode,
--
2.50.1 (Apple Git-155)