OSDN Git Service

KVM: x86: pass host_initiated to functions that read MSRs
[uclinux-h8/linux.git] / arch / x86 / kvm / svm.c
index b9f9e10..a08df41 100644 (file)
@@ -3069,42 +3069,42 @@ static u64 svm_read_l1_tsc(struct kvm_vcpu *vcpu, u64 host_tsc)
                svm_scale_tsc(vcpu, host_tsc);
 }
 
-static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data)
+static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
 {
        struct vcpu_svm *svm = to_svm(vcpu);
 
-       switch (ecx) {
+       switch (msr_info->index) {
        case MSR_IA32_TSC: {
-               *data = svm->vmcb->control.tsc_offset +
+               msr_info->data = svm->vmcb->control.tsc_offset +
                        svm_scale_tsc(vcpu, native_read_tsc());
 
                break;
        }
        case MSR_STAR:
-               *data = svm->vmcb->save.star;
+               msr_info->data = svm->vmcb->save.star;
                break;
 #ifdef CONFIG_X86_64
        case MSR_LSTAR:
-               *data = svm->vmcb->save.lstar;
+               msr_info->data = svm->vmcb->save.lstar;
                break;
        case MSR_CSTAR:
-               *data = svm->vmcb->save.cstar;
+               msr_info->data = svm->vmcb->save.cstar;
                break;
        case MSR_KERNEL_GS_BASE:
-               *data = svm->vmcb->save.kernel_gs_base;
+               msr_info->data = svm->vmcb->save.kernel_gs_base;
                break;
        case MSR_SYSCALL_MASK:
-               *data = svm->vmcb->save.sfmask;
+               msr_info->data = svm->vmcb->save.sfmask;
                break;
 #endif
        case MSR_IA32_SYSENTER_CS:
-               *data = svm->vmcb->save.sysenter_cs;
+               msr_info->data = svm->vmcb->save.sysenter_cs;
                break;
        case MSR_IA32_SYSENTER_EIP:
-               *data = svm->sysenter_eip;
+               msr_info->data = svm->sysenter_eip;
                break;
        case MSR_IA32_SYSENTER_ESP:
-               *data = svm->sysenter_esp;
+               msr_info->data = svm->sysenter_esp;
                break;
        /*
         * Nobody will change the following 5 values in the VMCB so we can
@@ -3112,31 +3112,31 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data)
         * implemented.
         */
        case MSR_IA32_DEBUGCTLMSR:
-               *data = svm->vmcb->save.dbgctl;
+               msr_info->data = svm->vmcb->save.dbgctl;
                break;
        case MSR_IA32_LASTBRANCHFROMIP:
-               *data = svm->vmcb->save.br_from;
+               msr_info->data = svm->vmcb->save.br_from;
                break;
        case MSR_IA32_LASTBRANCHTOIP:
-               *data = svm->vmcb->save.br_to;
+               msr_info->data = svm->vmcb->save.br_to;
                break;
        case MSR_IA32_LASTINTFROMIP:
-               *data = svm->vmcb->save.last_excp_from;
+               msr_info->data = svm->vmcb->save.last_excp_from;
                break;
        case MSR_IA32_LASTINTTOIP:
-               *data = svm->vmcb->save.last_excp_to;
+               msr_info->data = svm->vmcb->save.last_excp_to;
                break;
        case MSR_VM_HSAVE_PA:
-               *data = svm->nested.hsave_msr;
+               msr_info->data = svm->nested.hsave_msr;
                break;
        case MSR_VM_CR:
-               *data = svm->nested.vm_cr_msr;
+               msr_info->data = svm->nested.vm_cr_msr;
                break;
        case MSR_IA32_UCODE_REV:
-               *data = 0x01000065;
+               msr_info->data = 0x01000065;
                break;
        default:
-               return kvm_get_msr_common(vcpu, ecx, data);
+               return kvm_get_msr_common(vcpu, msr_info);
        }
        return 0;
 }
@@ -3144,16 +3144,20 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data)
 static int rdmsr_interception(struct vcpu_svm *svm)
 {
        u32 ecx = kvm_register_read(&svm->vcpu, VCPU_REGS_RCX);
-       u64 data;
+       struct msr_data msr_info;
 
-       if (svm_get_msr(&svm->vcpu, ecx, &data)) {
+       msr_info.index = ecx;
+       msr_info.host_initiated = false;
+       if (svm_get_msr(&svm->vcpu, &msr_info)) {
                trace_kvm_msr_read_ex(ecx);
                kvm_inject_gp(&svm->vcpu, 0);
        } else {
-               trace_kvm_msr_read(ecx, data);
+               trace_kvm_msr_read(ecx, msr_info.data);
 
-               kvm_register_write(&svm->vcpu, VCPU_REGS_RAX, data & 0xffffffff);
-               kvm_register_write(&svm->vcpu, VCPU_REGS_RDX, data >> 32);
+               kvm_register_write(&svm->vcpu, VCPU_REGS_RAX,
+                                  msr_info.data & 0xffffffff);
+               kvm_register_write(&svm->vcpu, VCPU_REGS_RDX,
+                                  msr_info.data >> 32);
                svm->next_rip = kvm_rip_read(&svm->vcpu) + 2;
                skip_emulated_instruction(&svm->vcpu);
        }