diff options
-rw-r--r-- | kvm.c | 271 | ||||
-rw-r--r-- | kvm.h | 33 |
2 files changed, 38 insertions, 266 deletions
@@ -5344,41 +5344,38 @@ kvm_apic_set_version(struct kvm_vcpu *vcpu) static int -kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid, - struct kvm_cpuid_entry2 *entries) +kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid) { - int r; - - r = E2BIG; if (cpuid->nent > KVM_MAX_CPUID_ENTRIES) - goto out; - bcopy(entries, vcpu->arch.cpuid_entries, + return (E2BIG); + + bcopy(cpuid->entries, vcpu->arch.cpuid_entries, cpuid->nent * sizeof (struct kvm_cpuid_entry2)); + vcpu_load(vcpu); vcpu->arch.cpuid_nent = cpuid->nent; kvm_apic_set_version(vcpu); kvm_x86_ops->cpuid_update(vcpu); vcpu_put(vcpu); - return (0); -out: - return (r); + return (0); } static int -kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid, - struct kvm_cpuid_entry2 *entries) +kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid) { int r; + struct kvm_cpuid_entry2 *entries = cpuid->entries; + + cpuid->nent = vcpu->arch.cpuid_nent; - r = E2BIG; if (cpuid->nent < vcpu->arch.cpuid_nent) - goto out; + return (E2BIG); + + bcopy(&vcpu->arch.cpuid_entries, cpuid->entries, + vcpu->arch.cpuid_nent * sizeof (struct kvm_cpuid_entry2)); return (0); -out: - cpuid->nent = vcpu->arch.cpuid_nent; - return (r); } static void @@ -5853,7 +5850,7 @@ kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset, int len) return (-EFAULT); if (addr >= kernelbase) { - bcopy((caddr_t)(addr+offset), data, len); + bcopy((caddr_t)(addr + offset), data, len); } else { r = copyin((caddr_t)(addr + offset), data, len); } @@ -6389,7 +6386,7 @@ kvm_write_guest_page(struct kvm *kvm, /* XXX - addr could be user or kernel */ if (addr >= kernelbase) { - bcopy(data, (caddr_t)(addr+offset), len); + bcopy(data, (caddr_t)(addr + offset), len); } else { r = copyout(data, (caddr_t)(addr + offset), len); } @@ -14262,8 +14259,8 @@ kvm_apic_post_state_restore(struct kvm_vcpu *vcpu) apic->irr_pending = 1; } -static int kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu *vcpu, - struct kvm_lapic_state *s) +static int +kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu *vcpu, struct kvm_lapic_state *s) { vcpu_load(vcpu); bcopy(vcpu->arch.apic->regs, s->regs, sizeof *s); @@ -14272,8 +14269,8 @@ static int kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu *vcpu, return (0); } -static int kvm_vcpu_ioctl_set_lapic(struct kvm_vcpu *vcpu, - struct kvm_lapic_state *s) +static int +kvm_vcpu_ioctl_set_lapic(struct kvm_vcpu *vcpu, struct kvm_lapic_state *s) { vcpu_load(vcpu); bcopy(s->regs, vcpu->arch.apic->regs, sizeof *s); @@ -14551,6 +14548,18 @@ kvm_ioctl(dev_t dev, int cmd, intptr_t arg, int md, cred_t *cr, int *rv) sizeof (struct kvm_sregs), B_TRUE }, { KVM_SET_SREGS, kvm_arch_vcpu_ioctl_set_sregs, sizeof (struct kvm_sregs) }, + { KVM_GET_FPU, kvm_arch_vcpu_ioctl_get_fpu, + sizeof (struct kvm_fpu), B_TRUE }, + { KVM_SET_FPU, kvm_arch_vcpu_ioctl_set_fpu, + sizeof (struct kvm_fpu) }, + { KVM_GET_CPUID2, kvm_vcpu_ioctl_get_cpuid2, + sizeof (struct kvm_cpuid2), B_TRUE }, + { KVM_SET_CPUID2, kvm_vcpu_ioctl_set_cpuid2, + sizeof (struct kvm_cpuid2) }, + { KVM_GET_LAPIC, kvm_vcpu_ioctl_get_lapic, + sizeof (struct kvm_lapic_state), B_TRUE }, + { KVM_SET_LAPIC, kvm_vcpu_ioctl_set_lapic, + sizeof (struct kvm_lapic_state) }, { 0, NULL } }; @@ -14921,222 +14930,6 @@ kvm_ioctl(dev_t dev, int cmd, intptr_t arg, int md, cred_t *cr, int *rv) break; } - case KVM_GET_FPU: { - struct kvm_fpu_ioc *kvm_fpu_ioc; - struct kvm *kvmp; - struct kvm_vcpu *vcpu; - size_t sz = sizeof (struct kvm_fpu_ioc); - - kvm_fpu_ioc = kmem_zalloc(sz, KM_SLEEP); - - if (copyin(argp, kvm_fpu_ioc, sz) != 0) { - kmem_free(kvm_fpu_ioc, sz); - rval = EFAULT; - break; - } - - if ((kvmp = ksp->kds_kvmp) == NULL || - kvm_fpu_ioc->kvm_cpu_index >= kvmp->online_vcpus) { - kmem_free(kvm_fpu_ioc, sz); - rval = EINVAL; - break; - } - - vcpu = kvmp->vcpus[kvm_fpu_ioc->kvm_cpu_index]; - - rval = kvm_arch_vcpu_ioctl_get_fpu(vcpu, &kvm_fpu_ioc->fpu); - - if (rval == 0 && copyout(kvm_fpu_ioc, argp, sz) != 0) - rval = EFAULT; - - kmem_free(kvm_fpu_ioc, sz); - *rv = 0; - break; - } - - case KVM_SET_FPU: { - struct kvm_fpu_ioc *kvm_fpu_ioc; - struct kvm *kvmp; - struct kvm_vcpu *vcpu; - size_t sz = sizeof (struct kvm_fpu_ioc); - - kvm_fpu_ioc = kmem_zalloc(sz, KM_SLEEP); - - if (copyin(argp, kvm_fpu_ioc, sz) != 0) { - kmem_free(kvm_fpu_ioc, sz); - rval = EFAULT; - break; - } - - if ((kvmp = ksp->kds_kvmp) == NULL || - kvm_fpu_ioc->kvm_cpu_index >= kvmp->online_vcpus) { - kmem_free(kvm_fpu_ioc, sz); - rval = EINVAL; - break; - } - - vcpu = kvmp->vcpus[kvm_fpu_ioc->kvm_cpu_index]; - - rval = kvm_arch_vcpu_ioctl_set_fpu(vcpu, &kvm_fpu_ioc->fpu); - kmem_free(kvm_fpu_ioc, sz); - *rv = 0; - break; - } - - case KVM_SET_CPUID2: { - struct kvm_cpuid2_ioc *cpuid2_ioc; - struct kvm_cpuid2 *cpuid2_data; - struct kvm *kvmp; - struct kvm_vcpu *vcpu; - size_t sz = sizeof (struct kvm_cpuid2_ioc); - - cpuid2_ioc = kmem_alloc(sz, KM_SLEEP); - - if (copyin(argp, cpuid2_ioc, sz) != 0) { - kmem_free(cpuid2_ioc, sz); - rval = EFAULT; - break; - } - - if ((kvmp = ksp->kds_kvmp) == NULL || - cpuid2_ioc->cpu_index >= kvmp->online_vcpus) { - kmem_free(cpuid2_ioc, sz); - rval = EINVAL; - break; - } - - vcpu = kvmp->vcpus[cpuid2_ioc->cpu_index]; - - cpuid2_data = kmem_alloc(sizeof (struct kvm_cpuid2), KM_SLEEP); - bcopy(&cpuid2_ioc->cpuid_data, cpuid2_data, - sizeof (struct kvm_cpuid2)); - - rval = kvm_vcpu_ioctl_set_cpuid2(vcpu, cpuid2_data, - cpuid2_data->entries); - - kmem_free(cpuid2_data, sizeof (struct kvm_cpuid2)); - kmem_free(cpuid2_ioc, sz); - - break; - } - - case KVM_GET_CPUID2: { - struct kvm_cpuid2_ioc *cpuid2_ioc; - struct kvm_cpuid2 *cpuid2_data; - struct kvm *kvmp; - struct kvm_vcpu *vcpu; - size_t sz = sizeof (struct kvm_cpuid2_ioc); - - cpuid2_ioc = kmem_alloc(sz, KM_SLEEP); - - if (copyin(argp, cpuid2_ioc, sz) != 0) { - kmem_free(cpuid2_ioc, sz); - rval = EFAULT; - break; - } - - if ((kvmp = ksp->kds_kvmp) == NULL || - cpuid2_ioc->cpu_index >= kvmp->online_vcpus) { - kmem_free(cpuid2_ioc, sz); - rval = EINVAL; - break; - } - - vcpu = kvmp->vcpus[cpuid2_ioc->cpu_index]; - - cpuid2_data = kmem_alloc(sizeof (struct kvm_cpuid2), KM_SLEEP); - bcopy(&cpuid2_ioc->cpuid_data, cpuid2_data, - sizeof (struct kvm_cpuid2)); - - rval = kvm_vcpu_ioctl_get_cpuid2(vcpu, cpuid2_data, - cpuid2_data->entries); - - if (rval) { - kmem_free(cpuid2_ioc, sz); - kmem_free(cpuid2_data, sizeof (struct kvm_cpuid2)); - break; - } - - if (copyout(cpuid2_ioc, argp, sz) != 0) - rval = EFAULT; - - kmem_free(cpuid2_data, sizeof (struct kvm_cpuid2)); - kmem_free(cpuid2_ioc, sz); - break; - } - - case KVM_GET_LAPIC: { - struct kvm_lapic_ioc *lapic_ioc; - struct kvm *kvmp; - struct kvm_vcpu *vcpu; - size_t sz = sizeof (struct kvm_lapic_ioc); - - lapic_ioc = kmem_zalloc(sz, KM_SLEEP); - - if (copyin(argp, lapic_ioc, sz) != 0) { - kmem_free(lapic_ioc, sz); - rval = EFAULT; - break; - } - - if ((kvmp = ksp->kds_kvmp) == NULL || - lapic_ioc->kvm_cpu_index >= kvmp->online_vcpus) { - kmem_free(lapic_ioc, sz); - rval = EINVAL; - break; - } - - vcpu = kvmp->vcpus[lapic_ioc->kvm_cpu_index]; - - if (vcpu->arch.apic == NULL) { - kmem_free(lapic_ioc, sz); - rval = EINVAL; - break; - } - - rval = kvm_vcpu_ioctl_get_lapic(vcpu, &lapic_ioc->s); - - if (rval == 0 && copyout(lapic_ioc, argp, sz) != 0) - rval = EFAULT; - - kmem_free(lapic_ioc, sz); - break; - } - - case KVM_SET_LAPIC: { - struct kvm_lapic_ioc *lapic_ioc; - struct kvm *kvmp; - struct kvm_vcpu *vcpu; - size_t sz = sizeof (struct kvm_lapic_ioc); - - lapic_ioc = kmem_zalloc(sz, KM_SLEEP); - - if (copyin(argp, lapic_ioc, sz) != 0) { - kmem_free(lapic_ioc, sz); - rval = EFAULT; - break; - } - - if ((kvmp = ksp->kds_kvmp) == NULL || - lapic_ioc->kvm_cpu_index >= kvmp->online_vcpus) { - kmem_free(lapic_ioc, sz); - rval = EINVAL; - break; - } - - vcpu = kvmp->vcpus[lapic_ioc->kvm_cpu_index]; - - if (vcpu->arch.apic == NULL) { - kmem_free(lapic_ioc, sz); - rval = EINVAL; - break; - } - - rval = kvm_vcpu_ioctl_set_lapic(vcpu, &lapic_ioc->s); - kmem_free(lapic_ioc, sz); - break; - } - case KVM_GET_VCPU_EVENTS: { struct kvm_vcpu_events_ioc *events_ioc; struct kvm *kvmp; @@ -657,12 +657,6 @@ typedef struct kvm_lapic_state { char regs[KVM_APIC_REG_SIZE]; } kvm_lapic_state_t; -typedef struct kvm_lapic_ioc { - int kvm_cpu_index; - struct kvm_lapic_state s; -} kvm_lapic_ioc_t; - - typedef struct kvm_dtable { uint64_t base; unsigned short limit; @@ -949,11 +943,6 @@ typedef struct kvm_fpu { uint32_t pad2; } kvm_fpu_t; -typedef struct kvm_fpu_ioc { - struct kvm_fpu fpu; - int kvm_cpu_index; -} kvm_fpu_ioc_t; - typedef struct kvm_msr_entry { uint32_t index; uint32_t reserved; @@ -1059,7 +1048,6 @@ typedef struct kvm_cpuid2 { struct kvm_cpuid_entry2 entries[100]; } kvm_cpuid2_t; - #define X86_SHADOW_INT_MOV_SS 1 #define X86_SHADOW_INT_STI 2 @@ -1453,15 +1441,6 @@ static void native_load_tr_desc(void) #define KVMIO 0xAE -/* for KVM_SET_CPUID2/KVM_GET_CPUID2 */ -typedef struct kvm_cpuid2_ioc { - struct kvm_cpuid2 cpuid_data; - int kvm_id; - int cpu_index; -} kvm_cpuid2_ioc_t; - -/* for KVM_RUN */ - /* x86 MCE */ typedef struct kvm_x86_mce { uint64_t status; @@ -1500,12 +1479,12 @@ typedef struct kvm_set_boot_cpu_id_ioc { #define KVM_INTERRUPT _IOW(KVMIO, 0x86, struct kvm_interrupt_ioc) #define KVM_SET_CPUID _IOW(KVMIO, 0x8a, struct kvm_cpuid_ioc) #define KVM_SET_SIGNAL_MASK _IOW(KVMIO, 0x8b, struct kvm_signal_mask) -#define KVM_GET_FPU _IOR(KVMIO, 0x8c, struct kvm_fpu_ioc) -#define KVM_SET_FPU _IOW(KVMIO, 0x8d, struct kvm_fpu_ioc) +#define KVM_GET_FPU _IOR(KVMIO, 0x8c, struct kvm_fpu) +#define KVM_SET_FPU _IOW(KVMIO, 0x8d, struct kvm_fpu) #define KVM_GET_MSRS _IOWR(KVMIO, 0x88, struct kvm_msrs) #define KVM_SET_MSRS _IOW(KVMIO, 0x89, struct kvm_msrs) -#define KVM_GET_LAPIC _IOR(KVMIO, 0x8e, struct kvm_lapic_ioc) -#define KVM_SET_LAPIC _IOW(KVMIO, 0x8f, struct kvm_lapic_ioc) +#define KVM_GET_LAPIC _IOR(KVMIO, 0x8e, struct kvm_lapic_state) +#define KVM_SET_LAPIC _IOW(KVMIO, 0x8f, struct kvm_lapic_state) #define KVM_GET_MP_STATE _IOR(KVMIO, 0x98, struct kvm_mp_state) #define KVM_SET_MP_STATE _IOW(KVMIO, 0x99, struct kvm_mp_state) /* MCE for x86 */ @@ -1718,8 +1697,8 @@ typedef struct kvm_tpr_acl_ioc { int cpu_index; } kvm_tpr_acl_ioc_t; -#define KVM_SET_CPUID2 _IOW(KVMIO, 0x90, struct kvm_cpuid2_ioc) -#define KVM_GET_CPUID2 _IOWR(KVMIO, 0x91, struct kvm_cpuid2_ioc) +#define KVM_SET_CPUID2 _IOW(KVMIO, 0x90, struct kvm_cpuid2) +#define KVM_GET_CPUID2 _IOWR(KVMIO, 0x91, struct kvm_cpuid2) /* Available with KVM_CAP_VAPIC */ #define KVM_TPR_ACCESS_REPORTING _IOWR(KVMIO, 0x92, struct kvm_tpr_acl_ioc) /* Available with KVM_CAP_VAPIC */ |