summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Mustacchi <rm@joyent.com>2011-04-28 17:57:00 -0700
committerRobert Mustacchi <rm@joyent.com>2011-04-29 10:30:54 -0700
commit7570aad77b02425be0c5d76181d147d09705fe35 (patch)
tree03a3d5cc8ccce54f4b77a3e7f03d7dfd4ae85ddf
parent453265e8357095a750002cf06ddd3b6ef38dcd9e (diff)
downloadillumos-kvm-7570aad77b02425be0c5d76181d147d09705fe35.tar.gz
HVM-145 clean up more of the ioctl interfaces
-rw-r--r--kvm.c99
-rw-r--r--kvm.h51
2 files changed, 40 insertions, 110 deletions
diff --git a/kvm.c b/kvm.c
index 23c2380..aebb795 100644
--- a/kvm.c
+++ b/kvm.c
@@ -14352,38 +14352,22 @@ kvm_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p, int *rval_
break;
}
case KVM_RUN: {
- struct kvm_run_ioc *kvm_run_ioc;
struct kvm *kvmp;
struct kvm_vcpu *vcpu;
-
- if (!arg) {
- rval = EINVAL;
- break;
- }
-
- kvm_run_ioc = kmem_zalloc(sizeof(struct kvm_run_ioc), KM_SLEEP);
-
- if (ddi_copyin((caddr_t)arg, kvm_run_ioc, sizeof (struct kvm_run_ioc), mode)) {
- rval = EFAULT;
- kmem_free(kvm_run_ioc, sizeof(struct kvm_run_ioc));
- break;
- }
+ int cpu = (int)arg;
kvmp = ksp->kds_kvmp;
if (kvmp == NULL) {
rval = EINVAL;
- kmem_free(kvm_run_ioc, sizeof(struct kvm_run_ioc));
break;
}
- if (!kvmp || kvm_run_ioc->kvm_cpu_index >= kvmp->online_vcpus) {
+ if (!kvmp || cpu >= kvmp->online_vcpus) {
rval = EINVAL;
- kmem_free(kvm_run_ioc, sizeof(struct kvm_run_ioc));
break;
}
- vcpu = kvmp->vcpus[kvm_run_ioc->kvm_cpu_index];
+ vcpu = kvmp->vcpus[cpu];
rval = kvm_arch_vcpu_ioctl_run(vcpu, vcpu->run);
- kmem_free(kvm_run_ioc, sizeof(struct kvm_run_ioc));
break;
}
case KVM_CHECK_EXTENSION:
@@ -14600,30 +14584,24 @@ kvm_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p, int *rval_
}
case KVM_SET_USER_MEMORY_REGION: {
- struct kvm_set_user_memory_ioc *kvmioc;
+ struct kvm_userspace_memory_region map;
struct kvm *kvmp;
- kvmioc = kmem_zalloc(sizeof (struct kvm_set_user_memory_ioc),
- KM_SLEEP);
-
- if (ddi_copyin((const void *)arg, kvmioc,
- sizeof(struct kvm_set_user_memory_ioc), mode) != 0) {
+ if (ddi_copyin((const void *)arg, &map,
+ sizeof(struct kvm_userspace_memory_region), mode) != 0) {
rval = EFAULT;
- kmem_free(kvmioc, sizeof(struct kvm_set_user_memory_ioc));
break;
}
kvmp = ksp->kds_kvmp;
if (kvmp == NULL) {
rval = EINVAL;
- kmem_free(kvmioc, sizeof(struct kvm_set_user_memory_ioc));
break;
}
- rval = kvm_vm_ioctl_set_memory_region(kvmp, &kvmioc->kvm_userspace_map, 1);
+ rval = kvm_vm_ioctl_set_memory_region(kvmp, &map, 1);
if (rval != 0)
rval = EINVAL;
- kmem_free(kvmioc, sizeof(struct kvm_set_user_memory_ioc));
break;
}
case KVM_GET_SUPPORTED_CPUID: {
@@ -15248,38 +15226,40 @@ kvm_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p, int *rval_
#endif
#ifdef KVM_CAP_IRQ_ROUTING
case KVM_SET_GSI_ROUTING: {
- struct kvm_irq_routing_ioc *kvm_irq_routing_ioc;
+ struct kvm_kirq_routing *route;
struct kvm *kvmp;
struct kvm_irq_routing_entry *entries;
- kvm_irq_routing_ioc = kmem_zalloc(sizeof(struct kvm_irq_routing_ioc), KM_SLEEP);
-
+ /*
+ * Note the route must be allocated on the heap. The sizeof
+ * (kvm_kirq_routing) is approximately 0xc038 currently.
+ */
+ route = kmem_zalloc(sizeof (kvm_kirq_routing_t), KM_SLEEP);
rval = EFAULT;
- if (ddi_copyin((const char *)arg, kvm_irq_routing_ioc,
- sizeof(struct kvm_irq_routing_ioc), mode)) {
- kmem_free(kvm_irq_routing_ioc, sizeof(struct kvm_irq_routing_ioc));
+ if (ddi_copyin((const char *)arg, route,
+ sizeof(struct kvm_kirq_routing), mode)) {
+ kmem_free(route, sizeof (kvm_kirq_routing_t));
break;
}
kvmp = ksp->kds_kvmp;
if (kvmp == NULL) {
rval = EINVAL;
- kmem_free(kvm_irq_routing_ioc, sizeof(struct kvm_irq_routing_ioc));
+ kmem_free(route, sizeof (kvm_kirq_routing_t));
break;
}
rval = EINVAL;
- if ((kvm_irq_routing_ioc->kvm_kirq_routing.nr >= KVM_MAX_IRQ_ROUTES) ||
- (kvm_irq_routing_ioc->kvm_kirq_routing.flags)) {
- kmem_free(kvm_irq_routing_ioc, sizeof(struct kvm_irq_routing_ioc));
+ if (route->nr >= KVM_MAX_IRQ_ROUTES || route->flags) {
+ kmem_free(route, sizeof (kvm_kirq_routing_t));
break;
}
- rval = kvm_set_irq_routing(kvmp, kvm_irq_routing_ioc->kvm_kirq_routing.entries,
- kvm_irq_routing_ioc->kvm_kirq_routing.nr,
- kvm_irq_routing_ioc->kvm_kirq_routing.flags);
+
+ rval = kvm_set_irq_routing(kvmp, route->entries,
+ route->nr, route->flags);
*rval_p = 0;
- kmem_free(kvm_irq_routing_ioc, sizeof(struct kvm_irq_routing_ioc));
+ kmem_free(route, sizeof (kvm_kirq_routing_t));
break;
}
#endif /* KVM_CAP_IRQ_ROUTING */
@@ -15321,38 +15301,27 @@ kvm_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p, int *rval_
}
case KVM_GET_IRQCHIP: {
- struct kvm_irqchip_ioc *irqchip_ioc;
struct kvm *kvmp;
+ struct kvm_irqchip chip;
/* 0: PIC master, 1: PIC slave, 2: IOAPIC */
- irqchip_ioc = kmem_zalloc(sizeof(struct kvm_irqchip_ioc), KM_SLEEP);
- rval = EFAULT;
- if (ddi_copyin((caddr_t)arg, irqchip_ioc, sizeof irqchip_ioc, mode)) {
- kmem_free(irqchip_ioc, sizeof(struct kvm_irqchip_ioc));
- break;
- }
-
kvmp = ksp->kds_kvmp;
if (kvmp == NULL) {
rval = EINVAL;
- kmem_free(irqchip_ioc, sizeof(struct kvm_irqchip_ioc));
break;
}
rval = ENXIO;
- if (!irqchip_in_kernel(kvmp)) {
- kmem_free(irqchip_ioc, sizeof(struct kvm_irqchip_ioc));
+ if (!irqchip_in_kernel(kvmp))
break;
- }
- rval = kvm_vm_ioctl_get_irqchip(kvmp, &irqchip_ioc->chip);
+
+ rval = kvm_vm_ioctl_get_irqchip(kvmp, &chip);
if (rval) {
- kmem_free(irqchip_ioc, sizeof(struct kvm_irqchip_ioc));
break;
}
- if (ddi_copyout(irqchip_ioc, (caddr_t)arg, sizeof (struct kvm_irqchip_ioc), mode))
+ if (ddi_copyout(&chip, (caddr_t)arg, sizeof (struct kvm_irqchip), mode))
rval = EFAULT;
rval = 0;
- kmem_free(irqchip_ioc, sizeof(struct kvm_irqchip_ioc));
break;
}
case KVM_SET_VAPIC_ADDR: {
@@ -15385,31 +15354,25 @@ kvm_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred_p, int *rval_
}
case KVM_SET_IRQCHIP: {
- struct kvm_irqchip_ioc *irqchip_ioc;
struct kvm *kvmp;
+ struct kvm_irqchip chip;
/* 0: PIC master, 1: PIC slave, 2: IOAPIC */
- irqchip_ioc = kmem_zalloc(sizeof(struct kvm_irqchip_ioc), KM_SLEEP);
rval = EFAULT;
- if (ddi_copyin((caddr_t)arg, irqchip_ioc, sizeof (struct kvm_irqchip_ioc), mode)) {
- kmem_free(irqchip_ioc, sizeof(struct kvm_irqchip_ioc));
+ if (ddi_copyin((caddr_t)arg, &chip, sizeof (struct kvm_irqchip), mode))
break;
- }
kvmp = ksp->kds_kvmp;
if (kvmp == NULL) {
rval = EINVAL;
- kmem_free(irqchip_ioc, sizeof(struct kvm_irqchip_ioc));
break;
}
rval = ENXIO;
if (!irqchip_in_kernel(kvmp)) {
- kmem_free(irqchip_ioc, sizeof(struct kvm_irqchip_ioc));
break;
}
- rval = kvm_vm_ioctl_set_irqchip(kvmp, &irqchip_ioc->chip);
- kmem_free(irqchip_ioc, sizeof(struct kvm_irqchip_ioc));
+ rval = kvm_vm_ioctl_set_irqchip(kvmp, &chip);
if (rval)
break;
rval = 0;
diff --git a/kvm.h b/kvm.h
index 60b7908..d8d05d0 100644
--- a/kvm.h
+++ b/kvm.h
@@ -637,12 +637,6 @@ typedef struct kvm_irqchip {
} chip;
} kvm_irqchip_t;
-/* for KVM_GET_IRQCHIP */
-typedef struct kvm_irqchip_ioc {
- struct kvm_irqchip chip;
-} kvm_irqchip_ioc_t;
-
-
/* for KVM_CREATE_PIT2 */
typedef struct kvm_pit_config {
uint32_t flags;
@@ -1046,11 +1040,6 @@ typedef struct kvm_pit_channel_state {
int64_t count_load_time;
} kvm_pit_channel_state_t;
-typedef struct kvm_pit_ioc {
- int pad;
- struct kvm_pic_state s;
-} kvm_pit_ioc_t;
-
typedef struct kvm_debug_exit_arch {
uint32_t exception;
uint32_t pad;
@@ -1152,10 +1141,6 @@ typedef struct kvm_kirq_routing {
struct kvm_irq_routing_entry entries[KVM_MAX_IRQ_ROUTES+1];
} kvm_kirq_routing_t;
-typedef struct kvm_irq_routing_ioc {
- struct kvm_kirq_routing kvm_kirq_routing;
-} kvm_irq_routing_ioc_t;
-
/*#endif __KVM_HAVE_IOAPIC*/
#define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg))
@@ -1499,9 +1484,6 @@ typedef struct kvm_cpuid2_ioc {
} kvm_cpuid2_ioc_t;
/* for KVM_RUN */
-typedef struct kvm_run_ioc {
- int kvm_cpu_index;
-} kvm_run_ioc_t;
/* x86 MCE */
typedef struct kvm_x86_mce {
@@ -1526,11 +1508,6 @@ typedef struct kvm_signal_mask {
uint8_t sigset[1];
} kvm_signal_mask_t;
-typedef struct kvm_pit_s2_ioc {
- int pad;
- struct kvm_pit_state2 s;
-} kvm_pit_s2_ioc_t;
-
typedef struct kvm_set_boot_cpu_id_ioc {
int id;
} kvm_set_boot_cpu_id_ioc_t;
@@ -1569,8 +1546,8 @@ typedef struct kvm_set_boot_cpu_id_ioc {
#define KVM_GET_VCPU_EVENTS _IOR(KVMIO, 0x9f, struct kvm_vcpu_events_ioc)
#define KVM_SET_VCPU_EVENTS _IOW(KVMIO, 0xa0, struct kvm_vcpu_events_ioc)
/* Available with KVM_CAP_PIT_STATE2 */
-#define KVM_GET_PIT2 _IOR(KVMIO, 0x9f, struct kvm_pit_s2_ioc)
-#define KVM_SET_PIT2 _IOW(KVMIO, 0xa0, struct kvm_pit_s2_ioc)
+#define KVM_GET_PIT2 _IOR(KVMIO, 0x9f, struct kvm_pit_state2)
+#define KVM_SET_PIT2 _IOW(KVMIO, 0xa0, struct kvm_pit_state2)
@@ -1630,7 +1607,7 @@ typedef struct kvm_id_map_addr_ioc {
* a vcpu fd.
*/
#define KVM_CREATE_VCPU _IO(KVMIO, 0x41)
-#define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log_ioc)
+#define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log)
#define KVM_SET_NR_MMU_PAGES _IO(KVMIO, 0x44)
#define KVM_GET_NR_MMU_PAGES _IO(KVMIO, 0x45)
#define KVM_SET_TSS_ADDR _IO(KVMIO, 0x47)
@@ -1639,14 +1616,14 @@ typedef struct kvm_id_map_addr_ioc {
#define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60)
#define KVM_IRQ_LINE _IOW(KVMIO, 0x61, struct kvm_irq_level_ioc)
#define KVM_IRQ_LINE_STATUS _IOWR(KVMIO, 0x67, struct kvm_irq_level_ioc)
-#define KVM_GET_IRQCHIP _IOWR(KVMIO, 0x62, struct kvm_irqchip_ioc)
-#define KVM_SET_IRQCHIP _IOR(KVMIO, 0x63, struct kvm_irqchip_ioc)
+#define KVM_GET_IRQCHIP _IOWR(KVMIO, 0x62, struct kvm_irqchip)
+#define KVM_SET_IRQCHIP _IOR(KVMIO, 0x63, struct kvm_irqchip)
#define KVM_PIT_SPEAKER_DUMMY 1
#define KVM_CREATE_PIT _IO(KVMIO, 0x64)
-#define KVM_GET_PIT _IOWR(KVMIO, 0x65, struct kvm_pit_ioc)
-#define KVM_SET_PIT _IOR(KVMIO, 0x66, struct kvm_pit_ioc)
+#define KVM_GET_PIT _IOWR(KVMIO, 0x65, struct kvm_pit_state)
+#define KVM_SET_PIT _IOR(KVMIO, 0x66, struct kvm_pit_state)
#define KVM_CREATE_PIT2 _IOW(KVMIO, 0x77, struct kvm_pit_config_ioc)
#define KVM_REGISTER_COALESCED_MMIO \
@@ -1654,7 +1631,7 @@ typedef struct kvm_id_map_addr_ioc {
#define KVM_UNREGISTER_COALESCED_MMIO \
_IOW(KVMIO, 0x68, struct kvm_coalesced_mmio_zone_ioc)
-#define KVM_SET_GSI_ROUTING _IOW(KVMIO, 0x6a, struct kvm_irq_routing_ioc)
+#define KVM_SET_GSI_ROUTING _IOW(KVMIO, 0x6a, struct kvm_kirq_routing)
/*
* Check if a kvm extension is available. Argument is extension number,
@@ -1713,10 +1690,6 @@ typedef struct kvm_dirty_log {
}v;
} kvm_dirty_log_t;
-typedef struct kvm_dirty_log_ioc {
- struct kvm_dirty_log d;
-} kvm_dirty_log_ioc_t;
-
typedef struct kvm_coalesced_mmio {
uint64_t phys_addr;
uint32_t len;
@@ -1799,13 +1772,7 @@ typedef struct kvm_userspace_memory_region {
uint64_t userspace_addr; /* start of the userspace allocated memory */
} kvm_userspace_memory_region_t;
-/* for KVM_SET_USER_MEMORY_REGION */
-typedef struct kvm_set_user_memory_ioc {
- struct kvm_userspace_memory_region kvm_userspace_map;
- int32_t pad;
-} kvm_set_user_memory_ioc_t;
-
-#ifdef XXX
+#ifndef XXX
#define KVM_SET_USER_MEMORY_REGION _IOW(KVMIO, 0x46, \
struct kvm_userspace_memory_region)
#else