summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kvm.c271
-rw-r--r--kvm.h33
2 files changed, 38 insertions, 266 deletions
diff --git a/kvm.c b/kvm.c
index 388bf4e..48940f7 100644
--- a/kvm.c
+++ b/kvm.c
@@ -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;
diff --git a/kvm.h b/kvm.h
index b89a834..04f7ebc 100644
--- a/kvm.h
+++ b/kvm.h
@@ -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 */