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,6 +56,7 @@ struct RTCState { | ||
| 56 | struct tm current_tm; | 56 | struct tm current_tm; |
| 57 | qemu_irq irq; | 57 | qemu_irq irq; |
| 58 | target_phys_addr_t base; | 58 | target_phys_addr_t base; |
| 59 | + int it_shift; | ||
| 59 | /* periodic timer */ | 60 | /* periodic timer */ |
| 60 | QEMUTimer *periodic_timer; | 61 | QEMUTimer *periodic_timer; |
| 61 | int64_t next_periodic_time; | 62 | int64_t next_periodic_time; |
| @@ -492,7 +493,7 @@ uint32_t cmos_mm_readb (void *opaque, target_phys_addr_t addr) | @@ -492,7 +493,7 @@ uint32_t cmos_mm_readb (void *opaque, target_phys_addr_t addr) | ||
| 492 | { | 493 | { |
| 493 | RTCState *s = opaque; | 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 | void cmos_mm_writeb (void *opaque, | 499 | void cmos_mm_writeb (void *opaque, |
| @@ -500,37 +501,51 @@ void cmos_mm_writeb (void *opaque, | @@ -500,37 +501,51 @@ void cmos_mm_writeb (void *opaque, | ||
| 500 | { | 501 | { |
| 501 | RTCState *s = opaque; | 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 | uint32_t cmos_mm_readw (void *opaque, target_phys_addr_t addr) | 507 | uint32_t cmos_mm_readw (void *opaque, target_phys_addr_t addr) |
| 507 | { | 508 | { |
| 508 | RTCState *s = opaque; | 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 | void cmos_mm_writew (void *opaque, | 519 | void cmos_mm_writew (void *opaque, |
| 514 | target_phys_addr_t addr, uint32_t value) | 520 | target_phys_addr_t addr, uint32_t value) |
| 515 | { | 521 | { |
| 516 | RTCState *s = opaque; | 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 | uint32_t cmos_mm_readl (void *opaque, target_phys_addr_t addr) | 529 | uint32_t cmos_mm_readl (void *opaque, target_phys_addr_t addr) |
| 522 | { | 530 | { |
| 523 | RTCState *s = opaque; | 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 | void cmos_mm_writel (void *opaque, | 541 | void cmos_mm_writel (void *opaque, |
| 529 | target_phys_addr_t addr, uint32_t value) | 542 | target_phys_addr_t addr, uint32_t value) |
| 530 | { | 543 | { |
| 531 | RTCState *s = opaque; | 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 | static CPUReadMemoryFunc *rtc_mm_read[] = { | 551 | static CPUReadMemoryFunc *rtc_mm_read[] = { |
| @@ -545,7 +560,7 @@ static CPUWriteMemoryFunc *rtc_mm_write[] = { | @@ -545,7 +560,7 @@ static CPUWriteMemoryFunc *rtc_mm_write[] = { | ||
| 545 | &cmos_mm_writel, | 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 | RTCState *s; | 565 | RTCState *s; |
| 551 | int io_memory; | 566 | int io_memory; |
| @@ -574,7 +589,7 @@ RTCState *rtc_mm_init(target_phys_addr_t base, qemu_irq irq) | @@ -574,7 +589,7 @@ RTCState *rtc_mm_init(target_phys_addr_t base, qemu_irq irq) | ||
| 574 | qemu_mod_timer(s->second_timer2, s->next_second_time); | 589 | qemu_mod_timer(s->second_timer2, s->next_second_time); |
| 575 | 590 | ||
| 576 | io_memory = cpu_register_io_memory(0, rtc_mm_read, rtc_mm_write, s); | 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 | register_savevm("mc146818rtc", base, 1, rtc_save, rtc_load, s); | 594 | register_savevm("mc146818rtc", base, 1, rtc_save, rtc_load, s); |
| 580 | return s; | 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,7 +125,7 @@ void mips_pica61_init (int ram_size, int vga_ram_size, int boot_device, | ||
| 125 | /* PC style IRQ (i8259/i8254) and DMA (i8257) */ | 125 | /* PC style IRQ (i8259/i8254) and DMA (i8257) */ |
| 126 | /* The PIC is attached to the MIPS CPU INT0 pin */ | 126 | /* The PIC is attached to the MIPS CPU INT0 pin */ |
| 127 | i8259 = i8259_init(env->irq[2]); | 127 | i8259 = i8259_init(env->irq[2]); |
| 128 | - rtc_mm_init(0x80004070, i8259[14]); | 128 | + rtc_mm_init(0x80004070, 1, i8259[14]); |
| 129 | pit_init(0x40, 0); | 129 | pit_init(0x40, 0); |
| 130 | 130 | ||
| 131 | /* Keyboard (i8042) */ | 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,7 +1043,7 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, target_ulong base, int | ||
| 1043 | typedef struct RTCState RTCState; | 1043 | typedef struct RTCState RTCState; |
| 1044 | 1044 | ||
| 1045 | RTCState *rtc_init(int base, qemu_irq irq); | 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 | void rtc_set_memory(RTCState *s, int addr, int val); | 1047 | void rtc_set_memory(RTCState *s, int addr, int val); |
| 1048 | void rtc_set_date(RTCState *s, const struct tm *tm); | 1048 | void rtc_set_date(RTCState *s, const struct tm *tm); |
| 1049 | 1049 |