diff mbox

[09/16] KVM-HV: Implement kvmclock systemtime over KVM - KVM Virtual Memory

Message ID 1295892397-11354-10-git-send-email-glommer@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Glauber Costa Jan. 24, 2011, 6:06 p.m. UTC
None
diff mbox

Patch

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index a232a36..81b2f34 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1453,6 +1453,33 @@  static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data)
 	return 0;
 }
 
+static void kvmclock_register_page(struct kvm_vcpu *vcpu, u64 data)
+{
+	if (vcpu->arch.time_page) {
+		kvm_release_page_dirty(vcpu->arch.time_page);
+		vcpu->arch.time_page = NULL;
+	}
+
+	vcpu->arch.time = data;
+	kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
+
+	/* we verify if the enable bit is set... */
+	if (!(data & 1))
+		return;
+
+	/* ...but clean it before doing the actual write */
+	vcpu->arch.time_offset = data & ~(PAGE_MASK | 1);
+
+	vcpu->arch.time_page =
+			gfn_to_page(vcpu->kvm, data >> PAGE_SHIFT);
+
+	if (is_error_page(vcpu->arch.time_page)) {
+		kvm_release_page_clean(vcpu->arch.time_page);
+		vcpu->arch.time_page = NULL;
+	}
+}
+
+
 int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
 {
 	switch (msr) {
@@ -1510,28 +1537,7 @@  int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
 		break;
 	case MSR_KVM_SYSTEM_TIME_NEW:
 	case MSR_KVM_SYSTEM_TIME: {
-		if (vcpu->arch.time_page) {
-			kvm_release_page_dirty(vcpu->arch.time_page);
-			vcpu->arch.time_page = NULL;
-		}
-
-		vcpu->arch.time = data;
-		kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
-
-		/* we verify if the enable bit is set... */
-		if (!(data & 1))
-			break;
-
-		/* ...but clean it before doing the actual write */
-		vcpu->arch.time_offset = data & ~(PAGE_MASK | 1);
-
-		vcpu->arch.time_page =
-				gfn_to_page(vcpu->kvm, data >> PAGE_SHIFT);
-
-		if (is_error_page(vcpu->arch.time_page)) {
-			kvm_release_page_clean(vcpu->arch.time_page);
-			vcpu->arch.time_page = NULL;
-		}
+		kvmclock_register_page(vcpu, data);
 		break;
 	}
 	case MSR_KVM_ASYNC_PF_EN:
@@ -1553,6 +1559,11 @@  int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
 			goto rma_out;
 		}
 
+		if (area_desc.type == KVM_AREA_SYSTIME) {
+			kvmclock_register_page(vcpu, area_desc.base | 1);
+			goto rma_out;
+		}
+
 		if (vcpu->kvm->register_mem_area_uspace) {
 			vcpu->run->exit_reason = KVM_EXIT_X86_MSR_OP;
 			vcpu->run->msr.msr_data = data;