X-Git-Url: https://git.openpandora.org/cgi-bin/gitweb.cgi?p=pandora-kernel.git;a=blobdiff_plain;f=drivers%2Fkvm%2Fsvm.c;h=9ec87636ded6dc0b9f5efd42d9f5e25f38680f43;hp=0e6bc8c649ce9ada43835a155be4c40fd439365d;hb=3a960f7e350de5d087b88a4c06df236e0f4186fd;hpb=ee2fae03d68e702866a8661fbee7ff2f2f3754d7 diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c index 0e6bc8c649ce..9ec87636ded6 100644 --- a/drivers/kvm/svm.c +++ b/drivers/kvm/svm.c @@ -402,11 +402,11 @@ static __init int svm_hardware_setup(void) set_msr_interception(msrpm_va, MSR_GS_BASE, 1, 1); set_msr_interception(msrpm_va, MSR_FS_BASE, 1, 1); set_msr_interception(msrpm_va, MSR_KERNEL_GS_BASE, 1, 1); - set_msr_interception(msrpm_va, MSR_STAR, 1, 1); set_msr_interception(msrpm_va, MSR_LSTAR, 1, 1); set_msr_interception(msrpm_va, MSR_CSTAR, 1, 1); set_msr_interception(msrpm_va, MSR_SYSCALL_MASK, 1, 1); #endif + set_msr_interception(msrpm_va, MSR_K6_STAR, 1, 1); set_msr_interception(msrpm_va, MSR_IA32_SYSENTER_CS, 1, 1); set_msr_interception(msrpm_va, MSR_IA32_SYSENTER_ESP, 1, 1); set_msr_interception(msrpm_va, MSR_IA32_SYSENTER_EIP, 1, 1); @@ -575,6 +575,8 @@ static int svm_create_vcpu(struct kvm_vcpu *vcpu) memset(vcpu->svm->db_regs, 0, sizeof(vcpu->svm->db_regs)); init_vmcb(vcpu->svm->vmcb); + fx_init(vcpu); + return 0; out2: @@ -1071,6 +1073,8 @@ static int emulate_on_interception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_ru static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data) { switch (ecx) { + case MSR_IA32_P5_MC_ADDR: + case MSR_IA32_P5_MC_TYPE: case MSR_IA32_MC0_CTL: case MSR_IA32_MCG_STATUS: case MSR_IA32_MCG_CAP: @@ -1098,10 +1102,10 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data) case MSR_IA32_APICBASE: *data = vcpu->apic_base; break; -#ifdef CONFIG_X86_64 - case MSR_STAR: + case MSR_K6_STAR: *data = vcpu->svm->vmcb->save.star; break; +#ifdef CONFIG_X86_64 case MSR_LSTAR: *data = vcpu->svm->vmcb->save.lstar; break; @@ -1173,10 +1177,10 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data) case MSR_IA32_APICBASE: vcpu->apic_base = data; break; -#ifdef CONFIG_X86_64_ - case MSR_STAR: + case MSR_K6_STAR: vcpu->svm->vmcb->save.star = data; break; +#ifdef CONFIG_X86_64_ case MSR_LSTAR: vcpu->svm->vmcb->save.lstar = data; break; @@ -1387,6 +1391,10 @@ again: save_db_regs(vcpu->svm->host_db_regs); load_db_regs(vcpu->svm->db_regs); } + + fx_save(vcpu->host_fx_image); + fx_restore(vcpu->guest_fx_image); + asm volatile ( #ifdef CONFIG_X86_64 "push %%rbx; push %%rcx; push %%rdx;" @@ -1496,6 +1504,9 @@ again: #endif : "cc", "memory" ); + fx_save(vcpu->guest_fx_image); + fx_restore(vcpu->host_fx_image); + if ((vcpu->svm->vmcb->save.dr7 & 0xff)) load_db_regs(vcpu->svm->host_db_regs);