|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 22/27] x86/cpuid: Perform max_leaf calculations in guest_cpuid()
>>> On 04.01.17 at 13:39, <andrew.cooper3@xxxxxxxxxx> wrote:
> @@ -306,6 +310,9 @@ void recalculate_cpuid_policy(struct domain *d)
> if ( !d->disable_migrate && !d->arch.vtsc )
> __clear_bit(X86_FEATURE_ITSC, fs);
>
> + if ( p->basic.max_leaf < 0xd )
XSTATE_CPUID
> @@ -333,21 +340,50 @@ void guest_cpuid(const struct vcpu *v, unsigned int
> leaf,
> unsigned int subleaf, struct cpuid_leaf *res)
> {
> const struct domain *d = v->domain;
> + const struct cpuid_policy *p = d->arch.cpuid;
>
> *res = EMPTY_LEAF;
>
> /*
> * First pass:
> * - Dispatch the virtualised leaves to their respective handlers.
> + * - Perform max_leaf/subleaf calculations, maybe returning early.
> */
> switch ( leaf )
> {
> + case 0x0 ... 0x6:
> + case 0x8 ... 0xc:
> +#if 0 /* For when CPUID_GUEST_NR_BASIC isn't 0xd */
> + case 0xe ... CPUID_GUEST_NR_BASIC - 1:
> +#endif
Perhaps have a BUILD_BUG_ON() in an #else here?
> + if ( leaf > p->basic.max_leaf )
> + return;
> + break;
> +
> + case 0x7:
> + if ( subleaf > p->feat.max_subleaf )
> + return;
> + break;
> +
> + case 0xd:
XSTATE_CPUID again, which raises the question whether switch()
really is the best way to deal with things here.
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -3305,27 +3305,6 @@ void hvm_cpuid(unsigned int input, unsigned int *eax,
> unsigned int *ebx,
> if ( !edx )
> edx = &dummy;
>
> - if ( input & 0x7fffffff )
> - {
> - /*
> - * Requests outside the supported leaf ranges return zero on AMD
> - * and the highest basic leaf output on Intel. Uniformly follow
> - * the AMD model as the more sane one.
> - */
I think this comment would better be moved instead of deleted.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |