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,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) */
@@ -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