@@ -83,7 +83,16 @@ module_param(dbg, bool, 0644);
83
83
#define PTE_PREFETCH_NUM 8
84
84
85
85
#define PT_FIRST_AVAIL_BITS_SHIFT 10
86
- #define PT64_SECOND_AVAIL_BITS_SHIFT 52
86
+ #define PT64_SECOND_AVAIL_BITS_SHIFT 54
87
+
88
+ /*
89
+ * The mask used to denote special SPTEs, which can be either MMIO SPTEs or
90
+ * Access Tracking SPTEs.
91
+ */
92
+ #define SPTE_SPECIAL_MASK (3ULL << 52)
93
+ #define SPTE_AD_ENABLED_MASK (0ULL << 52)
94
+ #define SPTE_AD_DISABLED_MASK (1ULL << 52)
95
+ #define SPTE_MMIO_MASK (3ULL << 52)
87
96
88
97
#define PT64_LEVEL_BITS 9
89
98
@@ -219,12 +228,11 @@ static u64 __read_mostly shadow_present_mask;
219
228
static u64 __read_mostly shadow_me_mask ;
220
229
221
230
/*
222
- * SPTEs used by MMUs without A/D bits are marked with shadow_acc_track_value.
223
- * Non-present SPTEs with shadow_acc_track_value set are in place for access
224
- * tracking .
231
+ * SPTEs used by MMUs without A/D bits are marked with SPTE_AD_DISABLED_MASK;
232
+ * shadow_acc_track_mask is the set of bits to be cleared in non-accessed
233
+ * pages .
225
234
*/
226
235
static u64 __read_mostly shadow_acc_track_mask ;
227
- static const u64 shadow_acc_track_value = SPTE_SPECIAL_MASK ;
228
236
229
237
/*
230
238
* The mask/shift to use for saving the original R/X bits when marking the PTE
@@ -304,7 +312,7 @@ void kvm_mmu_set_mmio_spte_mask(u64 mmio_mask, u64 mmio_value, u64 access_mask)
304
312
{
305
313
BUG_ON ((u64 )(unsigned )access_mask != access_mask );
306
314
BUG_ON ((mmio_mask & mmio_value ) != mmio_value );
307
- shadow_mmio_value = mmio_value | SPTE_SPECIAL_MASK ;
315
+ shadow_mmio_value = mmio_value | SPTE_MMIO_MASK ;
308
316
shadow_mmio_mask = mmio_mask | SPTE_SPECIAL_MASK ;
309
317
shadow_mmio_access_mask = access_mask ;
310
318
}
@@ -323,7 +331,7 @@ static inline bool sp_ad_disabled(struct kvm_mmu_page *sp)
323
331
static inline bool spte_ad_enabled (u64 spte )
324
332
{
325
333
MMU_WARN_ON (is_mmio_spte (spte ));
326
- return ! (spte & shadow_acc_track_value ) ;
334
+ return (spte & SPTE_SPECIAL_MASK ) == SPTE_AD_ENABLED_MASK ;
327
335
}
328
336
329
337
static inline u64 spte_shadow_accessed_mask (u64 spte )
@@ -461,7 +469,7 @@ void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask,
461
469
{
462
470
BUG_ON (!dirty_mask != !accessed_mask );
463
471
BUG_ON (!accessed_mask && !acc_track_mask );
464
- BUG_ON (acc_track_mask & shadow_acc_track_value );
472
+ BUG_ON (acc_track_mask & SPTE_SPECIAL_MASK );
465
473
466
474
shadow_user_mask = user_mask ;
467
475
shadow_accessed_mask = accessed_mask ;
@@ -2622,7 +2630,7 @@ static void link_shadow_page(struct kvm_vcpu *vcpu, u64 *sptep,
2622
2630
shadow_user_mask | shadow_x_mask | shadow_me_mask ;
2623
2631
2624
2632
if (sp_ad_disabled (sp ))
2625
- spte |= shadow_acc_track_value ;
2633
+ spte |= SPTE_AD_DISABLED_MASK ;
2626
2634
else
2627
2635
spte |= shadow_accessed_mask ;
2628
2636
@@ -2968,7 +2976,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
2968
2976
2969
2977
sp = page_header (__pa (sptep ));
2970
2978
if (sp_ad_disabled (sp ))
2971
- spte |= shadow_acc_track_value ;
2979
+ spte |= SPTE_AD_DISABLED_MASK ;
2972
2980
2973
2981
/*
2974
2982
* For the EPT case, shadow_present_mask is 0 if hardware
0 commit comments