hc
2025-02-14 bbb9540dc49f70f6b703d1c8d1b85fa5f602d86e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* 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__ */