Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6903074c authored by Xiao Guangrong's avatar Xiao Guangrong Committed by Avi Kivity
Browse files

KVM: MMU: audit: check whether have unsync sps after root sync



After root synced, all unsync sps are synced, this patch add a check to make
sure it's no unsync sps in VCPU's page table

Signed-off-by: default avatarXiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 38904e12
Loading
Loading
Loading
Loading
+9 −2
Original line number Original line Diff line number Diff line
@@ -53,14 +53,18 @@ enum {
	AUDIT_PRE_PAGE_FAULT,
	AUDIT_PRE_PAGE_FAULT,
	AUDIT_POST_PAGE_FAULT,
	AUDIT_POST_PAGE_FAULT,
	AUDIT_PRE_PTE_WRITE,
	AUDIT_PRE_PTE_WRITE,
	AUDIT_POST_PTE_WRITE
	AUDIT_POST_PTE_WRITE,
	AUDIT_PRE_SYNC,
	AUDIT_POST_SYNC
};
};


char *audit_point_name[] = {
char *audit_point_name[] = {
	"pre page fault",
	"pre page fault",
	"post page fault",
	"post page fault",
	"pre pte write",
	"pre pte write",
	"post pte write"
	"post pte write",
	"pre sync",
	"post sync"
};
};


#undef MMU_DEBUG
#undef MMU_DEBUG
@@ -2516,6 +2520,8 @@ static void mmu_sync_roots(struct kvm_vcpu *vcpu)


	if (!VALID_PAGE(vcpu->arch.mmu.root_hpa))
	if (!VALID_PAGE(vcpu->arch.mmu.root_hpa))
		return;
		return;

	trace_kvm_mmu_audit(vcpu, AUDIT_PRE_SYNC);
	if (vcpu->arch.mmu.root_level == PT64_ROOT_LEVEL) {
	if (vcpu->arch.mmu.root_level == PT64_ROOT_LEVEL) {
		hpa_t root = vcpu->arch.mmu.root_hpa;
		hpa_t root = vcpu->arch.mmu.root_hpa;
		sp = page_header(root);
		sp = page_header(root);
@@ -2531,6 +2537,7 @@ static void mmu_sync_roots(struct kvm_vcpu *vcpu)
			mmu_sync_children(vcpu, sp);
			mmu_sync_children(vcpu, sp);
		}
		}
	}
	}
	trace_kvm_mmu_audit(vcpu, AUDIT_POST_SYNC);
}
}


void kvm_mmu_sync_roots(struct kvm_vcpu *vcpu)
void kvm_mmu_sync_roots(struct kvm_vcpu *vcpu)
+10 −1
Original line number Original line Diff line number Diff line
@@ -164,6 +164,14 @@ static void audit_sptes_have_rmaps(struct kvm_vcpu *vcpu, u64 *sptep, int level)
		inspect_spte_has_rmap(vcpu->kvm, sptep);
		inspect_spte_has_rmap(vcpu->kvm, sptep);
}
}


static void audit_spte_after_sync(struct kvm_vcpu *vcpu, u64 *sptep, int level)
{
	struct kvm_mmu_page *sp = page_header(__pa(sptep));

	if (audit_point == AUDIT_POST_SYNC && sp->unsync)
		audit_printk("meet unsync sp(%p) after sync root.\n", sp);
}

static void check_mappings_rmap(struct kvm *kvm, struct kvm_mmu_page *sp)
static void check_mappings_rmap(struct kvm *kvm, struct kvm_mmu_page *sp)
{
{
	int i;
	int i;
@@ -179,7 +187,7 @@ static void check_mappings_rmap(struct kvm *kvm, struct kvm_mmu_page *sp)
	}
	}
}
}


void audit_write_protection(struct kvm *kvm, struct kvm_mmu_page *sp)
static void audit_write_protection(struct kvm *kvm, struct kvm_mmu_page *sp)
{
{
	struct kvm_memory_slot *slot;
	struct kvm_memory_slot *slot;
	unsigned long *rmapp;
	unsigned long *rmapp;
@@ -215,6 +223,7 @@ static void audit_spte(struct kvm_vcpu *vcpu, u64 *sptep, int level)
{
{
	audit_sptes_have_rmaps(vcpu, sptep, level);
	audit_sptes_have_rmaps(vcpu, sptep, level);
	audit_mappings(vcpu, sptep, level);
	audit_mappings(vcpu, sptep, level);
	audit_spte_after_sync(vcpu, sptep, level);
}
}


static void audit_vcpu_spte(struct kvm_vcpu *vcpu)
static void audit_vcpu_spte(struct kvm_vcpu *vcpu)