diff options
| author | Michael S. Tsirkin <mst@redhat.com> | 2009-06-29 22:24:32 +0300 | 
|---|---|---|
| committer | Avi Kivity <avi@redhat.com> | 2009-09-10 08:33:05 +0300 | 
| commit | bda9020e2463ec94db9f97e8615f3bae22069838 (patch) | |
| tree | 48125316d4c0f419a35aefdfbf665d30ad0c55ca /arch/x86/kvm/i8259.c | |
| parent | 6c474694530f377507f9aca438c17206e051e6e7 (diff) | |
| download | linux-bda9020e2463ec94db9f97e8615f3bae22069838.tar.bz2 | |
KVM: remove in_range from io devices
This changes bus accesses to use high-level kvm_io_bus_read/kvm_io_bus_write
functions. in_range now becomes unused so it is removed from device ops in
favor of read/write callbacks performing range checks internally.
This allows aliasing (mostly for in-kernel virtio), as well as better error
handling by making it possible to pass errors up to userspace.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/i8259.c')
| -rw-r--r-- | arch/x86/kvm/i8259.c | 20 | 
1 files changed, 12 insertions, 8 deletions
| diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index 1851aec8a7da..1d1bb75dc7bc 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c @@ -430,8 +430,7 @@ static u32 elcr_ioport_read(void *opaque, u32 addr1)  	return s->elcr;  } -static int picdev_in_range(struct kvm_io_device *this, gpa_t addr, -			   int len, int is_write) +static int picdev_in_range(gpa_t addr)  {  	switch (addr) {  	case 0x20: @@ -451,16 +450,18 @@ static inline struct kvm_pic *to_pic(struct kvm_io_device *dev)  	return container_of(dev, struct kvm_pic, dev);  } -static void picdev_write(struct kvm_io_device *this, +static int picdev_write(struct kvm_io_device *this,  			 gpa_t addr, int len, const void *val)  {  	struct kvm_pic *s = to_pic(this);  	unsigned char data = *(unsigned char *)val; +	if (!picdev_in_range(addr)) +		return -EOPNOTSUPP;  	if (len != 1) {  		if (printk_ratelimit())  			printk(KERN_ERR "PIC: non byte write\n"); -		return; +		return 0;  	}  	pic_lock(s);  	switch (addr) { @@ -476,18 +477,21 @@ static void picdev_write(struct kvm_io_device *this,  		break;  	}  	pic_unlock(s); +	return 0;  } -static void picdev_read(struct kvm_io_device *this, -			gpa_t addr, int len, void *val) +static int picdev_read(struct kvm_io_device *this, +		       gpa_t addr, int len, void *val)  {  	struct kvm_pic *s = to_pic(this);  	unsigned char data = 0; +	if (!picdev_in_range(addr)) +		return -EOPNOTSUPP;  	if (len != 1) {  		if (printk_ratelimit())  			printk(KERN_ERR "PIC: non byte read\n"); -		return; +		return 0;  	}  	pic_lock(s);  	switch (addr) { @@ -504,6 +508,7 @@ static void picdev_read(struct kvm_io_device *this,  	}  	*(unsigned char *)val = data;  	pic_unlock(s); +	return 0;  }  /* @@ -526,7 +531,6 @@ static void pic_irq_request(void *opaque, int level)  static const struct kvm_io_device_ops picdev_ops = {  	.read     = picdev_read,  	.write    = picdev_write, -	.in_range = picdev_in_range,  };  struct kvm_pic *kvm_create_pic(struct kvm *kvm) |