Message ID | 1377286862-5879-4-git-send-email-christoffer.dall@linaro.org |
---|---|
State | New |
Headers | show |
On 23 August 2013 20:41, Christoffer Dall <christoffer.dall@linaro.org> wrote: > Introduces two simple functions: > int kvm_device_ioctl(int fd, int type, ...); > int kvm_create_device(KVMState *s, uint64_t type, bool test); > > These functions wrap the basic ioctl-based interactions with KVM in a > way similar to other KVM ioctl wrappers. > > Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org> > --- > include/sysemu/kvm.h | 5 +++++ > kvm-all.c | 39 +++++++++++++++++++++++++++++++++++++++ > trace-events | 1 + > 3 files changed, 45 insertions(+) > > diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h > index 1e5847e..84ca5ef 100644 > --- a/include/sysemu/kvm.h > +++ b/include/sysemu/kvm.h > @@ -190,6 +190,11 @@ int kvm_vm_ioctl(KVMState *s, int type, ...); > > int kvm_vcpu_ioctl(CPUState *cpu, int type, ...); > > +int kvm_device_ioctl(int fd, int type, ...); > + > +int kvm_create_device(KVMState *s, uint64_t type, bool test); Could we have doc comments for these, please? > + > + > /* Arch specific hooks */ > > extern const KVMCapabilityInfo kvm_arch_required_capabilities[]; > diff --git a/kvm-all.c b/kvm-all.c > index fe64f3b..957b961 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -1770,6 +1770,24 @@ int kvm_vcpu_ioctl(CPUState *cpu, int type, ...) > return ret; > } > > +int kvm_device_ioctl(int fd, int type, ...) > +{ > + int ret; > + void *arg; > + va_list ap; > + > + va_start(ap, type); > + arg = va_arg(ap, void *); > + va_end(ap); > + > + trace_kvm_device_ioctl(fd, type, arg); > + ret = ioctl(fd, type, arg); > + if (ret == -1) { > + ret = -errno; > + } > + return ret; > +} > + > int kvm_has_sync_mmu(void) > { > return kvm_check_extension(kvm_state, KVM_CAP_SYNC_MMU); > @@ -2064,3 +2082,24 @@ int kvm_on_sigbus(int code, void *addr) > { > return kvm_arch_on_sigbus(code, addr); > } > + > +int kvm_create_device(KVMState *s, uint64_t type, bool test) > +{ > + int ret; > + struct kvm_create_device create_dev; > + > + create_dev.type = type; > + create_dev.fd = -1; > + create_dev.flags = (test) ? KVM_CREATE_DEVICE_TEST : 0; Why the brackets round 'test' ? > + > + if (!kvm_check_extension(s, KVM_CAP_DEVICE_CTRL)) { > + return -1; We should probably return -$some_errno here, since we pass through a -errno return from kvm_vm_ioctl below. > + } > + > + ret = kvm_vm_ioctl(s, KVM_CREATE_DEVICE, &create_dev); > + if (ret) { > + return ret; > + } > + > + return (test) ? 0 : create_dev.fd; > +} thanks -- PMM
diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index 1e5847e..84ca5ef 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -190,6 +190,11 @@ int kvm_vm_ioctl(KVMState *s, int type, ...); int kvm_vcpu_ioctl(CPUState *cpu, int type, ...); +int kvm_device_ioctl(int fd, int type, ...); + +int kvm_create_device(KVMState *s, uint64_t type, bool test); + + /* Arch specific hooks */ extern const KVMCapabilityInfo kvm_arch_required_capabilities[]; diff --git a/kvm-all.c b/kvm-all.c index fe64f3b..957b961 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1770,6 +1770,24 @@ int kvm_vcpu_ioctl(CPUState *cpu, int type, ...) return ret; } +int kvm_device_ioctl(int fd, int type, ...) +{ + int ret; + void *arg; + va_list ap; + + va_start(ap, type); + arg = va_arg(ap, void *); + va_end(ap); + + trace_kvm_device_ioctl(fd, type, arg); + ret = ioctl(fd, type, arg); + if (ret == -1) { + ret = -errno; + } + return ret; +} + int kvm_has_sync_mmu(void) { return kvm_check_extension(kvm_state, KVM_CAP_SYNC_MMU); @@ -2064,3 +2082,24 @@ int kvm_on_sigbus(int code, void *addr) { return kvm_arch_on_sigbus(code, addr); } + +int kvm_create_device(KVMState *s, uint64_t type, bool test) +{ + int ret; + struct kvm_create_device create_dev; + + create_dev.type = type; + create_dev.fd = -1; + create_dev.flags = (test) ? KVM_CREATE_DEVICE_TEST : 0; + + if (!kvm_check_extension(s, KVM_CAP_DEVICE_CTRL)) { + return -1; + } + + ret = kvm_vm_ioctl(s, KVM_CREATE_DEVICE, &create_dev); + if (ret) { + return ret; + } + + return (test) ? 0 : create_dev.fd; +} diff --git a/trace-events b/trace-events index 3856b5c..5372c6e 100644 --- a/trace-events +++ b/trace-events @@ -1163,6 +1163,7 @@ migrate_set_state(int new_state) "new state %d" kvm_ioctl(int type, void *arg) "type %d, arg %p" kvm_vm_ioctl(int type, void *arg) "type %d, arg %p" kvm_vcpu_ioctl(int cpu_index, int type, void *arg) "cpu_index %d, type %d, arg %p" +kvm_device_ioctl(int fd, int type, void *arg) "dev fd %d, type %d, arg %p" kvm_run_exit(int cpu_index, uint32_t reason) "cpu_index %d, reason %d" # memory.c
Introduces two simple functions: int kvm_device_ioctl(int fd, int type, ...); int kvm_create_device(KVMState *s, uint64_t type, bool test); These functions wrap the basic ioctl-based interactions with KVM in a way similar to other KVM ioctl wrappers. Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org> --- include/sysemu/kvm.h | 5 +++++ kvm-all.c | 39 +++++++++++++++++++++++++++++++++++++++ trace-events | 1 + 3 files changed, 45 insertions(+)