@@ -1540,16 +1540,26 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
break;
case MSR_KVM_REGISTER_MEM_AREA: {
struct kvm_memory_area area_desc;
+ u64 wall_data;
kvm_read_guest(vcpu->kvm, data, &area_desc, sizeof(area_desc));
area_desc.result = 0xF;
+ if (area_desc.type == KVM_AREA_WALLCLOCK) {
+ kvm_read_guest(vcpu->kvm, area_desc.base,
+ &wall_data, area_desc.size);
+ vcpu->kvm->arch.wall_clock = wall_data;
+ kvm_write_wall_clock(vcpu->kvm, wall_data);
+ 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;
return 1;
}
rma_out:
+ area_desc.result = 0;
kvm_write_guest(vcpu->kvm, data, &area_desc, sizeof(area_desc));
break;
}