Commit 984b51814712ae4337b9e908da8a03166e2b7289
1 parent
305b0eb2
Define kvm_ioctl in the same way as ioctl
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
Showing
3 changed files
with
32 additions
and
14 deletions
kvm-all.c
| @@ -14,6 +14,7 @@ | @@ -14,6 +14,7 @@ | ||
| 14 | #include <sys/types.h> | 14 | #include <sys/types.h> |
| 15 | #include <sys/ioctl.h> | 15 | #include <sys/ioctl.h> |
| 16 | #include <sys/mman.h> | 16 | #include <sys/mman.h> |
| 17 | +#include <stdarg.h> | ||
| 17 | 18 | ||
| 18 | #include <linux/kvm.h> | 19 | #include <linux/kvm.h> |
| 19 | 20 | ||
| @@ -79,8 +80,7 @@ int kvm_init_vcpu(CPUState *env) | @@ -79,8 +80,7 @@ int kvm_init_vcpu(CPUState *env) | ||
| 79 | 80 | ||
| 80 | dprintf("kvm_init_vcpu\n"); | 81 | dprintf("kvm_init_vcpu\n"); |
| 81 | 82 | ||
| 82 | - ret = kvm_vm_ioctl(s, KVM_CREATE_VCPU, | ||
| 83 | - (void *)(unsigned long)env->cpu_index); | 83 | + ret = kvm_vm_ioctl(s, KVM_CREATE_VCPU, env->cpu_index); |
| 84 | if (ret < 0) { | 84 | if (ret < 0) { |
| 85 | dprintf("kvm_create_vcpu failed\n"); | 85 | dprintf("kvm_create_vcpu failed\n"); |
| 86 | goto err; | 86 | goto err; |
| @@ -156,7 +156,7 @@ int kvm_init(int smp_cpus) | @@ -156,7 +156,7 @@ int kvm_init(int smp_cpus) | ||
| 156 | * just use a user allocated buffer so we can use phys_ram_base | 156 | * just use a user allocated buffer so we can use phys_ram_base |
| 157 | * unmodified. Make sure we have a sufficiently modern version of KVM. | 157 | * unmodified. Make sure we have a sufficiently modern version of KVM. |
| 158 | */ | 158 | */ |
| 159 | - ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, (void *)KVM_CAP_USER_MEMORY); | 159 | + ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY); |
| 160 | if (ret <= 0) { | 160 | if (ret <= 0) { |
| 161 | if (ret == 0) | 161 | if (ret == 0) |
| 162 | ret = -EINVAL; | 162 | ret = -EINVAL; |
| @@ -345,33 +345,51 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr, | @@ -345,33 +345,51 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr, | ||
| 345 | /* FIXME deal with errors */ | 345 | /* FIXME deal with errors */ |
| 346 | } | 346 | } |
| 347 | 347 | ||
| 348 | -int kvm_ioctl(KVMState *s, int type, void *data) | 348 | +int kvm_ioctl(KVMState *s, int type, ...) |
| 349 | { | 349 | { |
| 350 | int ret; | 350 | int ret; |
| 351 | + void *arg; | ||
| 352 | + va_list ap; | ||
| 351 | 353 | ||
| 352 | - ret = ioctl(s->fd, type, data); | 354 | + va_start(ap, type); |
| 355 | + arg = va_arg(ap, void *); | ||
| 356 | + va_end(ap); | ||
| 357 | + | ||
| 358 | + ret = ioctl(s->fd, type, arg); | ||
| 353 | if (ret == -1) | 359 | if (ret == -1) |
| 354 | ret = -errno; | 360 | ret = -errno; |
| 355 | 361 | ||
| 356 | return ret; | 362 | return ret; |
| 357 | } | 363 | } |
| 358 | 364 | ||
| 359 | -int kvm_vm_ioctl(KVMState *s, int type, void *data) | 365 | +int kvm_vm_ioctl(KVMState *s, int type, ...) |
| 360 | { | 366 | { |
| 361 | int ret; | 367 | int ret; |
| 368 | + void *arg; | ||
| 369 | + va_list ap; | ||
| 370 | + | ||
| 371 | + va_start(ap, type); | ||
| 372 | + arg = va_arg(ap, void *); | ||
| 373 | + va_end(ap); | ||
| 362 | 374 | ||
| 363 | - ret = ioctl(s->vmfd, type, data); | 375 | + ret = ioctl(s->vmfd, type, arg); |
| 364 | if (ret == -1) | 376 | if (ret == -1) |
| 365 | ret = -errno; | 377 | ret = -errno; |
| 366 | 378 | ||
| 367 | return ret; | 379 | return ret; |
| 368 | } | 380 | } |
| 369 | 381 | ||
| 370 | -int kvm_vcpu_ioctl(CPUState *env, int type, void *data) | 382 | +int kvm_vcpu_ioctl(CPUState *env, int type, ...) |
| 371 | { | 383 | { |
| 372 | int ret; | 384 | int ret; |
| 385 | + void *arg; | ||
| 386 | + va_list ap; | ||
| 387 | + | ||
| 388 | + va_start(ap, type); | ||
| 389 | + arg = va_arg(ap, void *); | ||
| 390 | + va_end(ap); | ||
| 373 | 391 | ||
| 374 | - ret = ioctl(env->kvm_fd, type, data); | 392 | + ret = ioctl(env->kvm_fd, type, arg); |
| 375 | if (ret == -1) | 393 | if (ret == -1) |
| 376 | ret = -errno; | 394 | ret = -errno; |
| 377 | 395 |
kvm.h
| @@ -43,11 +43,11 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr, | @@ -43,11 +43,11 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr, | ||
| 43 | struct KVMState; | 43 | struct KVMState; |
| 44 | typedef struct KVMState KVMState; | 44 | typedef struct KVMState KVMState; |
| 45 | 45 | ||
| 46 | -int kvm_ioctl(KVMState *s, int type, void *data); | 46 | +int kvm_ioctl(KVMState *s, int type, ...); |
| 47 | 47 | ||
| 48 | -int kvm_vm_ioctl(KVMState *s, int type, void *data); | 48 | +int kvm_vm_ioctl(KVMState *s, int type, ...); |
| 49 | 49 | ||
| 50 | -int kvm_vcpu_ioctl(CPUState *env, int type, void *data); | 50 | +int kvm_vcpu_ioctl(CPUState *env, int type, ...); |
| 51 | 51 | ||
| 52 | /* Arch specific hooks */ | 52 | /* Arch specific hooks */ |
| 53 | 53 |
target-i386/kvm.c
| @@ -130,7 +130,7 @@ int kvm_arch_init(KVMState *s, int smp_cpus) | @@ -130,7 +130,7 @@ int kvm_arch_init(KVMState *s, int smp_cpus) | ||
| 130 | * versions of KVM just assumed that it would be at the end of physical | 130 | * versions of KVM just assumed that it would be at the end of physical |
| 131 | * memory but that doesn't work with more than 4GB of memory. We simply | 131 | * memory but that doesn't work with more than 4GB of memory. We simply |
| 132 | * refuse to work with those older versions of KVM. */ | 132 | * refuse to work with those older versions of KVM. */ |
| 133 | - ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, (void *)KVM_CAP_SET_TSS_ADDR); | 133 | + ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR); |
| 134 | if (ret <= 0) { | 134 | if (ret <= 0) { |
| 135 | fprintf(stderr, "kvm does not support KVM_CAP_SET_TSS_ADDR\n"); | 135 | fprintf(stderr, "kvm does not support KVM_CAP_SET_TSS_ADDR\n"); |
| 136 | return ret; | 136 | return ret; |
| @@ -140,7 +140,7 @@ int kvm_arch_init(KVMState *s, int smp_cpus) | @@ -140,7 +140,7 @@ int kvm_arch_init(KVMState *s, int smp_cpus) | ||
| 140 | * as unavaible memory. FIXME, need to ensure the e820 map deals with | 140 | * as unavaible memory. FIXME, need to ensure the e820 map deals with |
| 141 | * this? | 141 | * this? |
| 142 | */ | 142 | */ |
| 143 | - return kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, (void *)0xfffbd000); | 143 | + return kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, 0xfffbd000); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs) | 146 | static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs) |