Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/kvm/iodev.h
26285 views
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
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
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
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
60