diff options
| author | Julian Stecklina <js@alien8.de> | 2011-11-23 07:54:30 -0500 |
|---|---|---|
| committer | Avi Kivity <avi@redhat.com> | 2011-12-27 04:17:44 -0500 |
| commit | d77fe6354d5b67f4d4eb62a47621da2b3ee3539e (patch) | |
| tree | 4c399e8125d69d128c200807eb517dd7c20b277b | |
| parent | 60f9a9ef5492cae66aca2ad9873360161320d5af (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>
| -rw-r--r-- | virt/kvm/ioapic.c | 15 |
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: |
