Revision 25d2e361

b/target-i386/kvm.c
15 15
#include <sys/types.h>
16 16
#include <sys/ioctl.h>
17 17
#include <sys/mman.h>
18
#include <sys/utsname.h>
18 19

  
19 20
#include <linux/kvm.h>
20 21

  
......
53 54
#define BUS_MCEERR_AO 5
54 55
#endif
55 56

  
57
static int lm_capable_kernel;
58

  
56 59
#ifdef KVM_CAP_EXT_CPUID
57 60

  
58 61
static struct kvm_cpuid2 *try_get_cpuid(KVMState *s, int max)
......
523 526
{
524 527
    int ret;
525 528

  
529
    struct utsname utsname;
530

  
531
    uname(&utsname);
532
    lm_capable_kernel = strcmp(utsname.machine, "x86_64") == 0;
533

  
526 534
    /* create vm86 tss.  KVM uses vm86 mode to emulate 16-bit code
527 535
     * directly.  In order to use vm86 mode, a TSS is needed.  Since this
528 536
     * must be part of guest physical memory, we need to allocate it.  Older
......
810 818
    if (kvm_has_msr_hsave_pa(env))
811 819
        kvm_msr_entry_set(&msrs[n++], MSR_VM_HSAVE_PA, env->vm_hsave);
812 820
#ifdef TARGET_X86_64
813
    /* FIXME if lm capable */
814
    kvm_msr_entry_set(&msrs[n++], MSR_CSTAR, env->cstar);
815
    kvm_msr_entry_set(&msrs[n++], MSR_KERNELGSBASE, env->kernelgsbase);
816
    kvm_msr_entry_set(&msrs[n++], MSR_FMASK, env->fmask);
817
    kvm_msr_entry_set(&msrs[n++], MSR_LSTAR, env->lstar);
821
    if (lm_capable_kernel) {
822
        kvm_msr_entry_set(&msrs[n++], MSR_CSTAR, env->cstar);
823
        kvm_msr_entry_set(&msrs[n++], MSR_KERNELGSBASE, env->kernelgsbase);
824
        kvm_msr_entry_set(&msrs[n++], MSR_FMASK, env->fmask);
825
        kvm_msr_entry_set(&msrs[n++], MSR_LSTAR, env->lstar);
826
    }
818 827
#endif
819 828
    if (level == KVM_PUT_FULL_STATE) {
820 829
        /*
......
1046 1055
        msrs[n++].index = MSR_VM_HSAVE_PA;
1047 1056
    msrs[n++].index = MSR_IA32_TSC;
1048 1057
#ifdef TARGET_X86_64
1049
    /* FIXME lm_capable_kernel */
1050
    msrs[n++].index = MSR_CSTAR;
1051
    msrs[n++].index = MSR_KERNELGSBASE;
1052
    msrs[n++].index = MSR_FMASK;
1053
    msrs[n++].index = MSR_LSTAR;
1058
    if (lm_capable_kernel) {
1059
        msrs[n++].index = MSR_CSTAR;
1060
        msrs[n++].index = MSR_KERNELGSBASE;
1061
        msrs[n++].index = MSR_FMASK;
1062
        msrs[n++].index = MSR_LSTAR;
1063
    }
1054 1064
#endif
1055 1065
    msrs[n++].index = MSR_KVM_SYSTEM_TIME;
1056 1066
    msrs[n++].index = MSR_KVM_WALL_CLOCK;

Also available in: Unified diff