From patchwork Fri Oct 16 19:27:38 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Glauber Costa X-Patchwork-Id: 54405 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n9GJRmpX014324 for ; Fri, 16 Oct 2009 19:27:49 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752060AbZJPT1k (ORCPT ); Fri, 16 Oct 2009 15:27:40 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751864AbZJPT1k (ORCPT ); Fri, 16 Oct 2009 15:27:40 -0400 Received: from mx1.redhat.com ([209.132.183.28]:28259 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751196AbZJPT1h (ORCPT ); Fri, 16 Oct 2009 15:27:37 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n9GJRgPm032438 for ; Fri, 16 Oct 2009 15:27:42 -0400 Received: from localhost.localdomain (virtlab1.virt.bos.redhat.com [10.16.72.21]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id n9GJRd8S023120; Fri, 16 Oct 2009 15:27:41 -0400 From: Glauber Costa To: kvm@vger.kernel.org Cc: avi@redhat.com Subject: [PATCH 2/3] properly save kvm system time msr registers Date: Fri, 16 Oct 2009 15:27:38 -0400 Message-Id: <1255721259-11740-3-git-send-email-glommer@redhat.com> In-Reply-To: <1255721259-11740-2-git-send-email-glommer@redhat.com> References: <1255721259-11740-1-git-send-email-glommer@redhat.com> <1255721259-11740-2-git-send-email-glommer@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c index 475151d..693f5b2 100644 --- a/qemu-kvm-x86.c +++ b/qemu-kvm-x86.c @@ -834,6 +834,12 @@ static int get_msr_entry(struct kvm_msr_entry *entry, CPUState *env) case MSR_VM_HSAVE_PA: env->vm_hsave = entry->data; break; + case MSR_KVM_SYSTEM_TIME: + env->system_time_msr = entry->data; + break; + case MSR_KVM_WALL_CLOCK: + env->wall_clock_msr = entry->data; + break; default: printf("Warning unknown msr index 0x%x\n", entry->index); return 1; @@ -842,9 +848,9 @@ static int get_msr_entry(struct kvm_msr_entry *entry, CPUState *env) } #ifdef TARGET_X86_64 -#define MSR_COUNT 10 +#define MSR_COUNT 12 #else -#define MSR_COUNT 6 +#define MSR_COUNT 8 #endif static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs) @@ -1002,6 +1008,8 @@ void kvm_arch_load_regs(CPUState *env) set_msr_entry(&msrs[n++], MSR_LSTAR , env->lstar); } #endif + set_msr_entry(&msrs[n++], MSR_KVM_SYSTEM_TIME, env->system_time_msr); + set_msr_entry(&msrs[n++], MSR_KVM_WALL_CLOCK, env->wall_clock_msr); rc = kvm_set_msrs(env->kvm_cpu_state.vcpu_ctx, msrs, n); if (rc == -1) @@ -1181,6 +1189,9 @@ void kvm_arch_save_regs(CPUState *env) msrs[n++].index = MSR_LSTAR; } #endif + msrs[n++].index = MSR_KVM_SYSTEM_TIME; + msrs[n++].index = MSR_KVM_WALL_CLOCK; + rc = kvm_get_msrs(env->kvm_cpu_state.vcpu_ctx, msrs, n); if (rc == -1) { perror("kvm_get_msrs FAILED"); diff --git a/target-i386/cpu.h b/target-i386/cpu.h index 278d3e3..4605fd2 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -667,6 +667,8 @@ typedef struct CPUX86State { target_ulong fmask; target_ulong kernelgsbase; #endif + uint64_t system_time_msr; + uint64_t wall_clock_msr; uint64_t tsc; @@ -886,7 +888,7 @@ uint64_t cpu_get_tsc(CPUX86State *env); #define cpu_signal_handler cpu_x86_signal_handler #define cpu_list x86_cpu_list -#define CPU_SAVE_VERSION 11 +#define CPU_SAVE_VERSION 12 /* MMU modes definitions */ #define MMU_MODE0_SUFFIX _kernel diff --git a/target-i386/machine.c b/target-i386/machine.c index 16d9c57..b364936 100644 --- a/target-i386/machine.c +++ b/target-i386/machine.c @@ -479,6 +479,9 @@ const VMStateDescription vmstate_cpu = { VMSTATE_UINT64_ARRAY_V(mce_banks, CPUState, MCE_BANKS_DEF *4, 10), /* rdtscp */ VMSTATE_UINT64_V(tsc_aux, CPUState, 11), + /* KVM pvclock msr */ + VMSTATE_UINT64_V(system_time_msr, CPUState, 12), + VMSTATE_UINT64_V(wall_clock_msr, CPUState, 12), VMSTATE_END_OF_LIST() } };