On Tue, May 20, 2025 at 01:29:56PM +0200, Magnus Kulke wrote: > The MSHV accelerator requires a x86 decoder/emulator in userland to > emulate MMIO instructions. This change contains the implementations for > the generalized i386 instruction decoder/emulator. > > Signed-off-by: Magnus Kulke <magnusku...@linux.microsoft.com> > --- [...] > +bool x86_read_segment_descriptor(CPUState *cpu, > + struct x86_segment_descriptor *desc, > + x86_segment_selector sel) > +{ > + target_ulong base; > + uint32_t limit; > + X86CPU *x86_cpu = X86_CPU(cpu); > + CPUX86State *env = &x86_cpu->env; > + target_ulong gva; > + /* int ret; */
Unused code. Please drop. > + > + memset(desc, 0, sizeof(*desc)); > + > + /* valid gdt descriptors start from index 1 */ > + if (!sel.index && GDT_SEL == sel.ti) { > + return false; > + } > + > + if (GDT_SEL == sel.ti) { > + base = env->gdt.base; > + limit = env->gdt.limit; > + } else { > + base = env->ldt.base; > + limit = env->ldt.limit; > + } > + > + if (sel.index * 8 >= limit) { > + return false; > + } > + > + gva = base + sel.index * 8; > + emul_ops->read_mem(cpu, desc, gva, sizeof(*desc)); > + > + return true; > +} > + > +bool x86_write_segment_descriptor(CPUState *cpu, > + struct x86_segment_descriptor *desc, > + x86_segment_selector sel) > +{ > + target_ulong base; > + uint32_t limit; > + X86CPU *x86_cpu = X86_CPU(cpu); > + CPUX86State *env = &x86_cpu->env; > + /* int ret; */ Unused code. Please drop. > + target_ulong gva; > + > + if (GDT_SEL == sel.ti) { > + base = env->gdt.base; > + limit = env->gdt.limit; > + } else { > + base = env->ldt.base; > + limit = env->ldt.limit; > + } > + > + if (sel.index * 8 >= limit) { > + return false; > + } > + > + gva = base + sel.index * 8; > + emul_ops->write_mem(cpu, desc, gva, sizeof(*desc)); > + > + return true; > +} > + [...] > + > +target_ulong linear_addr(CPUState *cpu, target_ulong addr, X86Seg seg) > +{ > + int ret; > + target_ulong linear_addr; > + > + /* return vmx_read_segment_base(cpu, seg) + addr; */ Unused code. Thanks, Wei. > + ret = linearize(cpu, addr, &linear_addr, seg); > + if (ret < 0) { > + error_report("failed to linearize address"); > + abort(); > + } > + > + return linear_addr; > +} > + > +target_ulong linear_addr_size(CPUState *cpu, target_ulong addr, int size, > + X86Seg seg) > +{ > + switch (size) { > + case 2: > + addr = (uint16_t)addr; > + break; > + case 4: > + addr = (uint32_t)addr; > + break; > + default: > + break; > + } > + return linear_addr(cpu, addr, seg); > +} > + > +target_ulong linear_rip(CPUState *cpu, target_ulong rip) > +{ > + return linear_addr(cpu, rip, R_CS); > +} > -- > 2.34.1 >