Revision 4efbe58f hw/pckbd.c

b/hw/pckbd.c
125 125

  
126 126
    qemu_irq irq_kbd;
127 127
    qemu_irq irq_mouse;
128
    int it_shift;
128
    target_phys_addr_t mask;
129 129
} KBDState;
130 130

  
131 131
static KBDState kbd_state;
......
391 391
{
392 392
    KBDState *s = opaque;
393 393

  
394
    switch (addr >> s->it_shift) {
395
    case 0:
396
        return kbd_read_data(s, 0) & 0xff;
397
    case 1:
394
    if (addr & s->mask)
398 395
        return kbd_read_status(s, 0) & 0xff;
399
    default:
400
        return 0xff;
401
    }
396
    else
397
        return kbd_read_data(s, 0) & 0xff;
402 398
}
403 399

  
404 400
static void kbd_mm_writeb (void *opaque, target_phys_addr_t addr, uint32_t value)
405 401
{
406 402
    KBDState *s = opaque;
407 403

  
408
    switch (addr >> s->it_shift) {
409
    case 0:
410
        kbd_write_data(s, 0, value & 0xff);
411
        break;
412
    case 1:
404
    if (addr & s->mask)
413 405
        kbd_write_command(s, 0, value & 0xff);
414
        break;
415
    }
406
    else
407
        kbd_write_data(s, 0, value & 0xff);
416 408
}
417 409

  
418 410
static CPUReadMemoryFunc *kbd_mm_read[] = {
......
428 420
};
429 421

  
430 422
void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
431
                   target_phys_addr_t base, int it_shift)
423
                   target_phys_addr_t base, ram_addr_t size,
424
                   target_phys_addr_t mask)
432 425
{
433 426
    KBDState *s = &kbd_state;
434 427
    int s_io_memory;
435 428

  
436 429
    s->irq_kbd = kbd_irq;
437 430
    s->irq_mouse = mouse_irq;
438
    s->it_shift = it_shift;
431
    s->mask = mask;
439 432

  
440 433
    kbd_reset(s);
441 434
    register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s);
442 435
    s_io_memory = cpu_register_io_memory(0, kbd_mm_read, kbd_mm_write, s);
443
    cpu_register_physical_memory(base, 2 << it_shift, s_io_memory);
436
    cpu_register_physical_memory(base, size, s_io_memory);
444 437

  
445 438
    s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s);
446 439
    s->mouse = ps2_mouse_init(kbd_update_aux_irq, s);

Also available in: Unified diff