diff options
author | Robert Mustacchi <rm@joyent.com> | 2011-06-14 10:46:47 -0700 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2011-06-14 10:46:47 -0700 |
commit | c7f8cae268f9864a7b21d9edf6f32bdd10b1075d (patch) | |
tree | 7023526eed743d9ea61e2805801f54202d8badb4 | |
parent | c964cb0a6c4c02d2341d3a172197615879086eea (diff) | |
download | illumos-kvm-c7f8cae268f9864a7b21d9edf6f32bdd10b1075d.tar.gz |
HVM-367 Clean up KVM_SET_CPUID2
-rw-r--r-- | kvm.c | 14 | ||||
-rw-r--r-- | kvm_host.h | 3 | ||||
-rw-r--r-- | kvm_x86.c | 12 | ||||
-rw-r--r-- | kvm_x86.h | 8 |
4 files changed, 26 insertions, 11 deletions
@@ -1984,26 +1984,28 @@ kvm_ioctl(dev_t dev, int cmd, intptr_t arg, int md, cred_t *cr, int *rv) if (ioctl->vmwide) { kvm_t *kvmp; - int (*func)(kvm_t *, void *, int *); + int (*func)(kvm_t *, void *, int *, intptr_t); if ((kvmp = ksp->kds_kvmp) == NULL) { kmem_free(buf, ioctl->size); return (EINVAL); } - func = (int(*)(kvm_t *, void *, int *))ioctl->func; - rval = func(kvmp, buf, rv); + func = (int(*)(kvm_t *, void *, int *, + intptr_t))ioctl->func; + rval = func(kvmp, buf, rv, arg); } else { kvm_vcpu_t *vcpu; - int (*func)(kvm_vcpu_t *, void *, int *); + int (*func)(kvm_vcpu_t *, void *, int *, intptr_t); if ((vcpu = ksp->kds_vcpu) == NULL) { kmem_free(buf, ioctl->size); return (EINVAL); } - func = (int(*)(kvm_vcpu_t *, void *, int *))ioctl->func; - rval = func(vcpu, buf, rv); + func = (int(*)(kvm_vcpu_t *, void *, int *, + intptr_t))ioctl->func; + rval = func(vcpu, buf, rv, arg); } if (rval == 0 && ioctl->size != 0 && ioctl->copyout) { @@ -358,7 +358,8 @@ int kvm_vcpu_ioctl_get_msrs(struct kvm_vcpu *vcpu, struct kvm_msrs *msrs, int *r int kvm_vcpu_ioctl_set_msrs(struct kvm_vcpu *vcpu, struct kvm_msrs *msrs, int *rv); int kvm_vcpu_ioctl_x86_setup_mce(struct kvm_vcpu *vcpu, uint64_t *mcg_capp); int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid); -int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid); +int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *, struct kvm_cpuid2 *, int *, + intptr_t); int kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu *vcpu, struct kvm_lapic_state *s); int kvm_vcpu_ioctl_set_lapic(struct kvm_vcpu *vcpu, struct kvm_lapic_state *s); int kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu, @@ -1662,13 +1662,19 @@ is_efer_nx(void) } int -kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid) +kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid, + int *rv, intptr_t arg) { + struct kvm_cpuid2 *id; + + id = (void *)arg; + if (cpuid->nent > KVM_MAX_CPUID_ENTRIES) return (E2BIG); - bcopy(cpuid->entries, vcpu->arch.cpuid_entries, - cpuid->nent * sizeof (struct kvm_cpuid_entry2)); + if (copyin(id->entries, vcpu->arch.cpuid_entries, + cpuid->nent * sizeof (struct kvm_cpuid_entry2)) < 0) + return (EFAULT); vcpu_load(vcpu); vcpu->arch.cpuid_nent = cpuid->nent; @@ -1,6 +1,12 @@ #ifndef __KVM_X86_H #define __KVM_X86_H +/* See <sys/kvm.h> for an explanation of why this is necessary */ +#ifndef __GNUC__ +#error "The KVM Header files require GNU C extensions for compatibility." +#endif + + #include <sys/types.h> #define KVM_NR_INTERRUPTS 256 @@ -170,7 +176,7 @@ typedef struct kvm_cpuid_entry2 { typedef struct kvm_cpuid2 { uint32_t nent; uint32_t padding; - struct kvm_cpuid_entry2 entries[100]; + struct kvm_cpuid_entry2 entries[0]; } kvm_cpuid2_t; /* for KVM_GET_PIT and KVM_SET_PIT */ |