[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 7/7] kvm: save/restore x86-64 MSRs on x86-64 kernels
From: |
Marcelo Tosatti |
Subject: |
[Qemu-devel] [PATCH 7/7] kvm: save/restore x86-64 MSRs on x86-64 kernels |
Date: |
Thu, 21 Oct 2010 16:25:53 -0200 |
Signed-off-by: Marcelo Tosatti <address@hidden>
---
target-i386/kvm.c | 30 ++++++++++++++++++++----------
1 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index e2f7e2e..ae0a034 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -15,6 +15,7 @@
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
+#include <sys/utsname.h>
#include <linux/kvm.h>
@@ -53,6 +54,8 @@
#define BUS_MCEERR_AO 5
#endif
+static int lm_capable_kernel;
+
#ifdef KVM_CAP_EXT_CPUID
static struct kvm_cpuid2 *try_get_cpuid(KVMState *s, int max)
@@ -523,6 +526,11 @@ int kvm_arch_init(KVMState *s, int smp_cpus)
{
int ret;
+ struct utsname utsname;
+
+ uname(&utsname);
+ lm_capable_kernel = strcmp(utsname.machine, "x86_64") == 0;
+
/* create vm86 tss. KVM uses vm86 mode to emulate 16-bit code
* directly. In order to use vm86 mode, a TSS is needed. Since this
* must be part of guest physical memory, we need to allocate it. Older
@@ -810,11 +818,12 @@ static int kvm_put_msrs(CPUState *env, int level)
if (kvm_has_msr_hsave_pa(env))
kvm_msr_entry_set(&msrs[n++], MSR_VM_HSAVE_PA, env->vm_hsave);
#ifdef TARGET_X86_64
- /* FIXME if lm capable */
- kvm_msr_entry_set(&msrs[n++], MSR_CSTAR, env->cstar);
- kvm_msr_entry_set(&msrs[n++], MSR_KERNELGSBASE, env->kernelgsbase);
- kvm_msr_entry_set(&msrs[n++], MSR_FMASK, env->fmask);
- kvm_msr_entry_set(&msrs[n++], MSR_LSTAR, env->lstar);
+ if (lm_capable_kernel) {
+ kvm_msr_entry_set(&msrs[n++], MSR_CSTAR, env->cstar);
+ kvm_msr_entry_set(&msrs[n++], MSR_KERNELGSBASE, env->kernelgsbase);
+ kvm_msr_entry_set(&msrs[n++], MSR_FMASK, env->fmask);
+ kvm_msr_entry_set(&msrs[n++], MSR_LSTAR, env->lstar);
+ }
#endif
if (level == KVM_PUT_FULL_STATE) {
/*
@@ -1046,11 +1055,12 @@ static int kvm_get_msrs(CPUState *env)
msrs[n++].index = MSR_VM_HSAVE_PA;
msrs[n++].index = MSR_IA32_TSC;
#ifdef TARGET_X86_64
- /* FIXME lm_capable_kernel */
- msrs[n++].index = MSR_CSTAR;
- msrs[n++].index = MSR_KERNELGSBASE;
- msrs[n++].index = MSR_FMASK;
- msrs[n++].index = MSR_LSTAR;
+ if (lm_capable_kernel) {
+ msrs[n++].index = MSR_CSTAR;
+ msrs[n++].index = MSR_KERNELGSBASE;
+ msrs[n++].index = MSR_FMASK;
+ msrs[n++].index = MSR_LSTAR;
+ }
#endif
msrs[n++].index = MSR_KVM_SYSTEM_TIME;
msrs[n++].index = MSR_KVM_WALL_CLOCK;
--
1.7.2.1
- [Qemu-devel] [PATCH 0/7] [PULL] qemu-kvm.git uq/master queue, Marcelo Tosatti, 2010/10/21
- [Qemu-devel] [PATCH 5/7] kvm: factor out kvm_has_msr_star, Marcelo Tosatti, 2010/10/21
- [Qemu-devel] [PATCH 4/7] kvm: add save/restore of MSR_VM_HSAVE_PA, Marcelo Tosatti, 2010/10/21
- [Qemu-devel] [PATCH 3/7] Fix build on !KVM_CAP_MCE, Marcelo Tosatti, 2010/10/21
- [Qemu-devel] [PATCH 7/7] kvm: save/restore x86-64 MSRs on x86-64 kernels,
Marcelo Tosatti <=
- [Qemu-devel] [PATCH 1/7] x86, mce: ignore SRAO only when MCG_SER_P is available, Marcelo Tosatti, 2010/10/21
- [Qemu-devel] [PATCH 6/7] kvm: writeback SMP TSCs on migration only, Marcelo Tosatti, 2010/10/21
- [Qemu-devel] [PATCH 2/7] x86, mce: broadcast mce depending on the cpu version, Marcelo Tosatti, 2010/10/21
- Re: [Qemu-devel] [PATCH 0/7] [PULL] qemu-kvm.git uq/master queue, Anthony Liguori, 2010/10/22