/* Filter all other features according to a whitelist. */
regs[2] &= ((is_64bit ? bitmaskof(X86_FEATURE_LAHF_LM) : 0) |
+ bitmaskof(X86_FEATURE_CMP_LEGACY) |
bitmaskof(X86_FEATURE_ALTMOVCR) |
bitmaskof(X86_FEATURE_ABM) |
bitmaskof(X86_FEATURE_SSE4A) |
bitmaskof(X86_FEATURE_3DNOWEXT));
break;
}
+
+ case 0x80000008:
+ /*
+ * ECX[15:12] is ApicIdCoreSize: ECX[7:0] is NumberOfCores (minus one).
+ * Update to reflect vLAPIC_ID = vCPU_ID * 2.
+ */
+ regs[2] = ((regs[2] & 0xf000u) + 1) | ((regs[2] & 0xffu) << 1) | 1u;
+ break;
}
}
break;
case 0x00000004:
- regs[0] &= 0x3FF;
- regs[3] &= 0x3FF;
+ /*
+ * EAX[31:26] is Maximum Cores Per Package (minus one).
+ * Update to reflect vLAPIC_ID = vCPU_ID * 2.
+ */
+ regs[0] = (((regs[0] & 0x7c000000u) << 1) | 0x04000000u |
+ (regs[0] & 0x3ffu));
+ regs[3] &= 0x3ffu;
break;
case 0x80000001: {
case 0x80000005:
regs[0] = regs[1] = regs[2] = 0;
break;
+
+ case 0x80000008:
+ /* Mask AMD Number of Cores information. */
+ regs[2] = 0;
+ break;
}
}
break;
case 0x00000001:
+ /*
+ * EBX[23:16] is Maximum Logical Processors Per Package.
+ * Update to reflect vLAPIC_ID = vCPU_ID * 2.
+ */
+ regs[1] = (regs[1] & 0x0000ffffu) | ((regs[1] & 0x007f0000u) << 1);
+
regs[2] &= (bitmaskof(X86_FEATURE_XMM3) |
bitmaskof(X86_FEATURE_SSSE3) |
bitmaskof(X86_FEATURE_CX16) |
bitmaskof(X86_FEATURE_MMX) |
bitmaskof(X86_FEATURE_FXSR) |
bitmaskof(X86_FEATURE_XMM) |
- bitmaskof(X86_FEATURE_XMM2));
+ bitmaskof(X86_FEATURE_XMM2) |
+ bitmaskof(X86_FEATURE_HT));
/* We always support MTRR MSRs. */
regs[3] |= bitmaskof(X86_FEATURE_MTRR);
case 0x80000008:
regs[0] &= 0x0000ffffu;
- regs[1] = regs[2] = regs[3] = 0;
+ regs[1] = regs[3] = 0;
break;
case 0x00000002: /* Intel cache info (dumped by AMD policy) */