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 | 125 | qemu_irq irq_kbd; |
126 | 126 | qemu_irq irq_mouse; |
127 | 127 | target_phys_addr_t base; |
128 | + int it_shift; | |
128 | 129 | } KBDState; |
129 | 130 | |
130 | 131 | KBDState kbd_state; |
... | ... | @@ -384,21 +385,28 @@ uint32_t kbd_mm_readb (void *opaque, target_phys_addr_t addr) |
384 | 385 | { |
385 | 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 | 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 | 412 | static CPUReadMemoryFunc *kbd_mm_read[] = { |
... | ... | @@ -413,7 +421,8 @@ static CPUWriteMemoryFunc *kbd_mm_write[] = { |
413 | 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 | 427 | KBDState *s = &kbd_state; |
419 | 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 | 430 | s->irq_kbd = kbd_irq; |
422 | 431 | s->irq_mouse = mouse_irq; |
423 | 432 | s->base = base; |
433 | + s->it_shift = it_shift; | |
424 | 434 | |
425 | 435 | kbd_reset(s); |
426 | 436 | register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); |
427 | 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 | 440 | s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); |
431 | 441 | s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); | ... | ... |