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  
9  struct kvm_io_device;
10  struct 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   **/
17  struct 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  
32  struct kvm_io_device {
33  	const struct kvm_io_device_ops *ops;
34  };
35  
kvm_iodevice_init(struct kvm_io_device * dev,const struct kvm_io_device_ops * ops)36  static 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  
kvm_iodevice_read(struct kvm_vcpu * vcpu,struct kvm_io_device * dev,gpa_t addr,int l,void * v)42  static 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  
kvm_iodevice_write(struct kvm_vcpu * vcpu,struct kvm_io_device * dev,gpa_t addr,int l,const void * v)50  static 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