[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3] x86/CPUID: shrink max_{,sub}leaf fields according to actual leaf contents
On Mon, Apr 19, 2021 at 01:46:02PM +0200, Jan Beulich wrote: > On 19.04.2021 11:16, Roger Pau Monné wrote: > > Adding Paul also for the Viridian part. > > > > On Fri, Apr 16, 2021 at 03:16:41PM +0200, Jan Beulich wrote: > >> Zapping leaf data for out of range leaves is just one half of it: To > >> avoid guests (bogusly or worse) inferring information from mere leaf > >> presence, also shrink maximum indicators such that the respective > >> trailing entry is not all blank (unless of course it's the initial > >> subleaf of a leaf that's not the final one). > >> > >> This is also in preparation of bumping the maximum basic leaf we > >> support, to ensure guests not getting exposed related features won't > >> observe a change in behavior. > >> > >> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > >> --- > >> v3: Record the actual non-empty subleaf in p->basic.raw[0x7], rather > >> than subleaf 0. Re-base over Viridian leaf 40000005 addition. > >> v2: New. > >> > >> --- a/tools/tests/cpu-policy/test-cpu-policy.c > >> +++ b/tools/tests/cpu-policy/test-cpu-policy.c > >> @@ -8,10 +8,13 @@ > >> #include <err.h> > >> > >> #include <xen-tools/libs.h> > >> +#include <xen/asm/x86-defns.h> > >> #include <xen/asm/x86-vendors.h> > >> #include <xen/lib/x86/cpu-policy.h> > >> #include <xen/domctl.h> > >> > >> +#define XSTATE_FP_SSE (X86_XCR0_FP | X86_XCR0_SSE) > >> + > >> static unsigned int nr_failures; > >> #define fail(fmt, ...) \ > >> ({ \ > >> @@ -553,6 +556,103 @@ static void test_cpuid_out_of_range_clea > >> } > >> } > >> > >> +static void test_cpuid_maximum_leaf_shrinking(void) > >> +{ > >> + static const struct test { > >> + const char *name; > >> + struct cpuid_policy p; > >> + } tests[] = { > >> + { > >> + .name = "basic", > >> + .p = { > >> + /* Very basic information only. */ > >> + .basic.max_leaf = 1, > >> + .basic.raw_fms = 0xc2, > >> + }, > >> + }, > >> + { > >> + .name = "cache", > >> + .p = { > >> + /* Cache subleaves present. */ > >> + .basic.max_leaf = 4, > >> + .cache.subleaf[0].type = 1, > > > > On a private conversation with Andrew he raised the issue that the > > shrinking might be overly simplistic. For example if the x2APIC > > feature bit in leaf 1 is set then the max leaf should be at least 0xb > > in order to be able to fetch the x2APIC ID, even if it's 0. > > But in such a case the "type" field of leaf 0xb's first sub-leaf is > going to be non-zero, isn't it? Right, as type 0 is invalid according to Intel SDM, so you will never be able to shrink below 0xb while having x2APIC set. I still wonder however if there's any other such dependency, where shrinking the max cpuid leaf could force us to drop features exposed in inferior leaves. > > I also wonder if we are shrinking the leaves too much, for example we > > should always report up to 0x40000000 (or 0x40000100) plus the Xen > > leaves, as we never hide those and it's also documented in the public > > headers? > > Not sure I follow - I'm likely confused by you quoting 0x40000000 > and 0x40000100 rather than 0x400000nn and 0x400001nn, as elsewhere > you suggested we may not want to clip sub-leaves there. Can you > clarify whether you really mean only the first sub-leaves (each) > here, and if so why you say "up to"? Furthermore for the Xen leaves > I don't think I do excessive clipping ... No, sorry, I was confused. What you do is fine, I would even (as said in the previous patch) just report the max leaf unconditionally even if empty, as we are not leaking any hardware state in this case. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |