[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/cpuid: Handle leaves 0x80000005-7 in guest_cpuid()
commit 92ca9045243c2dfe50ee28bd02615c541cf75377 Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Fri Jan 20 15:35:08 2017 +0000 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Wed Jan 25 10:24:40 2017 +0000 x86/cpuid: Handle leaves 0x80000005-7 in guest_cpuid() Leaf 0x80000005 contains L1 cache/TLB information, 0x80000006 L2 & L3 cache/TLB information, and 0x80000007 Power management information. Intel reserves all of this information other than the L2 cache information, and the ITSC bit from the power management leaf. AMD passes all of the cache/TLB information through to the guest, while most of of the power management information is explicitly clobbered by the toolstack. 0x80000007 edx (containing ITSC) is covered by the featureset logic. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/arch/x86/cpuid.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/xen/arch/x86/cpuid.c b/xen/arch/x86/cpuid.c index 9cea13c..3338045 100644 --- a/xen/arch/x86/cpuid.c +++ b/xen/arch/x86/cpuid.c @@ -167,6 +167,9 @@ static void recalculate_misc(struct cpuid_policy *p) p->extd.e1d &= ~CPUID_COMMON_1D_FEATURES; + /* Most of Power/RAS hidden from guests. */ + p->extd.raw[0x7].a = p->extd.raw[0x7].b = p->extd.raw[0x7].c = 0; + switch ( p->x86_vendor ) { case X86_VENDOR_INTEL: @@ -179,6 +182,9 @@ static void recalculate_misc(struct cpuid_policy *p) p->extd.vendor_edx = 0; p->extd.raw[0x1].a = p->extd.raw[0x1].b = 0; + + p->extd.raw[0x5] = EMPTY_LEAF; + p->extd.raw[0x6].a = p->extd.raw[0x6].b = p->extd.raw[0x6].d = 0; break; case X86_VENDOR_AMD: @@ -676,10 +682,6 @@ static void pv_cpuid(uint32_t leaf, uint32_t subleaf, struct cpuid_leaf *res) res->a = (res->a & ~0xff) | 3; break; - case 0x80000007: - res->d = p->extd.e7d; - break; - case 0x80000008: res->a = paddr_bits | (vaddr_bits << 8); res->b = p->extd.e8b; @@ -698,7 +700,7 @@ static void pv_cpuid(uint32_t leaf, uint32_t subleaf, struct cpuid_leaf *res) case 0x2 ... 0x3: case 0x7 ... 0x9: case 0xc ... XSTATE_CPUID: - case 0x80000000 ... 0x80000004: + case 0x80000000 ... 0x80000007: ASSERT_UNREACHABLE(); /* Now handled in guest_cpuid(). */ } @@ -778,10 +780,6 @@ static void hvm_cpuid(uint32_t leaf, uint32_t subleaf, struct cpuid_leaf *res) res->a = (res->a & ~0xff) | 3; break; - case 0x80000007: - res->d = p->extd.e7d; - break; - case 0x80000008: res->a &= 0xff; tmp = d->arch.paging.gfn_bits + PAGE_SHIFT; @@ -815,7 +813,7 @@ static void hvm_cpuid(uint32_t leaf, uint32_t subleaf, struct cpuid_leaf *res) case 0x2 ... 0x3: case 0x7 ... 0x9: case 0xc ... XSTATE_CPUID: - case 0x80000000 ... 0x80000004: + case 0x80000000 ... 0x80000007: ASSERT_UNREACHABLE(); /* Now handled in guest_cpuid(). */ } @@ -898,7 +896,7 @@ void guest_cpuid(const struct vcpu *v, uint32_t leaf, default: goto legacy; - case 0x80000000 ... 0x80000004: + case 0x80000000 ... 0x80000007: *res = p->extd.raw[leaf & 0xffff]; break; } -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |