diff options
Diffstat (limited to 'drivers/kvm')
| -rw-r--r-- | drivers/kvm/kvm_svm.h | 11 | ||||
| -rw-r--r-- | drivers/kvm/svm.c | 26 |
2 files changed, 20 insertions, 17 deletions
diff --git a/drivers/kvm/kvm_svm.h b/drivers/kvm/kvm_svm.h index a1a9eba50d47..a869983d683d 100644 --- a/drivers/kvm/kvm_svm.h +++ b/drivers/kvm/kvm_svm.h | |||
| @@ -9,17 +9,15 @@ | |||
| 9 | #include "svm.h" | 9 | #include "svm.h" |
| 10 | #include "kvm.h" | 10 | #include "kvm.h" |
| 11 | 11 | ||
| 12 | static const u32 host_save_msrs[] = { | 12 | static const u32 host_save_user_msrs[] = { |
| 13 | #ifdef CONFIG_X86_64 | 13 | #ifdef CONFIG_X86_64 |
| 14 | MSR_STAR, MSR_LSTAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_KERNEL_GS_BASE, | 14 | MSR_STAR, MSR_LSTAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_KERNEL_GS_BASE, |
| 15 | MSR_FS_BASE, MSR_GS_BASE, | 15 | MSR_FS_BASE, |
| 16 | #endif | 16 | #endif |
| 17 | MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP, | 17 | MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP, |
| 18 | MSR_IA32_DEBUGCTLMSR, /*MSR_IA32_LASTBRANCHFROMIP, | ||
| 19 | MSR_IA32_LASTBRANCHTOIP, MSR_IA32_LASTINTFROMIP,MSR_IA32_LASTINTTOIP,*/ | ||
| 20 | }; | 18 | }; |
| 21 | 19 | ||
| 22 | #define NR_HOST_SAVE_MSRS ARRAY_SIZE(host_save_msrs) | 20 | #define NR_HOST_SAVE_USER_MSRS ARRAY_SIZE(host_save_user_msrs) |
| 23 | #define NUM_DB_REGS 4 | 21 | #define NUM_DB_REGS 4 |
| 24 | 22 | ||
| 25 | struct vcpu_svm { | 23 | struct vcpu_svm { |
| @@ -32,7 +30,8 @@ struct vcpu_svm { | |||
| 32 | 30 | ||
| 33 | u64 next_rip; | 31 | u64 next_rip; |
| 34 | 32 | ||
| 35 | u64 host_msrs[NR_HOST_SAVE_MSRS]; | 33 | u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS]; |
| 34 | u64 host_gs_base; | ||
| 36 | unsigned long host_cr2; | 35 | unsigned long host_cr2; |
| 37 | unsigned long host_db_regs[NUM_DB_REGS]; | 36 | unsigned long host_db_regs[NUM_DB_REGS]; |
| 38 | unsigned long host_dr6; | 37 | unsigned long host_dr6; |
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c index bddd0238869d..9c15f32eea18 100644 --- a/drivers/kvm/svm.c +++ b/drivers/kvm/svm.c | |||
| @@ -522,8 +522,6 @@ static void init_vmcb(struct vmcb *vmcb) | |||
| 522 | control->msrpm_base_pa = msrpm_base; | 522 | control->msrpm_base_pa = msrpm_base; |
| 523 | control->tsc_offset = 0; | 523 | control->tsc_offset = 0; |
| 524 | control->int_ctl = V_INTR_MASKING_MASK; | 524 | control->int_ctl = V_INTR_MASKING_MASK; |
| 525 | if (svm_has(SVM_FEATURE_LBRV)) | ||
| 526 | control->lbr_ctl = 1ULL; | ||
| 527 | 525 | ||
| 528 | init_seg(&save->es); | 526 | init_seg(&save->es); |
| 529 | init_seg(&save->ss); | 527 | init_seg(&save->ss); |
| @@ -611,7 +609,7 @@ static void svm_free_vcpu(struct kvm_vcpu *vcpu) | |||
| 611 | 609 | ||
| 612 | static void svm_vcpu_load(struct kvm_vcpu *vcpu) | 610 | static void svm_vcpu_load(struct kvm_vcpu *vcpu) |
| 613 | { | 611 | { |
| 614 | int cpu; | 612 | int cpu, i; |
| 615 | 613 | ||
| 616 | cpu = get_cpu(); | 614 | cpu = get_cpu(); |
| 617 | if (unlikely(cpu != vcpu->cpu)) { | 615 | if (unlikely(cpu != vcpu->cpu)) { |
| @@ -626,10 +624,18 @@ static void svm_vcpu_load(struct kvm_vcpu *vcpu) | |||
| 626 | vcpu->svm->vmcb->control.tsc_offset += delta; | 624 | vcpu->svm->vmcb->control.tsc_offset += delta; |
| 627 | vcpu->cpu = cpu; | 625 | vcpu->cpu = cpu; |
| 628 | } | 626 | } |
| 627 | |||
| 628 | for (i = 0; i < NR_HOST_SAVE_USER_MSRS; i++) | ||
| 629 | rdmsrl(host_save_user_msrs[i], vcpu->svm->host_user_msrs[i]); | ||
| 629 | } | 630 | } |
| 630 | 631 | ||
| 631 | static void svm_vcpu_put(struct kvm_vcpu *vcpu) | 632 | static void svm_vcpu_put(struct kvm_vcpu *vcpu) |
| 632 | { | 633 | { |
| 634 | int i; | ||
| 635 | |||
| 636 | for (i = 0; i < NR_HOST_SAVE_USER_MSRS; i++) | ||
| 637 | wrmsrl(host_save_user_msrs[i], vcpu->svm->host_user_msrs[i]); | ||
| 638 | |||
| 633 | rdtscll(vcpu->host_tsc); | 639 | rdtscll(vcpu->host_tsc); |
| 634 | put_cpu(); | 640 | put_cpu(); |
| 635 | } | 641 | } |
| @@ -815,18 +821,16 @@ static int svm_guest_debug(struct kvm_vcpu *vcpu, struct kvm_debug_guest *dbg) | |||
| 815 | 821 | ||
| 816 | static void load_host_msrs(struct kvm_vcpu *vcpu) | 822 | static void load_host_msrs(struct kvm_vcpu *vcpu) |
| 817 | { | 823 | { |
| 818 | int i; | 824 | #ifdef CONFIG_X86_64 |
| 819 | 825 | wrmsrl(MSR_GS_BASE, vcpu->svm->host_gs_base); | |
| 820 | for ( i = 0; i < NR_HOST_SAVE_MSRS; i++) | 826 | #endif |
| 821 | wrmsrl(host_save_msrs[i], vcpu->svm->host_msrs[i]); | ||
| 822 | } | 827 | } |
| 823 | 828 | ||
| 824 | static void save_host_msrs(struct kvm_vcpu *vcpu) | 829 | static void save_host_msrs(struct kvm_vcpu *vcpu) |
| 825 | { | 830 | { |
| 826 | int i; | 831 | #ifdef CONFIG_X86_64 |
| 827 | 832 | rdmsrl(MSR_GS_BASE, vcpu->svm->host_gs_base); | |
| 828 | for ( i = 0; i < NR_HOST_SAVE_MSRS; i++) | 833 | #endif |
| 829 | rdmsrl(host_save_msrs[i], vcpu->svm->host_msrs[i]); | ||
| 830 | } | 834 | } |
| 831 | 835 | ||
| 832 | static void new_asid(struct kvm_vcpu *vcpu, struct svm_cpu_data *svm_data) | 836 | static void new_asid(struct kvm_vcpu *vcpu, struct svm_cpu_data *svm_data) |
