Commit 80355292503667b5367f09ec8716126c3caa1e3a
1 parent
8ecc7913
Support it_shift for mmapped pckbd.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2691 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
22 additions
and
12 deletions
hw/pckbd.c
| @@ -125,6 +125,7 @@ typedef struct KBDState { | @@ -125,6 +125,7 @@ typedef struct KBDState { | ||
| 125 | qemu_irq irq_kbd; | 125 | qemu_irq irq_kbd; |
| 126 | qemu_irq irq_mouse; | 126 | qemu_irq irq_mouse; |
| 127 | target_phys_addr_t base; | 127 | target_phys_addr_t base; |
| 128 | + int it_shift; | ||
| 128 | } KBDState; | 129 | } KBDState; |
| 129 | 130 | ||
| 130 | KBDState kbd_state; | 131 | KBDState kbd_state; |
| @@ -384,21 +385,28 @@ uint32_t kbd_mm_readb (void *opaque, target_phys_addr_t addr) | @@ -384,21 +385,28 @@ uint32_t kbd_mm_readb (void *opaque, target_phys_addr_t addr) | ||
| 384 | { | 385 | { |
| 385 | KBDState *s = opaque; | 386 | KBDState *s = opaque; |
| 386 | 387 | ||
| 387 | - if (addr == s->base) | ||
| 388 | - return kbd_read_data(s, 0); | ||
| 389 | - else | ||
| 390 | - return kbd_read_status(s, 0); | 388 | + switch ((addr - s->base) >> s->it_shift) { |
| 389 | + case 0: | ||
| 390 | + return kbd_read_data(s, 0) & 0xff; | ||
| 391 | + case 1: | ||
| 392 | + return kbd_read_status(s, 0) & 0xff; | ||
| 393 | + default: | ||
| 394 | + return 0xff; | ||
| 395 | + } | ||
| 391 | } | 396 | } |
| 392 | 397 | ||
| 393 | -void kbd_mm_writeb (void *opaque, | ||
| 394 | - target_phys_addr_t addr, uint32_t value) | 398 | +void kbd_mm_writeb (void *opaque, target_phys_addr_t addr, uint32_t value) |
| 395 | { | 399 | { |
| 396 | KBDState *s = opaque; | 400 | KBDState *s = opaque; |
| 397 | 401 | ||
| 398 | - if (addr == s->base) | ||
| 399 | - kbd_write_data(s, 0, value); | ||
| 400 | - else | ||
| 401 | - kbd_write_command(s, 0, value); | 402 | + switch ((addr - s->base) >> s->it_shift) { |
| 403 | + case 0: | ||
| 404 | + kbd_write_data(s, 0, value & 0xff); | ||
| 405 | + break; | ||
| 406 | + case 1: | ||
| 407 | + kbd_write_command(s, 0, value & 0xff); | ||
| 408 | + break; | ||
| 409 | + } | ||
| 402 | } | 410 | } |
| 403 | 411 | ||
| 404 | static CPUReadMemoryFunc *kbd_mm_read[] = { | 412 | static CPUReadMemoryFunc *kbd_mm_read[] = { |
| @@ -413,7 +421,8 @@ static CPUWriteMemoryFunc *kbd_mm_write[] = { | @@ -413,7 +421,8 @@ static CPUWriteMemoryFunc *kbd_mm_write[] = { | ||
| 413 | &kbd_mm_writeb, | 421 | &kbd_mm_writeb, |
| 414 | }; | 422 | }; |
| 415 | 423 | ||
| 416 | -void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, target_ulong base, int it_shift) | 424 | +void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, target_ulong base, |
| 425 | + int it_shift) | ||
| 417 | { | 426 | { |
| 418 | KBDState *s = &kbd_state; | 427 | KBDState *s = &kbd_state; |
| 419 | int s_io_memory; | 428 | int s_io_memory; |
| @@ -421,11 +430,12 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, target_ulong base, int | @@ -421,11 +430,12 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, target_ulong base, int | ||
| 421 | s->irq_kbd = kbd_irq; | 430 | s->irq_kbd = kbd_irq; |
| 422 | s->irq_mouse = mouse_irq; | 431 | s->irq_mouse = mouse_irq; |
| 423 | s->base = base; | 432 | s->base = base; |
| 433 | + s->it_shift = it_shift; | ||
| 424 | 434 | ||
| 425 | kbd_reset(s); | 435 | kbd_reset(s); |
| 426 | register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); | 436 | register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); |
| 427 | s_io_memory = cpu_register_io_memory(0, kbd_mm_read, kbd_mm_write, s); | 437 | s_io_memory = cpu_register_io_memory(0, kbd_mm_read, kbd_mm_write, s); |
| 428 | - cpu_register_physical_memory(base & ~(TARGET_PAGE_SIZE - 1), TARGET_PAGE_SIZE, s_io_memory); | 438 | + cpu_register_physical_memory(base, 8 << it_shift, s_io_memory); |
| 429 | 439 | ||
| 430 | s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); | 440 | s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); |
| 431 | s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); | 441 | s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); |