12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- #ifndef __KVM_IODEV_H__
- #define __KVM_IODEV_H__
- #include <linux/kvm_types.h>
- #include <linux/errno.h>
- struct kvm_io_device;
- struct kvm_vcpu;
- /**
- * kvm_io_device_ops are called under kvm slots_lock.
- * read and write handlers return 0 if the transaction has been handled,
- * or non-zero to have it passed to the next device.
- **/
- struct kvm_io_device_ops {
- int (*read)(struct kvm_vcpu *vcpu,
- struct kvm_io_device *this,
- gpa_t addr,
- int len,
- void *val);
- int (*write)(struct kvm_vcpu *vcpu,
- struct kvm_io_device *this,
- gpa_t addr,
- int len,
- const void *val);
- void (*destructor)(struct kvm_io_device *this);
- };
- struct kvm_io_device {
- const struct kvm_io_device_ops *ops;
- };
- static inline void kvm_iodevice_init(struct kvm_io_device *dev,
- const struct kvm_io_device_ops *ops)
- {
- dev->ops = ops;
- }
- static inline int kvm_iodevice_read(struct kvm_vcpu *vcpu,
- struct kvm_io_device *dev, gpa_t addr,
- int l, void *v)
- {
- return dev->ops->read ? dev->ops->read(vcpu, dev, addr, l, v)
- : -EOPNOTSUPP;
- }
- static inline int kvm_iodevice_write(struct kvm_vcpu *vcpu,
- struct kvm_io_device *dev, gpa_t addr,
- int l, const void *v)
- {
- return dev->ops->write ? dev->ops->write(vcpu, dev, addr, l, v)
- : -EOPNOTSUPP;
- }
- static inline void kvm_iodevice_destructor(struct kvm_io_device *dev)
- {
- if (dev->ops->destructor)
- dev->ops->destructor(dev);
- }
- #endif /* __KVM_IODEV_H__ */
|