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 | 40 | struct MacIONVRAMState { |
41 | 41 | target_phys_addr_t size; |
42 | 42 | int mem_index; |
43 | - uint8_t data[0x2000]; | |
43 | + uint8_t *data; | |
44 | 44 | }; |
45 | 45 | |
46 | 46 | /* Direct access to NVRAM */ |
... | ... | @@ -49,7 +49,7 @@ uint32_t macio_nvram_read (void *opaque, uint32_t addr) |
49 | 49 | MacIONVRAMState *s = opaque; |
50 | 50 | uint32_t ret; |
51 | 51 | |
52 | - if (addr < 0x2000) | |
52 | + if (addr < s->size) | |
53 | 53 | ret = s->data[addr]; |
54 | 54 | else |
55 | 55 | ret = -1; |
... | ... | @@ -63,7 +63,7 @@ void macio_nvram_write (void *opaque, uint32_t addr, uint32_t val) |
63 | 63 | MacIONVRAMState *s = opaque; |
64 | 64 | |
65 | 65 | NVR_DPRINTF("write addr %04x val %x\n", addr, val); |
66 | - if (addr < 0x2000) | |
66 | + if (addr < s->size) | |
67 | 67 | s->data[addr] = val; |
68 | 68 | } |
69 | 69 | |
... | ... | @@ -73,7 +73,7 @@ static void macio_nvram_writeb (void *opaque, |
73 | 73 | { |
74 | 74 | MacIONVRAMState *s = opaque; |
75 | 75 | |
76 | - addr = (addr >> 4) & 0x1fff; | |
76 | + addr = (addr >> 4) & (s->size - 1); | |
77 | 77 | s->data[addr] = value; |
78 | 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 | 83 | MacIONVRAMState *s = opaque; |
84 | 84 | uint32_t value; |
85 | 85 | |
86 | - addr = (addr >> 4) & 0x1fff; | |
86 | + addr = (addr >> 4) & (s->size - 1); | |
87 | 87 | value = s->data[addr]; |
88 | 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 | 109 | s = qemu_mallocz(sizeof(MacIONVRAMState)); |
110 | 110 | if (!s) |
111 | 111 | return NULL; |
112 | + s->data = qemu_mallocz(size); | |
113 | + if (!s->data) { | |
114 | + qemu_free(s); | |
115 | + return NULL; | |
116 | + } | |
112 | 117 | s->size = size; |
118 | + | |
113 | 119 | s->mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s); |
114 | 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 | 127 | MacIONVRAMState *s; |
122 | 128 | |
123 | 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 | 133 | /* Set up a system OpenBIOS NVRAM partition */ | ... | ... |