Commit 8f2ad0a3fc5e3569183d44bf1c7fcb95294be4c0
1 parent
20483400
Fix buffer overruns (reported by Julian Seward)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4752 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
29 additions
and
33 deletions
hw/eccmemctl.c
@@ -40,16 +40,16 @@ | @@ -40,16 +40,16 @@ | ||
40 | * SMC (version 0, implementation 2) SS-10SX and SS-20 | 40 | * SMC (version 0, implementation 2) SS-10SX and SS-20 |
41 | */ | 41 | */ |
42 | 42 | ||
43 | -/* Register offsets */ | ||
44 | -#define ECC_MER 0 /* Memory Enable Register */ | ||
45 | -#define ECC_MDR 4 /* Memory Delay Register */ | ||
46 | -#define ECC_MFSR 8 /* Memory Fault Status Register */ | ||
47 | -#define ECC_VCR 12 /* Video Configuration Register */ | ||
48 | -#define ECC_MFAR0 16 /* Memory Fault Address Register 0 */ | ||
49 | -#define ECC_MFAR1 20 /* Memory Fault Address Register 1 */ | ||
50 | -#define ECC_DR 24 /* Diagnostic Register */ | ||
51 | -#define ECC_ECR0 28 /* Event Count Register 0 */ | ||
52 | -#define ECC_ECR1 32 /* Event Count Register 1 */ | 43 | +/* Register indexes */ |
44 | +#define ECC_MER 0 /* Memory Enable Register */ | ||
45 | +#define ECC_MDR 1 /* Memory Delay Register */ | ||
46 | +#define ECC_MFSR 2 /* Memory Fault Status Register */ | ||
47 | +#define ECC_VCR 3 /* Video Configuration Register */ | ||
48 | +#define ECC_MFAR0 4 /* Memory Fault Address Register 0 */ | ||
49 | +#define ECC_MFAR1 5 /* Memory Fault Address Register 1 */ | ||
50 | +#define ECC_DR 6 /* Diagnostic Register */ | ||
51 | +#define ECC_ECR0 7 /* Event Count Register 0 */ | ||
52 | +#define ECC_ECR1 8 /* Event Count Register 1 */ | ||
53 | 53 | ||
54 | /* ECC fault control register */ | 54 | /* ECC fault control register */ |
55 | #define ECC_MER_EE 0x00000001 /* Enable ECC checking */ | 55 | #define ECC_MER_EE 0x00000001 /* Enable ECC checking */ |
@@ -129,34 +129,34 @@ static void ecc_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) | @@ -129,34 +129,34 @@ static void ecc_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) | ||
129 | { | 129 | { |
130 | ECCState *s = opaque; | 130 | ECCState *s = opaque; |
131 | 131 | ||
132 | - switch (addr & ECC_ADDR_MASK) { | 132 | + switch ((addr & ECC_ADDR_MASK) >> 2) { |
133 | case ECC_MER: | 133 | case ECC_MER: |
134 | - s->regs[0] = (s->regs[0] & (ECC_MER_VER | ECC_MER_IMPL)) | | ||
135 | - (val & ~(ECC_MER_VER | ECC_MER_IMPL)); | 134 | + s->regs[ECC_MER] = (s->regs[ECC_MER] & (ECC_MER_VER | ECC_MER_IMPL)) | |
135 | + (val & ~(ECC_MER_VER | ECC_MER_IMPL)); | ||
136 | DPRINTF("Write memory enable %08x\n", val); | 136 | DPRINTF("Write memory enable %08x\n", val); |
137 | break; | 137 | break; |
138 | case ECC_MDR: | 138 | case ECC_MDR: |
139 | - s->regs[1] = val & ECC_MDR_MASK; | 139 | + s->regs[ECC_MDR] = val & ECC_MDR_MASK; |
140 | DPRINTF("Write memory delay %08x\n", val); | 140 | DPRINTF("Write memory delay %08x\n", val); |
141 | break; | 141 | break; |
142 | case ECC_MFSR: | 142 | case ECC_MFSR: |
143 | - s->regs[2] = val; | 143 | + s->regs[ECC_MFSR] = val; |
144 | DPRINTF("Write memory fault status %08x\n", val); | 144 | DPRINTF("Write memory fault status %08x\n", val); |
145 | break; | 145 | break; |
146 | case ECC_VCR: | 146 | case ECC_VCR: |
147 | - s->regs[3] = val; | 147 | + s->regs[ECC_VCR] = val; |
148 | DPRINTF("Write slot configuration %08x\n", val); | 148 | DPRINTF("Write slot configuration %08x\n", val); |
149 | break; | 149 | break; |
150 | case ECC_DR: | 150 | case ECC_DR: |
151 | - s->regs[6] = val; | 151 | + s->regs[ECC_DR] = val; |
152 | DPRINTF("Write diagnosiic %08x\n", val); | 152 | DPRINTF("Write diagnosiic %08x\n", val); |
153 | break; | 153 | break; |
154 | case ECC_ECR0: | 154 | case ECC_ECR0: |
155 | - s->regs[7] = val; | 155 | + s->regs[ECC_ECR0] = val; |
156 | DPRINTF("Write event count 1 %08x\n", val); | 156 | DPRINTF("Write event count 1 %08x\n", val); |
157 | break; | 157 | break; |
158 | case ECC_ECR1: | 158 | case ECC_ECR1: |
159 | - s->regs[7] = val; | 159 | + s->regs[ECC_ECR0] = val; |
160 | DPRINTF("Write event count 2 %08x\n", val); | 160 | DPRINTF("Write event count 2 %08x\n", val); |
161 | break; | 161 | break; |
162 | } | 162 | } |
@@ -167,41 +167,41 @@ static uint32_t ecc_mem_readl(void *opaque, target_phys_addr_t addr) | @@ -167,41 +167,41 @@ static uint32_t ecc_mem_readl(void *opaque, target_phys_addr_t addr) | ||
167 | ECCState *s = opaque; | 167 | ECCState *s = opaque; |
168 | uint32_t ret = 0; | 168 | uint32_t ret = 0; |
169 | 169 | ||
170 | - switch (addr & ECC_ADDR_MASK) { | 170 | + switch ((addr & ECC_ADDR_MASK) >> 2) { |
171 | case ECC_MER: | 171 | case ECC_MER: |
172 | - ret = s->regs[0]; | 172 | + ret = s->regs[ECC_MER]; |
173 | DPRINTF("Read memory enable %08x\n", ret); | 173 | DPRINTF("Read memory enable %08x\n", ret); |
174 | break; | 174 | break; |
175 | case ECC_MDR: | 175 | case ECC_MDR: |
176 | - ret = s->regs[1]; | 176 | + ret = s->regs[ECC_MDR]; |
177 | DPRINTF("Read memory delay %08x\n", ret); | 177 | DPRINTF("Read memory delay %08x\n", ret); |
178 | break; | 178 | break; |
179 | case ECC_MFSR: | 179 | case ECC_MFSR: |
180 | - ret = s->regs[2]; | 180 | + ret = s->regs[ECC_MFSR]; |
181 | DPRINTF("Read memory fault status %08x\n", ret); | 181 | DPRINTF("Read memory fault status %08x\n", ret); |
182 | break; | 182 | break; |
183 | case ECC_VCR: | 183 | case ECC_VCR: |
184 | - ret = s->regs[3]; | 184 | + ret = s->regs[ECC_VCR]; |
185 | DPRINTF("Read slot configuration %08x\n", ret); | 185 | DPRINTF("Read slot configuration %08x\n", ret); |
186 | break; | 186 | break; |
187 | case ECC_MFAR0: | 187 | case ECC_MFAR0: |
188 | - ret = s->regs[4]; | 188 | + ret = s->regs[ECC_MFAR0]; |
189 | DPRINTF("Read memory fault address 0 %08x\n", ret); | 189 | DPRINTF("Read memory fault address 0 %08x\n", ret); |
190 | break; | 190 | break; |
191 | case ECC_MFAR1: | 191 | case ECC_MFAR1: |
192 | - ret = s->regs[5]; | 192 | + ret = s->regs[ECC_MFAR1]; |
193 | DPRINTF("Read memory fault address 1 %08x\n", ret); | 193 | DPRINTF("Read memory fault address 1 %08x\n", ret); |
194 | break; | 194 | break; |
195 | case ECC_DR: | 195 | case ECC_DR: |
196 | - ret = s->regs[6]; | 196 | + ret = s->regs[ECC_DR]; |
197 | DPRINTF("Read diagnostic %08x\n", ret); | 197 | DPRINTF("Read diagnostic %08x\n", ret); |
198 | break; | 198 | break; |
199 | case ECC_ECR0: | 199 | case ECC_ECR0: |
200 | - ret = s->regs[7]; | 200 | + ret = s->regs[ECC_ECR0]; |
201 | DPRINTF("Read event count 1 %08x\n", ret); | 201 | DPRINTF("Read event count 1 %08x\n", ret); |
202 | break; | 202 | break; |
203 | case ECC_ECR1: | 203 | case ECC_ECR1: |
204 | - ret = s->regs[7]; | 204 | + ret = s->regs[ECC_ECR0]; |
205 | DPRINTF("Read event count 2 %08x\n", ret); | 205 | DPRINTF("Read event count 2 %08x\n", ret); |
206 | break; | 206 | break; |
207 | } | 207 | } |
@@ -281,7 +281,6 @@ static void ecc_save(QEMUFile *f, void *opaque) | @@ -281,7 +281,6 @@ static void ecc_save(QEMUFile *f, void *opaque) | ||
281 | static void ecc_reset(void *opaque) | 281 | static void ecc_reset(void *opaque) |
282 | { | 282 | { |
283 | ECCState *s = opaque; | 283 | ECCState *s = opaque; |
284 | - int i; | ||
285 | 284 | ||
286 | s->regs[ECC_MER] &= (ECC_MER_VER | ECC_MER_IMPL); | 285 | s->regs[ECC_MER] &= (ECC_MER_VER | ECC_MER_IMPL); |
287 | s->regs[ECC_MER] |= ECC_MER_MRR; | 286 | s->regs[ECC_MER] |= ECC_MER_MRR; |
@@ -293,9 +292,6 @@ static void ecc_reset(void *opaque) | @@ -293,9 +292,6 @@ static void ecc_reset(void *opaque) | ||
293 | s->regs[ECC_DR] = 0; | 292 | s->regs[ECC_DR] = 0; |
294 | s->regs[ECC_ECR0] = 0; | 293 | s->regs[ECC_ECR0] = 0; |
295 | s->regs[ECC_ECR1] = 0; | 294 | s->regs[ECC_ECR1] = 0; |
296 | - | ||
297 | - for (i = 1; i < ECC_NREGS; i++) | ||
298 | - s->regs[i] = 0; | ||
299 | } | 295 | } |
300 | 296 | ||
301 | void * ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version) | 297 | void * ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version) |