Define kvm_ioctl in the same way as ioctl
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>
Thu, 13 Nov 2008 19:21:00 +0000 (19:21 +0000)
committeraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>
Thu, 13 Nov 2008 19:21:00 +0000 (19:21 +0000)
The third argument to ioctl is a ... which allows any value to be passed.  In
practice, glibc always treats the argument as a void *.

Do the same thing for the kvm ioctls to keep things consistent with a
traditional ioctl.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5715 c046a42c-6fe2-441c-8c8c-71466251a162

kvm-all.c
kvm.h
target-i386/kvm.c

index 8575a4dee222aaf20224c06b4f5196f4baaab4cc..d1e62ef686b78477a0e6bb606328a556a3fba970 100644 (file)
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -14,6 +14,7 @@
 #include <sys/types.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
+#include <stdarg.h>
 
 #include <linux/kvm.h>
 
@@ -79,8 +80,7 @@ int kvm_init_vcpu(CPUState *env)
 
     dprintf("kvm_init_vcpu\n");
 
-    ret = kvm_vm_ioctl(s, KVM_CREATE_VCPU,
-                       (void *)(unsigned long)env->cpu_index);
+    ret = kvm_vm_ioctl(s, KVM_CREATE_VCPU, env->cpu_index);
     if (ret < 0) {
         dprintf("kvm_create_vcpu failed\n");
         goto err;
@@ -156,7 +156,7 @@ int kvm_init(int smp_cpus)
      * just use a user allocated buffer so we can use phys_ram_base
      * unmodified.  Make sure we have a sufficiently modern version of KVM.
      */
-    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, (void *)KVM_CAP_USER_MEMORY);
+    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY);
     if (ret <= 0) {
         if (ret == 0)
             ret = -EINVAL;
@@ -345,33 +345,51 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr,
     /* FIXME deal with errors */
 }
 
-int kvm_ioctl(KVMState *s, int type, void *data)
+int kvm_ioctl(KVMState *s, int type, ...)
 {
     int ret;
+    void *arg;
+    va_list ap;
 
-    ret = ioctl(s->fd, type, data);
+    va_start(ap, type);
+    arg = va_arg(ap, void *);
+    va_end(ap);
+
+    ret = ioctl(s->fd, type, arg);
     if (ret == -1)
         ret = -errno;
 
     return ret;
 }
 
-int kvm_vm_ioctl(KVMState *s, int type, void *data)
+int kvm_vm_ioctl(KVMState *s, int type, ...)
 {
     int ret;
+    void *arg;
+    va_list ap;
+
+    va_start(ap, type);
+    arg = va_arg(ap, void *);
+    va_end(ap);
 
-    ret = ioctl(s->vmfd, type, data);
+    ret = ioctl(s->vmfd, type, arg);
     if (ret == -1)
         ret = -errno;
 
     return ret;
 }
 
-int kvm_vcpu_ioctl(CPUState *env, int type, void *data)
+int kvm_vcpu_ioctl(CPUState *env, int type, ...)
 {
     int ret;
+    void *arg;
+    va_list ap;
+
+    va_start(ap, type);
+    arg = va_arg(ap, void *);
+    va_end(ap);
 
-    ret = ioctl(env->kvm_fd, type, data);
+    ret = ioctl(env->kvm_fd, type, arg);
     if (ret == -1)
         ret = -errno;
 
diff --git a/kvm.h b/kvm.h
index 4af48abb17803949df9409aa3f5d50d5f70011f3..304de272a705f835ea27a747ac1da57bb38b20a1 100644 (file)
--- a/kvm.h
+++ b/kvm.h
@@ -43,11 +43,11 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr,
 struct KVMState;
 typedef struct KVMState KVMState;
 
-int kvm_ioctl(KVMState *s, int type, void *data);
+int kvm_ioctl(KVMState *s, int type, ...);
 
-int kvm_vm_ioctl(KVMState *s, int type, void *data);
+int kvm_vm_ioctl(KVMState *s, int type, ...);
 
-int kvm_vcpu_ioctl(CPUState *env, int type, void *data);
+int kvm_vcpu_ioctl(CPUState *env, int type, ...);
 
 /* Arch specific hooks */
 
index f22f30a1375013a83d7d28016da172332c877741..3f60654ec1277a8aba46974acd9ef9689eb18401 100644 (file)
@@ -130,7 +130,7 @@ int kvm_arch_init(KVMState *s, int smp_cpus)
      * versions of KVM just assumed that it would be at the end of physical
      * memory but that doesn't work with more than 4GB of memory.  We simply
      * refuse to work with those older versions of KVM. */
-    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, (void *)KVM_CAP_SET_TSS_ADDR);
+    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR);
     if (ret <= 0) {
         fprintf(stderr, "kvm does not support KVM_CAP_SET_TSS_ADDR\n");
         return ret;
@@ -140,7 +140,7 @@ int kvm_arch_init(KVMState *s, int smp_cpus)
      * as unavaible memory.  FIXME, need to ensure the e820 map deals with
      * this?
      */
-    return kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, (void *)0xfffbd000);
+    return kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, 0xfffbd000);
 }
                     
 static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs)