Revision 75b10c43 target-i386/kvm.c

b/target-i386/kvm.c
438 438
    }
439 439
}
440 440

  
441
static int kvm_has_msr_star(CPUState *env)
441
int has_msr_star;
442
int has_msr_hsave_pa;
443

  
444
static void kvm_supported_msrs(CPUState *env)
442 445
{
443
    static int has_msr_star;
446
    static int kvm_supported_msrs;
444 447
    int ret;
445 448

  
446 449
    /* first time */
447
    if (has_msr_star == 0) {        
450
    if (kvm_supported_msrs == 0) {
448 451
        struct kvm_msr_list msr_list, *kvm_msr_list;
449 452

  
450
        has_msr_star = -1;
453
        kvm_supported_msrs = -1;
451 454

  
452 455
        /* Obtain MSR list from KVM.  These are the MSRs that we must
453 456
         * save/restore */
454 457
        msr_list.nmsrs = 0;
455 458
        ret = kvm_ioctl(env->kvm_state, KVM_GET_MSR_INDEX_LIST, &msr_list);
456 459
        if (ret < 0 && ret != -E2BIG) {
457
            return 0;
460
            return;
458 461
        }
459 462
        /* Old kernel modules had a bug and could write beyond the provided
460 463
           memory. Allocate at least a safe amount of 1K. */
......
470 473
            for (i = 0; i < kvm_msr_list->nmsrs; i++) {
471 474
                if (kvm_msr_list->indices[i] == MSR_STAR) {
472 475
                    has_msr_star = 1;
473
                    break;
476
                    continue;
477
                }
478
                if (kvm_msr_list->indices[i] == MSR_VM_HSAVE_PA) {
479
                    has_msr_hsave_pa = 1;
480
                    continue;
474 481
                }
475 482
            }
476 483
        }
......
478 485
        free(kvm_msr_list);
479 486
    }
480 487

  
481
    if (has_msr_star == 1)
482
        return 1;
483
    return 0;
488
    return;
489
}
490

  
491
static int kvm_has_msr_hsave_pa(CPUState *env)
492
{
493
    kvm_supported_msrs(env);
494
    return has_msr_hsave_pa;
495
}
496

  
497
static int kvm_has_msr_star(CPUState *env)
498
{
499
    kvm_supported_msrs(env);
500
    return has_msr_star;
484 501
}
485 502

  
486 503
static int kvm_init_identity_map_page(KVMState *s)
......
790 807
    kvm_msr_entry_set(&msrs[n++], MSR_IA32_SYSENTER_EIP, env->sysenter_eip);
791 808
    if (kvm_has_msr_star(env))
792 809
	kvm_msr_entry_set(&msrs[n++], MSR_STAR, env->star);
793
    kvm_msr_entry_set(&msrs[n++], MSR_VM_HSAVE_PA, env->vm_hsave);
810
    if (kvm_has_msr_hsave_pa(env))
811
        kvm_msr_entry_set(&msrs[n++], MSR_VM_HSAVE_PA, env->vm_hsave);
794 812
#ifdef TARGET_X86_64
795 813
    /* FIXME if lm capable */
796 814
    kvm_msr_entry_set(&msrs[n++], MSR_CSTAR, env->cstar);
......
1016 1034
    msrs[n++].index = MSR_IA32_SYSENTER_EIP;
1017 1035
    if (kvm_has_msr_star(env))
1018 1036
	msrs[n++].index = MSR_STAR;
1019
    msrs[n++].index = MSR_VM_HSAVE_PA;
1037
    if (kvm_has_msr_hsave_pa(env))
1038
        msrs[n++].index = MSR_VM_HSAVE_PA;
1020 1039
    msrs[n++].index = MSR_IA32_TSC;
1021 1040
#ifdef TARGET_X86_64
1022 1041
    /* FIXME lm_capable_kernel */

Also available in: Unified diff