2007-12-04 00:30:24 +03:00
/*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*/
# ifndef __KVM_IODEV_H__
# define __KVM_IODEV_H__
2007-12-16 12:02:48 +03:00
# include <linux/kvm_types.h>
2009-06-29 23:24:32 +04:00
# include <asm/errno.h>
2007-12-04 00:30:24 +03:00
2009-06-01 20:54:50 +04:00
struct kvm_io_device ;
2009-06-29 23:24:07 +04:00
/**
* kvm_io_device_ops are called under kvm slots_lock .
2009-06-29 23:24:32 +04:00
* read and write handlers return 0 if the transaction has been handled ,
* or non - zero to have it passed to the next device .
2009-06-29 23:24:07 +04:00
* */
2009-06-01 20:54:50 +04:00
struct kvm_io_device_ops {
2009-06-29 23:24:32 +04:00
int ( * read ) ( struct kvm_io_device * this ,
gpa_t addr ,
int len ,
void * val ) ;
int ( * write ) ( struct kvm_io_device * this ,
2007-12-04 00:30:24 +03:00
gpa_t addr ,
int len ,
2009-06-29 23:24:32 +04:00
const void * val ) ;
2007-12-04 00:30:24 +03:00
void ( * destructor ) ( struct kvm_io_device * this ) ;
2009-06-01 20:54:50 +04:00
} ;
2007-12-04 00:30:24 +03:00
2009-06-01 20:54:50 +04:00
struct kvm_io_device {
const struct kvm_io_device_ops * ops ;
2007-12-04 00:30:24 +03:00
} ;
2009-06-01 20:54:50 +04:00
static inline void kvm_iodevice_init ( struct kvm_io_device * dev ,
const struct kvm_io_device_ops * ops )
{
dev - > ops = ops ;
}
2009-06-29 23:24:32 +04:00
static inline int kvm_iodevice_read ( struct kvm_io_device * dev ,
gpa_t addr , int l , void * v )
2007-12-04 00:30:24 +03:00
{
2009-06-29 23:24:32 +04:00
return dev - > ops - > read ? dev - > ops - > read ( dev , addr , l , v ) : - EOPNOTSUPP ;
2007-12-04 00:30:24 +03:00
}
2009-06-29 23:24:32 +04:00
static inline int kvm_iodevice_write ( struct kvm_io_device * dev ,
gpa_t addr , int l , const void * v )
2007-12-04 00:30:24 +03:00
{
2009-06-29 23:24:32 +04:00
return dev - > ops - > write ? dev - > ops - > write ( dev , addr , l , v ) : - EOPNOTSUPP ;
2007-12-04 00:30:24 +03:00
}
static inline void kvm_iodevice_destructor ( struct kvm_io_device * dev )
{
2009-06-01 20:54:50 +04:00
if ( dev - > ops - > destructor )
dev - > ops - > destructor ( dev ) ;
2007-12-04 00:30:24 +03:00
}
# endif /* __KVM_IODEV_H__ */