|
@@ -156,6 +156,8 @@ module_param(oos_shadow, bool, 0644);
|
|
|
#define CREATE_TRACE_POINTS
|
|
|
#include "mmutrace.h"
|
|
|
|
|
|
+#define SPTE_HOST_WRITEABLE (1ULL << PT_FIRST_AVAIL_BITS_SHIFT)
|
|
|
+
|
|
|
#define SHADOW_PT_INDEX(addr, level) PT64_INDEX(addr, level)
|
|
|
|
|
|
struct kvm_rmap_desc {
|
|
@@ -1754,7 +1756,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
|
|
|
unsigned pte_access, int user_fault,
|
|
|
int write_fault, int dirty, int level,
|
|
|
gfn_t gfn, pfn_t pfn, bool speculative,
|
|
|
- bool can_unsync)
|
|
|
+ bool can_unsync, bool reset_host_protection)
|
|
|
{
|
|
|
u64 spte;
|
|
|
int ret = 0;
|
|
@@ -1781,6 +1783,9 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
|
|
|
spte |= kvm_x86_ops->get_mt_mask(vcpu, gfn,
|
|
|
kvm_is_mmio_pfn(pfn));
|
|
|
|
|
|
+ if (reset_host_protection)
|
|
|
+ spte |= SPTE_HOST_WRITEABLE;
|
|
|
+
|
|
|
spte |= (u64)pfn << PAGE_SHIFT;
|
|
|
|
|
|
if ((pte_access & ACC_WRITE_MASK)
|
|
@@ -1826,7 +1831,8 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
|
|
|
unsigned pt_access, unsigned pte_access,
|
|
|
int user_fault, int write_fault, int dirty,
|
|
|
int *ptwrite, int level, gfn_t gfn,
|
|
|
- pfn_t pfn, bool speculative)
|
|
|
+ pfn_t pfn, bool speculative,
|
|
|
+ bool reset_host_protection)
|
|
|
{
|
|
|
int was_rmapped = 0;
|
|
|
int was_writeble = is_writeble_pte(*sptep);
|
|
@@ -1858,7 +1864,8 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
|
|
|
}
|
|
|
|
|
|
if (set_spte(vcpu, sptep, pte_access, user_fault, write_fault,
|
|
|
- dirty, level, gfn, pfn, speculative, true)) {
|
|
|
+ dirty, level, gfn, pfn, speculative, true,
|
|
|
+ reset_host_protection)) {
|
|
|
if (write_fault)
|
|
|
*ptwrite = 1;
|
|
|
kvm_x86_ops->tlb_flush(vcpu);
|
|
@@ -1906,7 +1913,7 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write,
|
|
|
if (iterator.level == level) {
|
|
|
mmu_set_spte(vcpu, iterator.sptep, ACC_ALL, ACC_ALL,
|
|
|
0, write, 1, &pt_write,
|
|
|
- level, gfn, pfn, false);
|
|
|
+ level, gfn, pfn, false, true);
|
|
|
++vcpu->stat.pf_fixed;
|
|
|
break;
|
|
|
}
|