Commit 3f7cbbbdd4d45f30f1dfcb3905cee5e085f99011
1 parent
52f163b7
target-ppc: fix PowerMAC NVRAM emulation
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6132 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
12 additions
and
6 deletions
hw/mac_nvram.c
| @@ -40,7 +40,7 @@ do { printf("NVR: " fmt , ##args); } while (0) | @@ -40,7 +40,7 @@ do { printf("NVR: " fmt , ##args); } while (0) | ||
| 40 | struct MacIONVRAMState { | 40 | struct MacIONVRAMState { |
| 41 | target_phys_addr_t size; | 41 | target_phys_addr_t size; |
| 42 | int mem_index; | 42 | int mem_index; |
| 43 | - uint8_t data[0x2000]; | 43 | + uint8_t *data; |
| 44 | }; | 44 | }; |
| 45 | 45 | ||
| 46 | /* Direct access to NVRAM */ | 46 | /* Direct access to NVRAM */ |
| @@ -49,7 +49,7 @@ uint32_t macio_nvram_read (void *opaque, uint32_t addr) | @@ -49,7 +49,7 @@ uint32_t macio_nvram_read (void *opaque, uint32_t addr) | ||
| 49 | MacIONVRAMState *s = opaque; | 49 | MacIONVRAMState *s = opaque; |
| 50 | uint32_t ret; | 50 | uint32_t ret; |
| 51 | 51 | ||
| 52 | - if (addr < 0x2000) | 52 | + if (addr < s->size) |
| 53 | ret = s->data[addr]; | 53 | ret = s->data[addr]; |
| 54 | else | 54 | else |
| 55 | ret = -1; | 55 | ret = -1; |
| @@ -63,7 +63,7 @@ void macio_nvram_write (void *opaque, uint32_t addr, uint32_t val) | @@ -63,7 +63,7 @@ void macio_nvram_write (void *opaque, uint32_t addr, uint32_t val) | ||
| 63 | MacIONVRAMState *s = opaque; | 63 | MacIONVRAMState *s = opaque; |
| 64 | 64 | ||
| 65 | NVR_DPRINTF("write addr %04x val %x\n", addr, val); | 65 | NVR_DPRINTF("write addr %04x val %x\n", addr, val); |
| 66 | - if (addr < 0x2000) | 66 | + if (addr < s->size) |
| 67 | s->data[addr] = val; | 67 | s->data[addr] = val; |
| 68 | } | 68 | } |
| 69 | 69 | ||
| @@ -73,7 +73,7 @@ static void macio_nvram_writeb (void *opaque, | @@ -73,7 +73,7 @@ static void macio_nvram_writeb (void *opaque, | ||
| 73 | { | 73 | { |
| 74 | MacIONVRAMState *s = opaque; | 74 | MacIONVRAMState *s = opaque; |
| 75 | 75 | ||
| 76 | - addr = (addr >> 4) & 0x1fff; | 76 | + addr = (addr >> 4) & (s->size - 1); |
| 77 | s->data[addr] = value; | 77 | s->data[addr] = value; |
| 78 | NVR_DPRINTF("writeb addr %04x val %x\n", (int)addr, value); | 78 | NVR_DPRINTF("writeb addr %04x val %x\n", (int)addr, value); |
| 79 | } | 79 | } |
| @@ -83,7 +83,7 @@ static uint32_t macio_nvram_readb (void *opaque, target_phys_addr_t addr) | @@ -83,7 +83,7 @@ static uint32_t macio_nvram_readb (void *opaque, target_phys_addr_t addr) | ||
| 83 | MacIONVRAMState *s = opaque; | 83 | MacIONVRAMState *s = opaque; |
| 84 | uint32_t value; | 84 | uint32_t value; |
| 85 | 85 | ||
| 86 | - addr = (addr >> 4) & 0x1fff; | 86 | + addr = (addr >> 4) & (s->size - 1); |
| 87 | value = s->data[addr]; | 87 | value = s->data[addr]; |
| 88 | NVR_DPRINTF("readb addr %04x val %x\n", (int)addr, value); | 88 | NVR_DPRINTF("readb addr %04x val %x\n", (int)addr, value); |
| 89 | 89 | ||
| @@ -109,7 +109,13 @@ MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size) | @@ -109,7 +109,13 @@ MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size) | ||
| 109 | s = qemu_mallocz(sizeof(MacIONVRAMState)); | 109 | s = qemu_mallocz(sizeof(MacIONVRAMState)); |
| 110 | if (!s) | 110 | if (!s) |
| 111 | return NULL; | 111 | return NULL; |
| 112 | + s->data = qemu_mallocz(size); | ||
| 113 | + if (!s->data) { | ||
| 114 | + qemu_free(s); | ||
| 115 | + return NULL; | ||
| 116 | + } | ||
| 112 | s->size = size; | 117 | s->size = size; |
| 118 | + | ||
| 113 | s->mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s); | 119 | s->mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s); |
| 114 | *mem_index = s->mem_index; | 120 | *mem_index = s->mem_index; |
| 115 | 121 | ||
| @@ -121,7 +127,7 @@ void macio_nvram_map (void *opaque, target_phys_addr_t mem_base) | @@ -121,7 +127,7 @@ void macio_nvram_map (void *opaque, target_phys_addr_t mem_base) | ||
| 121 | MacIONVRAMState *s; | 127 | MacIONVRAMState *s; |
| 122 | 128 | ||
| 123 | s = opaque; | 129 | s = opaque; |
| 124 | - cpu_register_physical_memory(mem_base, s->size, s->mem_index); | 130 | + cpu_register_physical_memory(mem_base, s->size << 4, s->mem_index); |
| 125 | } | 131 | } |
| 126 | 132 | ||
| 127 | /* Set up a system OpenBIOS NVRAM partition */ | 133 | /* Set up a system OpenBIOS NVRAM partition */ |