|
@@ -178,6 +178,7 @@ static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0;
|
|
|
static void xen_cpuid(unsigned int *ax, unsigned int *bx,
|
|
|
unsigned int *cx, unsigned int *dx)
|
|
|
{
|
|
|
+ unsigned maskebx = ~0;
|
|
|
unsigned maskecx = ~0;
|
|
|
unsigned maskedx = ~0;
|
|
|
|
|
@@ -185,9 +186,16 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
|
|
|
* Mask out inconvenient features, to try and disable as many
|
|
|
* unsupported kernel subsystems as possible.
|
|
|
*/
|
|
|
- if (*ax == 1) {
|
|
|
+ switch (*ax) {
|
|
|
+ case 1:
|
|
|
maskecx = cpuid_leaf1_ecx_mask;
|
|
|
maskedx = cpuid_leaf1_edx_mask;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 0xb:
|
|
|
+ /* Suppress extended topology stuff */
|
|
|
+ maskebx = 0;
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
asm(XEN_EMULATE_PREFIX "cpuid"
|
|
@@ -197,6 +205,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
|
|
|
"=d" (*dx)
|
|
|
: "0" (*ax), "2" (*cx));
|
|
|
|
|
|
+ *bx &= maskebx;
|
|
|
*cx &= maskecx;
|
|
|
*dx &= maskedx;
|
|
|
}
|