linux/virt/kvm/iodev.h
<<
>>
Prefs
   1/*
   2 * This program is free software; you can redistribute it and/or modify
   3 * it under the terms of the GNU General Public License as published by
   4 * the Free Software Foundation; either version 2 of the License.
   5 *
   6 * This program is distributed in the hope that it will be useful,
   7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
   8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   9 * GNU General Public License for more details.
  10 *
  11 * You should have received a copy of the GNU General Public License
  12 * along with this program; if not, write to the Free Software
  13 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  14 */
  15
  16#ifndef __KVM_IODEV_H__
  17#define __KVM_IODEV_H__
  18
  19#include <linux/kvm_types.h>
  20#include <asm/errno.h>
  21
  22struct kvm_io_device;
  23
  24/**
  25 * kvm_io_device_ops are called under kvm slots_lock.
  26 * read and write handlers return 0 if the transaction has been handled,
  27 * or non-zero to have it passed to the next device.
  28 **/
  29struct kvm_io_device_ops {
  30        int (*read)(struct kvm_io_device *this,
  31                    gpa_t addr,
  32                    int len,
  33                    void *val);
  34        int (*write)(struct kvm_io_device *this,
  35                     gpa_t addr,
  36                     int len,
  37                     const void *val);
  38        void (*destructor)(struct kvm_io_device *this);
  39};
  40
  41
  42struct kvm_io_device {
  43        const struct kvm_io_device_ops *ops;
  44};
  45
  46static inline void kvm_iodevice_init(struct kvm_io_device *dev,
  47                                     const struct kvm_io_device_ops *ops)
  48{
  49        dev->ops = ops;
  50}
  51
  52static inline int kvm_iodevice_read(struct kvm_io_device *dev,
  53                                    gpa_t addr, int l, void *v)
  54{
  55        return dev->ops->read ? dev->ops->read(dev, addr, l, v) : -EOPNOTSUPP;
  56}
  57
  58static inline int kvm_iodevice_write(struct kvm_io_device *dev,
  59                                     gpa_t addr, int l, const void *v)
  60{
  61        return dev->ops->write ? dev->ops->write(dev, addr, l, v) : -EOPNOTSUPP;
  62}
  63
  64static inline void kvm_iodevice_destructor(struct kvm_io_device *dev)
  65{
  66        if (dev->ops->destructor)
  67                dev->ops->destructor(dev);
  68}
  69
  70#endif /* __KVM_IODEV_H__ */
  71