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 <[email protected]>
> ---
[...]
> +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
>