|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 2/2] x86/Intel: virtualize support for cpuid faulting
On 14/10/16 20:47, Kyle Huey wrote:
> On HVM guests, the cpuid triggers a vm exit, so we can check the emulated
> faulting state in vmx_do_cpuid and inject a GP(0) if CPL > 0. Notably no
> hardware support for faulting on cpuid is necessary to emulate support with an
> HVM guest.
>
> On PV guests, hardware support is required so that userspace cpuid will trap
> to xen. Xen already enables cpuid faulting on supported CPUs for pv guests
> (that
to Xen.
> aren't the control domain, see the comment in intel_ctxt_switch_levelling).
> Every PV guest cpuid will trap via a GP(0) to emulate_privileged_op (via
> do_general_protection). Once there we simply decline to emulate cpuid if the
> CPL > 0 and faulting is enabled, leaving the GP(0) for the guest kernel to
> handle.
>
> Signed-off-by: Kyle Huey <khuey@xxxxxxxxxxxx>
> ---
> xen/arch/x86/hvm/vmx/vmx.c | 24 ++++++++++++++++++++++--
> xen/arch/x86/traps.c | 34 ++++++++++++++++++++++++++++++++++
> xen/include/asm-x86/domain.h | 3 +++
> 3 files changed, 59 insertions(+), 2 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
> index b9102ce..c038393 100644
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -2427,16 +2427,25 @@ static void vmx_cpuid_intercept(
>
> HVMTRACE_5D (CPUID, input, *eax, *ebx, *ecx, *edx);
> }
>
> static int vmx_do_cpuid(struct cpu_user_regs *regs)
> {
> unsigned int eax, ebx, ecx, edx;
> unsigned int leaf, subleaf;
> + struct segment_register sreg;
> + struct vcpu *v = current;
> +
> + hvm_get_segment_register(v, x86_seg_ss, &sreg);
> + if ( v->arch.cpuid_fault && sreg.attr.fields.dpl > 0 )
> + {
> + hvm_inject_hw_exception(TRAP_gp_fault, 0);
> + return 1; /* Don't advance the guest IP! */
> + }
Thinking about it, the segment register query can be skipped in the
likely case that faulting isn't enabled. Could this be re-arranged to:
if ( v->arch.cpuid_fault )
{
struct segment_register sreg;
hvm_get_segment_register(v, x86_seg_ss, &sreg);
if ( sreg.attr.fields.dpl > 0 )
{
hvm_inject_hw_exception(TRAP_gp_fault, 0);
return 1; /* Don't advance the guest IP! */
}
}
With these two minor issues taken care of, Reviewed-by: Andrew Cooper
<andrew.cooper3@xxxxxxxxxx>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |