|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 15/21] libs/guest: obtain a compatible cpu policy from two input ones
On 13.04.2021 16:01, Roger Pau Monne wrote:
> @@ -944,3 +945,130 @@ bool xc_cpu_policy_is_compatible(xc_interface *xch,
> const xc_cpu_policy_t host,
>
> return false;
> }
> +
> +static uint64_t level_msr(unsigned int index, uint64_t val1, uint64_t val2)
> +{
> + uint64_t val = val1 & val2;;
For arbitrary MSRs this isn't going to do any good. If only very
specific MSRs are assumed to make it here, I think this wants
commenting on.
Also, nit: stray semicolon.
> + switch ( index )
> + {
> + case MSR_ARCH_CAPABILITIES:
> + /*
> + * Set RSBA if present on any of the input values to notice the guest
> + * might run on vulnerable hardware at some point.
> + */
> + val |= (val1 | val2) & ARCH_CAPS_RSBA;
> + break;
> + }
> +
> + return val;
> +}
> +
> +static bool level_leaf(xen_cpuid_leaf_t *l1, xen_cpuid_leaf_t *l2,
const (twice)?
> + xen_cpuid_leaf_t *out)
> +{
> + *out = (xen_cpuid_leaf_t){ };
> +
> + switch ( l1->leaf )
> + {
> + case 0x1:
> + case 0x80000001:
> + out->c = l1->c & l2->c;
> + out->d = l1->d & l2->d;
> + return true;
> +
> + case 0xd:
> + if ( l1->subleaf != 1 )
> + break;
> + out->a = l1->a & l2->a;
> + return true;
Could you explain your thinking behind this (a code comment would
likely help)? You effectively discard everything except subleaf 1
by returning false in that case, don't you?
> + case 0x7:
> + switch ( l1->subleaf )
> + {
> + case 0:
> + out->b = l1->b & l2->b;
> + out->c = l1->c & l2->c;
> + out->d = l1->d & l2->d;
> + return true;
> +
> + case 1:
> + out->a = l1->a & l2->a;
> + return true;
> + }
> + break;
Can we perhaps assume all subleaves here are going to hold flags,
and hence and both sides together without regard to what subleaf
we're actually dealing with (subleaf 1 remaining special as to
EAX of course)? This would avoid having to remember to make yet
another mechanical change when enabling a new subleaf.
> + case 0x80000007:
> + out->d = l1->d & l2->d;
> + return true;
> +
> + case 0x80000008:
> + out->b = l1->b & l2->b;
> + return true;
> + }
> +
> + return false;
> +}
Considering your LFENCE-always-serializing patch, I assume
whichever ends up going in last will take care of adding handling
of that leaf here?
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |