Commit 18c6e2ff5adc016031566f409382417f6fde626d
1 parent
fcb4a419
Fix mmapped register alignment and endianness handling.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2694 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
27 additions
and
12 deletions
hw/mc146818rtc.c
... | ... | @@ -56,6 +56,7 @@ struct RTCState { |
56 | 56 | struct tm current_tm; |
57 | 57 | qemu_irq irq; |
58 | 58 | target_phys_addr_t base; |
59 | + int it_shift; | |
59 | 60 | /* periodic timer */ |
60 | 61 | QEMUTimer *periodic_timer; |
61 | 62 | int64_t next_periodic_time; |
... | ... | @@ -492,7 +493,7 @@ uint32_t cmos_mm_readb (void *opaque, target_phys_addr_t addr) |
492 | 493 | { |
493 | 494 | RTCState *s = opaque; |
494 | 495 | |
495 | - return cmos_ioport_read(s, addr - s->base) & 0xFF; | |
496 | + return cmos_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFF; | |
496 | 497 | } |
497 | 498 | |
498 | 499 | void cmos_mm_writeb (void *opaque, |
... | ... | @@ -500,37 +501,51 @@ void cmos_mm_writeb (void *opaque, |
500 | 501 | { |
501 | 502 | RTCState *s = opaque; |
502 | 503 | |
503 | - cmos_ioport_write(s, addr - s->base, value & 0xFF); | |
504 | + cmos_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFF); | |
504 | 505 | } |
505 | 506 | |
506 | 507 | uint32_t cmos_mm_readw (void *opaque, target_phys_addr_t addr) |
507 | 508 | { |
508 | 509 | RTCState *s = opaque; |
510 | + uint32_t val; | |
509 | 511 | |
510 | - return cmos_ioport_read(s, addr - s->base) & 0xFFFF; | |
512 | + val = cmos_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF; | |
513 | +#ifdef TARGET_WORDS_BIGENDIAN | |
514 | + val = bswap16(val); | |
515 | +#endif | |
516 | + return val; | |
511 | 517 | } |
512 | 518 | |
513 | 519 | void cmos_mm_writew (void *opaque, |
514 | 520 | target_phys_addr_t addr, uint32_t value) |
515 | 521 | { |
516 | 522 | RTCState *s = opaque; |
517 | - | |
518 | - cmos_ioport_write(s, addr - s->base, value & 0xFFFF); | |
523 | +#ifdef TARGET_WORDS_BIGENDIAN | |
524 | + value = bswap16(value); | |
525 | +#endif | |
526 | + cmos_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFFFF); | |
519 | 527 | } |
520 | 528 | |
521 | 529 | uint32_t cmos_mm_readl (void *opaque, target_phys_addr_t addr) |
522 | 530 | { |
523 | 531 | RTCState *s = opaque; |
532 | + uint32_t val; | |
524 | 533 | |
525 | - return cmos_ioport_read(s, addr - s->base); | |
534 | + val = cmos_ioport_read(s, (addr - s->base) >> s->it_shift); | |
535 | +#ifdef TARGET_WORDS_BIGENDIAN | |
536 | + val = bswap32(val); | |
537 | +#endif | |
538 | + return val; | |
526 | 539 | } |
527 | 540 | |
528 | 541 | void cmos_mm_writel (void *opaque, |
529 | 542 | target_phys_addr_t addr, uint32_t value) |
530 | 543 | { |
531 | 544 | RTCState *s = opaque; |
532 | - | |
533 | - cmos_ioport_write(s, addr - s->base, value); | |
545 | +#ifdef TARGET_WORDS_BIGENDIAN | |
546 | + value = bswap32(value); | |
547 | +#endif | |
548 | + cmos_ioport_write(s, (addr - s->base) >> s->it_shift, value); | |
534 | 549 | } |
535 | 550 | |
536 | 551 | static CPUReadMemoryFunc *rtc_mm_read[] = { |
... | ... | @@ -545,7 +560,7 @@ static CPUWriteMemoryFunc *rtc_mm_write[] = { |
545 | 560 | &cmos_mm_writel, |
546 | 561 | }; |
547 | 562 | |
548 | -RTCState *rtc_mm_init(target_phys_addr_t base, qemu_irq irq) | |
563 | +RTCState *rtc_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq) | |
549 | 564 | { |
550 | 565 | RTCState *s; |
551 | 566 | int io_memory; |
... | ... | @@ -574,7 +589,7 @@ RTCState *rtc_mm_init(target_phys_addr_t base, qemu_irq irq) |
574 | 589 | qemu_mod_timer(s->second_timer2, s->next_second_time); |
575 | 590 | |
576 | 591 | io_memory = cpu_register_io_memory(0, rtc_mm_read, rtc_mm_write, s); |
577 | - cpu_register_physical_memory(base, 2, io_memory); | |
592 | + cpu_register_physical_memory(base, 2 << it_shift, io_memory); | |
578 | 593 | |
579 | 594 | register_savevm("mc146818rtc", base, 1, rtc_save, rtc_load, s); |
580 | 595 | return s; | ... | ... |
hw/mips_pica61.c
... | ... | @@ -125,7 +125,7 @@ void mips_pica61_init (int ram_size, int vga_ram_size, int boot_device, |
125 | 125 | /* PC style IRQ (i8259/i8254) and DMA (i8257) */ |
126 | 126 | /* The PIC is attached to the MIPS CPU INT0 pin */ |
127 | 127 | i8259 = i8259_init(env->irq[2]); |
128 | - rtc_mm_init(0x80004070, i8259[14]); | |
128 | + rtc_mm_init(0x80004070, 1, i8259[14]); | |
129 | 129 | pit_init(0x40, 0); |
130 | 130 | |
131 | 131 | /* Keyboard (i8042) */ | ... | ... |
vl.h
... | ... | @@ -1043,7 +1043,7 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, target_ulong base, int |
1043 | 1043 | typedef struct RTCState RTCState; |
1044 | 1044 | |
1045 | 1045 | RTCState *rtc_init(int base, qemu_irq irq); |
1046 | -RTCState *rtc_mm_init(target_phys_addr_t base, qemu_irq irq); | |
1046 | +RTCState *rtc_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq); | |
1047 | 1047 | void rtc_set_memory(RTCState *s, int addr, int val); |
1048 | 1048 | void rtc_set_date(RTCState *s, const struct tm *tm); |
1049 | 1049 | ... | ... |