Commit 8f2ad0a3fc5e3569183d44bf1c7fcb95294be4c0

Authored by blueswir1
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)