Revision 75b10c43
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