aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/ioapic.c
diff options
context:
space:
mode:
authorJulian Stecklina <js@alien8.de>2011-11-23 07:54:30 -0500
committerAvi Kivity <avi@redhat.com>2011-12-27 04:17:44 -0500
commitd77fe6354d5b67f4d4eb62a47621da2b3ee3539e (patch)
tree4c399e8125d69d128c200807eb517dd7c20b277b /virt/kvm/ioapic.c
parent60f9a9ef5492cae66aca2ad9873360161320d5af (diff)
KVM: Allow aligned byte and word writes to IOAPIC registers.
This fixes byte accesses to IOAPIC_REG_SELECT as mandated by at least the ICH10 and Intel Series 5 chipset specs. It also makes ioapic_mmio_write consistent with ioapic_mmio_read, which also allows byte and word accesses. Signed-off-by: Julian Stecklina <js@alien8.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt/kvm/ioapic.c')
-rw-r--r--virt/kvm/ioapic.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c
index 3eed61eb4867..71e2253edee7 100644
--- a/virt/kvm/ioapic.c
+++ b/virt/kvm/ioapic.c
@@ -332,9 +332,18 @@ static int ioapic_mmio_write(struct kvm_io_device *this, gpa_t addr, int len,
332 (void*)addr, len, val); 332 (void*)addr, len, val);
333 ASSERT(!(addr & 0xf)); /* check alignment */ 333 ASSERT(!(addr & 0xf)); /* check alignment */
334 334
335 if (len == 4 || len == 8) 335 switch (len) {
336 case 8:
337 case 4:
336 data = *(u32 *) val; 338 data = *(u32 *) val;
337 else { 339 break;
340 case 2:
341 data = *(u16 *) val;
342 break;
343 case 1:
344 data = *(u8 *) val;
345 break;
346 default:
338 printk(KERN_WARNING "ioapic: Unsupported size %d\n", len); 347 printk(KERN_WARNING "ioapic: Unsupported size %d\n", len);
339 return 0; 348 return 0;
340 } 349 }
@@ -343,7 +352,7 @@ static int ioapic_mmio_write(struct kvm_io_device *this, gpa_t addr, int len,
343 spin_lock(&ioapic->lock); 352 spin_lock(&ioapic->lock);
344 switch (addr) { 353 switch (addr) {
345 case IOAPIC_REG_SELECT: 354 case IOAPIC_REG_SELECT:
346 ioapic->ioregsel = data; 355 ioapic->ioregsel = data & 0xFF; /* 8-bit register */
347 break; 356 break;
348 357
349 case IOAPIC_REG_WINDOW: 358 case IOAPIC_REG_WINDOW: