From: Jon Kohler <jon@nutanix.com>
To: seanjc@google.com, pbonzini@redhat.com, kvm@vger.kernel.org
Cc: Jon Kohler <jon@nutanix.com>
Subject: [kvm-unit-tests PATCH 08/17] x86/vmx: switch to new vmx.h EPT access and dirty defs
Date: Tue, 16 Sep 2025 10:22:37 -0700 [thread overview]
Message-ID: <20250916172247.610021-9-jon@nutanix.com> (raw)
In-Reply-To: <20250916172247.610021-1-jon@nutanix.com>
Migrate to new vmx.h's EPT defs for access and dirty bits, which makes
it easier to grok from one code base to another.
No functional change intended.
Signed-off-by: Jon Kohler <jon@nutanix.com>
---
x86/vmx.c | 20 +++++++++++---------
x86/vmx.h | 3 ---
x86/vmx_tests.c | 43 ++++++++++++++++++++++++-------------------
3 files changed, 35 insertions(+), 31 deletions(-)
diff --git a/x86/vmx.c b/x86/vmx.c
index 6b7dca34..a3c6c60b 100644
--- a/x86/vmx.c
+++ b/x86/vmx.c
@@ -986,7 +986,7 @@ static void clear_ept_ad_pte(unsigned long *pml4, unsigned long guest_addr)
for (l = EPT_PAGE_LEVEL; ; --l) {
offset = (guest_addr >> EPT_LEVEL_SHIFT(l)) & EPT_PGDIR_MASK;
- pt[offset] &= ~(EPT_ACCESS_FLAG|EPT_DIRTY_FLAG);
+ pt[offset] &= ~(VMX_EPT_ACCESS_BIT | VMX_EPT_DIRTY_BIT);
pte = pt[offset];
if (l == 1 || (l < 4 && (pte & EPT_LARGE_PAGE)))
break;
@@ -1043,12 +1043,14 @@ void check_ept_ad(unsigned long *pml4, u64 guest_cr3,
}
if (!bad_pt_ad) {
- bad_pt_ad |= (ept_pte & (EPT_ACCESS_FLAG|EPT_DIRTY_FLAG)) != expected_pt_ad;
+ bad_pt_ad |=
+ (ept_pte & (VMX_EPT_ACCESS_BIT | VMX_EPT_DIRTY_BIT)) !=
+ expected_pt_ad;
if (bad_pt_ad)
report_fail("EPT - guest level %d page table A=%d/D=%d",
l,
- !!(expected_pt_ad & EPT_ACCESS_FLAG),
- !!(expected_pt_ad & EPT_DIRTY_FLAG));
+ !!(expected_pt_ad & VMX_EPT_ACCESS_BIT),
+ !!(expected_pt_ad & VMX_EPT_DIRTY_BIT));
}
pte = pt[offset];
@@ -1061,8 +1063,8 @@ void check_ept_ad(unsigned long *pml4, u64 guest_cr3,
if (!bad_pt_ad)
report_pass("EPT - guest page table structures A=%d/D=%d",
- !!(expected_pt_ad & EPT_ACCESS_FLAG),
- !!(expected_pt_ad & EPT_DIRTY_FLAG));
+ !!(expected_pt_ad & VMX_EPT_ACCESS_BIT),
+ !!(expected_pt_ad & VMX_EPT_DIRTY_BIT));
offset = (guest_addr >> EPT_LEVEL_SHIFT(l)) & EPT_PGDIR_MASK;
offset_in_page = guest_addr & ((1 << EPT_LEVEL_SHIFT(l)) - 1);
@@ -1072,10 +1074,10 @@ void check_ept_ad(unsigned long *pml4, u64 guest_cr3,
report_fail("EPT - guest physical address is not mapped");
return;
}
- report((ept_pte & (EPT_ACCESS_FLAG | EPT_DIRTY_FLAG)) == expected_gpa_ad,
+ report((ept_pte & (VMX_EPT_ACCESS_BIT | VMX_EPT_DIRTY_BIT)) == expected_gpa_ad,
"EPT - guest physical address A=%d/D=%d",
- !!(expected_gpa_ad & EPT_ACCESS_FLAG),
- !!(expected_gpa_ad & EPT_DIRTY_FLAG));
+ !!(expected_gpa_ad & VMX_EPT_ACCESS_BIT),
+ !!(expected_gpa_ad & VMX_EPT_DIRTY_BIT));
}
void set_ept_pte(unsigned long *pml4, unsigned long guest_addr,
diff --git a/x86/vmx.h b/x86/vmx.h
index 3f792d4a..65012e0e 100644
--- a/x86/vmx.h
+++ b/x86/vmx.h
@@ -570,7 +570,6 @@ enum Intr_type {
#define EPTP_PG_WALK_LEN_MASK 0x38ul
#define EPTP_RESERV_BITS_MASK 0x1ful
#define EPTP_RESERV_BITS_SHIFT 0x7ul
-#define EPTP_AD_FLAG (1ul << 6)
#define EPT_MEM_TYPE_UC 0ul
#define EPT_MEM_TYPE_WC 1ul
@@ -578,8 +577,6 @@ enum Intr_type {
#define EPT_MEM_TYPE_WP 5ul
#define EPT_MEM_TYPE_WB 6ul
-#define EPT_ACCESS_FLAG (1ul << 8)
-#define EPT_DIRTY_FLAG (1ul << 9)
#define EPT_LARGE_PAGE (1ul << 7)
#define EPT_MEM_TYPE_SHIFT 3ul
#define EPT_MEM_TYPE_MASK 0x7ul
diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index eda9e88a..f7ea411f 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -1066,7 +1066,7 @@ static int __setup_ept(u64 hpa, bool enable_ad)
eptp |= (3 << EPTP_PG_WALK_LEN_SHIFT);
eptp |= hpa;
if (enable_ad)
- eptp |= EPTP_AD_FLAG;
+ eptp |= VMX_EPTP_AD_ENABLE_BIT;
vmcs_write(EPTP, eptp);
vmcs_write(CPU_EXEC_CTRL0, vmcs_read(CPU_EXEC_CTRL0)| CPU_SECONDARY);
@@ -1141,19 +1141,19 @@ static int enable_unrestricted_guest(bool need_valid_ept)
static void ept_enable_ad_bits(void)
{
- eptp |= EPTP_AD_FLAG;
+ eptp |= VMX_EPTP_AD_ENABLE_BIT;
vmcs_write(EPTP, eptp);
}
static void ept_disable_ad_bits(void)
{
- eptp &= ~EPTP_AD_FLAG;
+ eptp &= ~VMX_EPTP_AD_ENABLE_BIT;
vmcs_write(EPTP, eptp);
}
static int ept_ad_enabled(void)
{
- return eptp & EPTP_AD_FLAG;
+ return eptp & VMX_EPTP_AD_ENABLE_BIT;
}
static void ept_enable_ad_bits_or_skip_test(void)
@@ -1350,12 +1350,15 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
case 0:
check_ept_ad(pml4, guest_cr3,
(unsigned long)data_page1,
- have_ad ? EPT_ACCESS_FLAG : 0,
- have_ad ? EPT_ACCESS_FLAG | EPT_DIRTY_FLAG : 0);
+ have_ad ? VMX_EPT_ACCESS_BIT : 0,
+ have_ad ? VMX_EPT_ACCESS_BIT |
+ VMX_EPT_DIRTY_BIT : 0);
check_ept_ad(pml4, guest_cr3,
(unsigned long)data_page2,
- have_ad ? EPT_ACCESS_FLAG | EPT_DIRTY_FLAG : 0,
- have_ad ? EPT_ACCESS_FLAG | EPT_DIRTY_FLAG : 0);
+ have_ad ? VMX_EPT_ACCESS_BIT |
+ VMX_EPT_DIRTY_BIT : 0,
+ have_ad ? VMX_EPT_ACCESS_BIT |
+ VMX_EPT_DIRTY_BIT : 0);
clear_ept_ad(pml4, guest_cr3, (unsigned long)data_page1);
clear_ept_ad(pml4, guest_cr3, (unsigned long)data_page2);
if (have_ad)
@@ -1451,7 +1454,8 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
switch(vmx_get_test_stage()) {
case 3:
check_ept_ad(pml4, guest_cr3, (unsigned long)data_page1, 0,
- have_ad ? EPT_ACCESS_FLAG | EPT_DIRTY_FLAG : 0);
+ have_ad ? VMX_EPT_ACCESS_BIT |
+ VMX_EPT_DIRTY_BIT : 0);
clear_ept_ad(pml4, guest_cr3, (unsigned long)data_page1);
if (exit_qual == (EPT_VIOLATION_ACC_WRITE |
EPT_VIOLATION_GVA_IS_VALID |
@@ -1463,7 +1467,8 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
break;
case 4:
check_ept_ad(pml4, guest_cr3, (unsigned long)data_page1, 0,
- have_ad ? EPT_ACCESS_FLAG | EPT_DIRTY_FLAG : 0);
+ have_ad ? VMX_EPT_ACCESS_BIT |
+ VMX_EPT_DIRTY_BIT : 0);
clear_ept_ad(pml4, guest_cr3, (unsigned long)data_page1);
if (exit_qual == (EPT_VIOLATION_ACC_READ |
(have_ad ? EPT_VIOLATION_ACC_WRITE : 0) |
@@ -2517,11 +2522,11 @@ static void ept_access_paddr(unsigned long ept_access, unsigned long pte_ad,
if (ept_ad_enabled()) {
for (i = EPT_PAGE_LEVEL; i > 0; i--) {
TEST_ASSERT(get_ept_pte(pml4, gpa, i, &epte));
- TEST_ASSERT(epte & EPT_ACCESS_FLAG);
+ TEST_ASSERT(epte & VMX_EPT_ACCESS_BIT);
if (i == 1)
- TEST_ASSERT(epte & EPT_DIRTY_FLAG);
+ TEST_ASSERT(epte & VMX_EPT_DIRTY_BIT);
else
- TEST_ASSERT_EQ(epte & EPT_DIRTY_FLAG, 0);
+ TEST_ASSERT_EQ(epte & VMX_EPT_DIRTY_BIT, 0);
}
}
@@ -4783,7 +4788,7 @@ static void test_eptp_ad_bit(u64 eptp, bool is_ctrl_valid)
{
vmcs_write(EPTP, eptp);
report_prefix_pushf("Enable-EPT enabled; EPT accessed and dirty flag %s",
- (eptp & EPTP_AD_FLAG) ? "1": "0");
+ (eptp & VMX_EPTP_AD_ENABLE_BIT) ? "1" : "0");
if (is_ctrl_valid)
test_vmx_valid_controls();
else
@@ -4872,20 +4877,20 @@ static void test_ept_eptp(void)
*/
if (ept_ad_bits_supported()) {
report_info("Processor supports accessed and dirty flag");
- eptp &= ~EPTP_AD_FLAG;
+ eptp &= ~VMX_EPTP_AD_ENABLE_BIT;
test_eptp_ad_bit(eptp, true);
- eptp |= EPTP_AD_FLAG;
+ eptp |= VMX_EPTP_AD_ENABLE_BIT;
test_eptp_ad_bit(eptp, true);
} else {
report_info("Processor does not supports accessed and dirty flag");
- eptp &= ~EPTP_AD_FLAG;
+ eptp &= ~VMX_EPTP_AD_ENABLE_BIT;
test_eptp_ad_bit(eptp, true);
- eptp |= EPTP_AD_FLAG;
+ eptp |= VMX_EPTP_AD_ENABLE_BIT;
test_eptp_ad_bit(eptp, false);
- eptp &= ~EPTP_AD_FLAG;
+ eptp &= ~VMX_EPTP_AD_ENABLE_BIT;
}
/*
--
2.43.0
next prev parent reply other threads:[~2025-09-16 16:44 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-16 17:22 [kvm-unit-tests PATCH 00/17] x86/vmx: align with Linux kernel VMX definitions Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 01/17] lib: add linux vmx.h clone from 6.16 Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 02/17] lib: add linux trapnr.h " Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 03/17] lib: add vmxfeatures.h " Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 04/17] lib: define __aligned() in compiler.h Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 05/17] x86/vmx: basic integration for new vmx.h Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 06/17] x86/vmx: switch to new vmx.h EPT violation defs Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 07/17] x86/vmx: switch to new vmx.h EPT RWX defs Jon Kohler
2025-09-16 17:22 ` Jon Kohler [this message]
2025-09-16 17:22 ` [kvm-unit-tests PATCH 09/17] x86/vmx: switch to new vmx.h EPT capability and memory type defs Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 10/17] x86/vmx: switch to new vmx.h primary processor-based VM-execution controls Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 11/17] x86/vmx: switch to new vmx.h secondary execution control bit Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 12/17] x86/vmx: switch to new vmx.h secondary execution controls Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 13/17] x86/vmx: switch to new vmx.h pin based VM-execution controls Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 14/17] x86/vmx: switch to new vmx.h exit controls Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 15/17] x86/vmx: switch to new vmx.h entry controls Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 16/17] x86/vmx: switch to new vmx.h interrupt defs Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 17/17] x86/vmx: align exit reasons with Linux uapi Jon Kohler
2025-11-12 19:02 ` [kvm-unit-tests PATCH 00/17] x86/vmx: align with Linux kernel VMX definitions Sean Christopherson
2025-11-14 14:52 ` Jon Kohler
2025-11-17 17:41 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250916172247.610021-9-jon@nutanix.com \
--to=jon@nutanix.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox