59 lines · c
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 58#endif /* __KVM_IODEV_H__ */59