iodev.h (1515B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2 3#ifndef __KVM_IODEV_H__ 4#define __KVM_IODEV_H__ 5 6#include <linux/kvm_types.h> 7#include <linux/errno.h> 8 9struct kvm_io_device; 10struct kvm_vcpu; 11 12/** 13 * kvm_io_device_ops are called under kvm slots_lock. 14 * read and write handlers return 0 if the transaction has been handled, 15 * or non-zero to have it passed to the next device. 16 **/ 17struct kvm_io_device_ops { 18 int (*read)(struct kvm_vcpu *vcpu, 19 struct kvm_io_device *this, 20 gpa_t addr, 21 int len, 22 void *val); 23 int (*write)(struct kvm_vcpu *vcpu, 24 struct kvm_io_device *this, 25 gpa_t addr, 26 int len, 27 const void *val); 28 void (*destructor)(struct kvm_io_device *this); 29}; 30 31 32struct kvm_io_device { 33 const struct kvm_io_device_ops *ops; 34}; 35 36static inline void kvm_iodevice_init(struct kvm_io_device *dev, 37 const struct kvm_io_device_ops *ops) 38{ 39 dev->ops = ops; 40} 41 42static inline int kvm_iodevice_read(struct kvm_vcpu *vcpu, 43 struct kvm_io_device *dev, gpa_t addr, 44 int l, void *v) 45{ 46 return dev->ops->read ? dev->ops->read(vcpu, dev, addr, l, v) 47 : -EOPNOTSUPP; 48} 49 50static inline int kvm_iodevice_write(struct kvm_vcpu *vcpu, 51 struct kvm_io_device *dev, gpa_t addr, 52 int l, const void *v) 53{ 54 return dev->ops->write ? dev->ops->write(vcpu, dev, addr, l, v) 55 : -EOPNOTSUPP; 56} 57 58static inline void kvm_iodevice_destructor(struct kvm_io_device *dev) 59{ 60 if (dev->ops->destructor) 61 dev->ops->destructor(dev); 62} 63 64#endif /* __KVM_IODEV_H__ */