Commit 18c6e2ff5adc016031566f409382417f6fde626d

Authored by ths
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
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) */
... ...
... ... @@ -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  
... ...