Ping!

It would be nice to get this one in before the 9.1 merge window closes.

Thanks,
Phil




On Mon, 24 Jun 2024 at 11:47, Phil Dennis-Jordan <p...@philjordan.eu> wrote:

> Support for x2APIC mode was recently introduced in the software emulated
> APIC implementation for TCG. Enabling it when using macOS’s hvf
> accelerator is useful and significantly helps performance, as Qemu
> currently uses the emulated APIC when running on hvf as well.
>
> This change wires up the read & write operations for the MSR VM exits
> and allow-lists the CPUID flag in the x86 hvf runtime.
>
> Signed-off-by: Phil Dennis-Jordan <p...@philjordan.eu>
> ---
>  target/i386/hvf/x86_cpuid.c |  4 ++--
>  target/i386/hvf/x86_emu.c   | 31 +++++++++++++++++++++++++++++++
>  2 files changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/target/i386/hvf/x86_cpuid.c b/target/i386/hvf/x86_cpuid.c
> index e56cd8411b..4f260d46a8 100644
> --- a/target/i386/hvf/x86_cpuid.c
> +++ b/target/i386/hvf/x86_cpuid.c
> @@ -64,8 +64,8 @@ uint32_t hvf_get_supported_cpuid(uint32_t func, uint32_t
> idx,
>               CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX |
>               CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS;
>          ecx &= CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
> -             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID |
> -             CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_MOVBE |
> +             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID |
> CPUID_EXT_SSE41 |
> +             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
>               CPUID_EXT_POPCNT | CPUID_EXT_AES | CPUID_EXT_XSAVE |
>               CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND;
>          ecx |= CPUID_EXT_HYPERVISOR;
> diff --git a/target/i386/hvf/x86_emu.c b/target/i386/hvf/x86_emu.c
> index 38c782b8e3..be675bcfb7 100644
> --- a/target/i386/hvf/x86_emu.c
> +++ b/target/i386/hvf/x86_emu.c
> @@ -663,6 +663,15 @@ static void exec_lods(CPUX86State *env, struct
> x86_decode *decode)
>      env->eip += decode->len;
>  }
>
> +static void raise_exception(CPUX86State *env, int exception_index,
> +                            int error_code)
> +{
> +    env->exception_nr = exception_index;
> +    env->error_code = error_code;
> +    env->has_error_code = true;
> +    env->exception_injected = 1;
> +}
> +
>  void simulate_rdmsr(CPUX86State *env)
>  {
>      X86CPU *cpu = env_archcpu(env);
> @@ -677,6 +686,17 @@ void simulate_rdmsr(CPUX86State *env)
>      case MSR_IA32_APICBASE:
>          val = cpu_get_apic_base(cpu->apic_state);
>          break;
> +    case MSR_APIC_START ... MSR_APIC_END: {
> +        int ret;
> +        int index = (uint32_t)env->regs[R_ECX] - MSR_APIC_START;
> +
> +        ret = apic_msr_read(index, &val);
> +        if (ret < 0) {
> +            raise_exception(env, EXCP0D_GPF, 0);
> +        }
> +
> +        break;
> +    }
>      case MSR_IA32_UCODE_REV:
>          val = cpu->ucode_rev;
>          break;
> @@ -777,6 +797,17 @@ void simulate_wrmsr(CPUX86State *env)
>      case MSR_IA32_APICBASE:
>          cpu_set_apic_base(cpu->apic_state, data);
>          break;
> +    case MSR_APIC_START ... MSR_APIC_END: {
> +        int ret;
> +        int index = (uint32_t)env->regs[R_ECX] - MSR_APIC_START;
> +
> +        ret = apic_msr_write(index, data);
> +        if (ret < 0) {
> +            raise_exception(env, EXCP0D_GPF, 0);
> +        }
> +
> +        break;
> +    }
>      case MSR_FSBASE:
>          wvmcs(cs->accel->fd, VMCS_GUEST_FS_BASE, data);
>          break;
> --
> 2.39.3 (Apple Git-146)
>
>

Reply via email to