From 7570aad77b02425be0c5d76181d147d09705fe35 Mon Sep 17 00:00:00 2001 From: Robert Mustacchi Date: Thu, 28 Apr 2011 17:57:00 -0700 Subject: HVM-145 clean up more of the ioctl interfaces --- kvm.c | 99 +++++++++++++++++++++---------------------------------------------- kvm.h | 51 +++++++---------------------------- 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 -- cgit v1.2.3