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 | 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 | 54 | /* ECC fault control register */ |
| 55 | 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 | 129 | { |
| 130 | 130 | ECCState *s = opaque; |
| 131 | 131 | |
| 132 | - switch (addr & ECC_ADDR_MASK) { | |
| 132 | + switch ((addr & ECC_ADDR_MASK) >> 2) { | |
| 133 | 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 | 136 | DPRINTF("Write memory enable %08x\n", val); |
| 137 | 137 | break; |
| 138 | 138 | case ECC_MDR: |
| 139 | - s->regs[1] = val & ECC_MDR_MASK; | |
| 139 | + s->regs[ECC_MDR] = val & ECC_MDR_MASK; | |
| 140 | 140 | DPRINTF("Write memory delay %08x\n", val); |
| 141 | 141 | break; |
| 142 | 142 | case ECC_MFSR: |
| 143 | - s->regs[2] = val; | |
| 143 | + s->regs[ECC_MFSR] = val; | |
| 144 | 144 | DPRINTF("Write memory fault status %08x\n", val); |
| 145 | 145 | break; |
| 146 | 146 | case ECC_VCR: |
| 147 | - s->regs[3] = val; | |
| 147 | + s->regs[ECC_VCR] = val; | |
| 148 | 148 | DPRINTF("Write slot configuration %08x\n", val); |
| 149 | 149 | break; |
| 150 | 150 | case ECC_DR: |
| 151 | - s->regs[6] = val; | |
| 151 | + s->regs[ECC_DR] = val; | |
| 152 | 152 | DPRINTF("Write diagnosiic %08x\n", val); |
| 153 | 153 | break; |
| 154 | 154 | case ECC_ECR0: |
| 155 | - s->regs[7] = val; | |
| 155 | + s->regs[ECC_ECR0] = val; | |
| 156 | 156 | DPRINTF("Write event count 1 %08x\n", val); |
| 157 | 157 | break; |
| 158 | 158 | case ECC_ECR1: |
| 159 | - s->regs[7] = val; | |
| 159 | + s->regs[ECC_ECR0] = val; | |
| 160 | 160 | DPRINTF("Write event count 2 %08x\n", val); |
| 161 | 161 | break; |
| 162 | 162 | } |
| ... | ... | @@ -167,41 +167,41 @@ static uint32_t ecc_mem_readl(void *opaque, target_phys_addr_t addr) |
| 167 | 167 | ECCState *s = opaque; |
| 168 | 168 | uint32_t ret = 0; |
| 169 | 169 | |
| 170 | - switch (addr & ECC_ADDR_MASK) { | |
| 170 | + switch ((addr & ECC_ADDR_MASK) >> 2) { | |
| 171 | 171 | case ECC_MER: |
| 172 | - ret = s->regs[0]; | |
| 172 | + ret = s->regs[ECC_MER]; | |
| 173 | 173 | DPRINTF("Read memory enable %08x\n", ret); |
| 174 | 174 | break; |
| 175 | 175 | case ECC_MDR: |
| 176 | - ret = s->regs[1]; | |
| 176 | + ret = s->regs[ECC_MDR]; | |
| 177 | 177 | DPRINTF("Read memory delay %08x\n", ret); |
| 178 | 178 | break; |
| 179 | 179 | case ECC_MFSR: |
| 180 | - ret = s->regs[2]; | |
| 180 | + ret = s->regs[ECC_MFSR]; | |
| 181 | 181 | DPRINTF("Read memory fault status %08x\n", ret); |
| 182 | 182 | break; |
| 183 | 183 | case ECC_VCR: |
| 184 | - ret = s->regs[3]; | |
| 184 | + ret = s->regs[ECC_VCR]; | |
| 185 | 185 | DPRINTF("Read slot configuration %08x\n", ret); |
| 186 | 186 | break; |
| 187 | 187 | case ECC_MFAR0: |
| 188 | - ret = s->regs[4]; | |
| 188 | + ret = s->regs[ECC_MFAR0]; | |
| 189 | 189 | DPRINTF("Read memory fault address 0 %08x\n", ret); |
| 190 | 190 | break; |
| 191 | 191 | case ECC_MFAR1: |
| 192 | - ret = s->regs[5]; | |
| 192 | + ret = s->regs[ECC_MFAR1]; | |
| 193 | 193 | DPRINTF("Read memory fault address 1 %08x\n", ret); |
| 194 | 194 | break; |
| 195 | 195 | case ECC_DR: |
| 196 | - ret = s->regs[6]; | |
| 196 | + ret = s->regs[ECC_DR]; | |
| 197 | 197 | DPRINTF("Read diagnostic %08x\n", ret); |
| 198 | 198 | break; |
| 199 | 199 | case ECC_ECR0: |
| 200 | - ret = s->regs[7]; | |
| 200 | + ret = s->regs[ECC_ECR0]; | |
| 201 | 201 | DPRINTF("Read event count 1 %08x\n", ret); |
| 202 | 202 | break; |
| 203 | 203 | case ECC_ECR1: |
| 204 | - ret = s->regs[7]; | |
| 204 | + ret = s->regs[ECC_ECR0]; | |
| 205 | 205 | DPRINTF("Read event count 2 %08x\n", ret); |
| 206 | 206 | break; |
| 207 | 207 | } |
| ... | ... | @@ -281,7 +281,6 @@ static void ecc_save(QEMUFile *f, void *opaque) |
| 281 | 281 | static void ecc_reset(void *opaque) |
| 282 | 282 | { |
| 283 | 283 | ECCState *s = opaque; |
| 284 | - int i; | |
| 285 | 284 | |
| 286 | 285 | s->regs[ECC_MER] &= (ECC_MER_VER | ECC_MER_IMPL); |
| 287 | 286 | s->regs[ECC_MER] |= ECC_MER_MRR; |
| ... | ... | @@ -293,9 +292,6 @@ static void ecc_reset(void *opaque) |
| 293 | 292 | s->regs[ECC_DR] = 0; |
| 294 | 293 | s->regs[ECC_ECR0] = 0; |
| 295 | 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 | 297 | void * ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version) | ... | ... |