@@ -581,6 +581,7 @@ enum vm_instruction_error_number {
#define EPT_CAP_WT 1ull
#define EPT_CAP_PWL4 (1ull << 6)
+#define EPT_CAP_PWL5 (1ull << 7)
#define EPT_CAP_UC (1ull << 8)
#define EPT_CAP_WB (1ull << 14)
#define EPT_CAP_2M_PAGE (1ull << 16)
@@ -4669,8 +4669,8 @@ static void test_eptp_ad_bit(u64 eptp, bool ctrl)
*
* - The EPT memory type (bits 2:0) must be a value supported by the
* processor as indicated in the IA32_VMX_EPT_VPID_CAP MSR.
- * - Bits 5:3 (1 less than the EPT page-walk length) must be 3,
- * indicating an EPT page-walk length of 4.
+ * - Bits 5:3 (1 less than the EPT page-walk length) must indicate a
+ * supported EPT page-walk length.
* - Bit 6 (enable bit for accessed and dirty flags for EPT) must be
* 0 if bit 21 of the IA32_VMX_EPT_VPID_CAP MSR is read as 0,
* indicating that the processor does not support accessed and dirty
@@ -4710,6 +4710,9 @@ static void test_ept_eptp(void)
if (msr & EPT_CAP_WB)
wr_bk = true;
+ /* Support for 4-level EPT is mandatory. */
+ report(msr & EPT_CAP_PWL4, "4-level EPT support check");
+
primary |= CPU_SECONDARY;
vmcs_write(CPU_EXEC_CTRL0, primary);
secondary |= CPU_EPT;
@@ -4751,12 +4754,13 @@ static void test_ept_eptp(void)
eptp = (eptp & ~EPT_MEM_TYPE_MASK) | 6ul;
/*
- * Page walk length (bits 5:3)
+ * Page walk length (bits 5:3). Note, the value in VMCS.EPTP "is 1
+ * less than the EPT page-walk length".
*/
for (i = 0; i < 8; i++) {
eptp = (eptp & ~EPTP_PG_WALK_LEN_MASK) |
(i << EPTP_PG_WALK_LEN_SHIFT);
- if (i == 3)
+ if (i == 3 || (i == 4 && (msr & EPT_CAP_PWL5)))
ctrl = true;
else
ctrl = false;
Modify the EPTP test to expect success when the EPTP is configured for 5-level page walks and 5-level walks are enumerated as supported by the EPT capabilities MSR. KVM is in the process of gaining support for 5-level nested EPT[*]. [*] https://lkml.kernel.org/r/20200206220836.22743-1-sean.j.christopherson@intel.com Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> --- x86/vmx.h | 1 + x86/vmx_tests.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-)