All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eduardo Habkost <ehabkost@redhat.com>
To: "Justin Terry (VM)" <juterry@microsoft.com>
Cc: qemu-devel@nongnu.org, pbonzini@redhat.com, rth@twiddle.net
Subject: Re: [Qemu-devel] [PATCH] WHPX fixes an issue with CPUID 1 not returning CPUID_EXT_HYPERVISOR
Date: Wed, 28 Mar 2018 14:50:50 -0300	[thread overview]
Message-ID: <20180328175050.GH5046@localhost.localdomain> (raw)
In-Reply-To: <20180326170658.606-1-juterry@microsoft.com>

On Mon, Mar 26, 2018 at 10:06:58AM -0700, Justin Terry (VM) wrote:
> Implements the CPUID trap for CPUID 1 to include the
> CPUID_EXT_HYPERVISOR flag in the ECX results. This was preventing some
> older linux kernels from booting when trying to access MSR's that dont
> make sense when virtualized.
> 
> Signed-off-by: Justin Terry (VM) <juterry@microsoft.com>
> ---
>  target/i386/whpx-all.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 78 insertions(+), 1 deletion(-)
> 
> diff --git a/target/i386/whpx-all.c b/target/i386/whpx-all.c
> index bf33d320bf..58435178a4 100644
> --- a/target/i386/whpx-all.c
> +++ b/target/i386/whpx-all.c
> @@ -911,12 +911,62 @@ static int whpx_vcpu_run(CPUState *cpu)
>              ret = 1;
>              break;
>  
> +        case WHvRunVpExitReasonX64Cpuid: {
> +            WHV_REGISTER_VALUE reg_values[5] = {0};
> +            WHV_REGISTER_NAME reg_names[5];
> +            UINT32 reg_count = 5;
> +            UINT64 rip, rax, rcx, rdx, rbx;
> +
> +            rip = vcpu->exit_ctx.VpContext.Rip +
> +                  vcpu->exit_ctx.VpContext.InstructionLength;
> +            switch (vcpu->exit_ctx.CpuidAccess.Rax) {
> +            case 1:
> +                rax = vcpu->exit_ctx.CpuidAccess.DefaultResultRax;
> +                /* Advertise that we are running on a hypervisor */
> +                rcx =
> +                    vcpu->exit_ctx.CpuidAccess.DefaultResultRcx |
> +                    CPUID_EXT_HYPERVISOR;
> +
> +                rdx = vcpu->exit_ctx.CpuidAccess.DefaultResultRdx;
> +                rbx = vcpu->exit_ctx.CpuidAccess.DefaultResultRbx;
> +                break;
> +            default:
> +                rax = vcpu->exit_ctx.CpuidAccess.DefaultResultRax;
> +                rcx = vcpu->exit_ctx.CpuidAccess.DefaultResultRcx;
> +                rdx = vcpu->exit_ctx.CpuidAccess.DefaultResultRdx;
> +                rbx = vcpu->exit_ctx.CpuidAccess.DefaultResultRbx;

Interesting, so the WHPX API already tries to provide default
values for the CPUID leaves.  Would it make sense to try and use
the values returned by cpu_x86_cpuid() in the future?

Is there a way to get the default CPUID results from the WHPX API
without calling WHvRunVirtualProcessor(), so QEMU can be aware of
what exactly the guest is seeing on CPUID?


> +            }
> +
> +            reg_names[0] = WHvX64RegisterRip;
> +            reg_names[1] = WHvX64RegisterRax;
> +            reg_names[2] = WHvX64RegisterRcx;
> +            reg_names[3] = WHvX64RegisterRdx;
> +            reg_names[4] = WHvX64RegisterRbx;
> +
> +            reg_values[0].Reg64 = rip;
> +            reg_values[1].Reg64 = rax;
> +            reg_values[2].Reg64 = rcx;
> +            reg_values[3].Reg64 = rdx;
> +            reg_values[4].Reg64 = rbx;
> +
> +            hr = WHvSetVirtualProcessorRegisters(whpx->partition,
> +                                                 cpu->cpu_index,
> +                                                 reg_names,
> +                                                 reg_count,
> +                                                 reg_values);
> +
> +            if (FAILED(hr)) {
> +                error_report("WHPX: Failed to set CpuidAccess state registers,"
> +                             " hr=%08lx", hr);
> +            }
> +            ret = 0;
> +            break;
> +        }
>          case WHvRunVpExitReasonNone:
>          case WHvRunVpExitReasonUnrecoverableException:
>          case WHvRunVpExitReasonInvalidVpRegisterValue:
>          case WHvRunVpExitReasonUnsupportedFeature:
>          case WHvRunVpExitReasonX64MsrAccess:
> -        case WHvRunVpExitReasonX64Cpuid:
>          case WHvRunVpExitReasonException:
>          default:
>              error_report("WHPX: Unexpected VP exit code %d",
> @@ -1272,6 +1322,33 @@ static int whpx_accel_init(MachineState *ms)
>          goto error;
>      }
>  
> +    memset(&prop, 0, sizeof(WHV_PARTITION_PROPERTY));
> +    prop.ExtendedVmExits.X64CpuidExit = 1;
> +    hr = WHvSetPartitionProperty(whpx->partition,
> +                                 WHvPartitionPropertyCodeExtendedVmExits,
> +                                 &prop,
> +                                 sizeof(WHV_PARTITION_PROPERTY));
> +
> +    if (FAILED(hr)) {
> +        error_report("WHPX: Failed to enable partition extended X64CpuidExit"
> +                     " hr=%08lx", hr);
> +        ret = -EINVAL;
> +        goto error;
> +    }
> +
> +    UINT32 cpuidExitList[] = {1};
> +    hr = WHvSetPartitionProperty(whpx->partition,
> +                                 WHvPartitionPropertyCodeCpuidExitList,
> +                                 cpuidExitList,
> +                                 RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32));
> +
> +    if (FAILED(hr)) {
> +        error_report("WHPX: Failed to set partition CpuidExitList hr=%08lx",
> +                     hr);
> +        ret = -EINVAL;
> +        goto error;
> +    }
> +
>      hr = WHvSetupPartition(whpx->partition);
>      if (FAILED(hr)) {
>          error_report("WHPX: Failed to setup partition, hr=%08lx", hr);
> -- 
> 2.11.0
> 

-- 
Eduardo

  parent reply	other threads:[~2018-03-28 17:50 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-26 17:06 [Qemu-devel] [PATCH] WHPX fixes an issue with CPUID 1 not returning CPUID_EXT_HYPERVISOR Justin Terry (VM)
2018-03-26 18:31 ` Eric Blake
2018-03-28 17:50 ` Eduardo Habkost [this message]
2018-03-28 20:48   ` Justin Terry (VM)
2018-04-03  1:36     ` Eduardo Habkost
2018-04-05 15:50     ` Paolo Bonzini
2018-04-16 16:33       ` Eduardo Habkost
2018-04-16 20:44         ` Justin Terry (VM)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180328175050.GH5046@localhost.localdomain \
    --to=ehabkost@redhat.com \
    --cc=juterry@microsoft.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.