Skip to content

Commit a249758

Browse files
committed
All Flash chips: Handle file errors more gracefully. [skip ci]
1 parent eb37950 commit a249758

5 files changed

Lines changed: 150 additions & 91 deletions

File tree

‎src/mem/amd_flash.c‎

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -520,13 +520,16 @@ am29f016d_init(const device_t *info)
520520

521521
am29f016d_add_mappings(dev);
522522

523-
FILE *fp = nvr_fopen(dev->flash_path, "rb");
524-
if (fp) {
525-
if (!dump_missing && (fread(&(dev->array[0x00000]), 1, 0x00200000, fp) != 0x00200000))
526-
pclog("Less than %i bytes read from the Am29F016D Flash ROM file\n", dev->size);
527-
fclose(fp);
523+
if (strlen(dev->flash_path) > 0) {
524+
FILE *fp = nvr_fopen(dev->flash_path, "rb");
525+
if (fp != NULL) {
526+
if (!dump_missing)
527+
(void) !fread(&(dev->array[0x00000]), 1, 0x00200000, fp);
528+
fclose(fp);
529+
} else if (!dump_missing)
530+
dev->dirty = 1; /* It is by definition dirty on creation. */
528531
} else
529-
dev->dirty = 1; /* It is by definition dirty on creation. */
532+
fatal("Attempting to open the Flash file for reading with an empty invalid name\n");
530533

531534
return dev;
532535
}
@@ -537,11 +540,16 @@ am29f016d_close(void *priv)
537540
am29f016d_t *dev = (am29f016d_t *) priv;
538541

539542
if (dev->dirty) {
540-
FILE *fp = nvr_fopen(dev->flash_path, "wb");
541-
if (!dump_missing && (fp != NULL)) {
542-
fwrite(&(dev->array[0x00000]), 0x00200000, 1, fp);
543-
fclose(fp);
544-
}
543+
if (strlen(dev->flash_path) > 0) {
544+
FILE *fp = nvr_fopen(dev->flash_path, "wb");
545+
if (fp != NULL) {
546+
if (!dump_missing)
547+
fwrite(&(dev->array[0x00000]), 0x00200000, 1, fp);
548+
fclose(fp);
549+
} else if (!dump_missing)
550+
warning("Unable to open %s for writing, please make sure your NVR folder is writable\n", dev->flash_path);
551+
} else
552+
fatal("Attempting to open the Flash file for writing with an empty invalid name\n");
545553
}
546554

547555
free(dev);

‎src/mem/catalyst_flash.c‎

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ enum {
5757
typedef struct flash_t {
5858
uint8_t command;
5959
uint8_t is_amd;
60+
uint8_t dirty;
6061
uint8_t pad;
61-
uint8_t pad0;
6262
uint8_t *array;
6363

6464
mem_mapping_t mapping;
@@ -143,12 +143,15 @@ flash_write(uint32_t addr, uint8_t val, void *priv)
143143

144144
switch (dev->command) {
145145
case CMD_ERASE:
146-
if (val == CMD_ERASE_CONFIRM)
146+
if (val == CMD_ERASE_CONFIRM) {
147147
memset(dev->array, 0xff, biosmask + 1);
148+
dev->dirty = 1;
149+
}
148150
break;
149151

150152
case CMD_PROGRAM:
151153
dev->array[addr] = val;
154+
dev->dirty = 1;
152155
break;
153156

154157
default:
@@ -218,11 +221,16 @@ catalyst_flash_init(UNUSED(const device_t *info))
218221
dev->command = CMD_RESET;
219222
dev->is_amd = info->local;
220223

221-
fp = nvr_fopen(flash_path, "rb");
222-
if (!dump_missing && (fp != NULL)) {
223-
(void) !fread(dev->array, 0x20000, 1, fp);
224-
fclose(fp);
225-
}
224+
if (strlen(flash_path) > 0) {
225+
fp = nvr_fopen(flash_path, "rb");
226+
if (fp != NULL) {
227+
if (!dump_missing)
228+
(void) !fread(dev->array, 0x20000, 1, fp);
229+
fclose(fp);
230+
} else if (!dump_missing)
231+
dev->dirty = 1;
232+
} else
233+
fatal("Attempting to open the Flash file for reading with an empty invalid name\n");
226234

227235
return dev;
228236
}
@@ -233,10 +241,18 @@ catalyst_flash_close(void *priv)
233241
FILE *fp;
234242
flash_t *dev = (flash_t *) priv;
235243

236-
fp = nvr_fopen(flash_path, "wb");
237-
if (!dump_missing)
238-
fwrite(dev->array, 0x20000, 1, fp);
239-
fclose(fp);
244+
if (dev->dirty) {
245+
if (strlen(flash_path) > 0) {
246+
fp = nvr_fopen(flash_path, "wb");
247+
if (fp != NULL) {
248+
if (!dump_missing)
249+
fwrite(dev->array, 0x20000, 1, fp);
250+
fclose(fp);
251+
} else if (!dump_missing)
252+
warning("Unable to open %s for writing, please make sure your NVR folder is writable\n", flash_path);
253+
} else
254+
fatal("Attempting to open the Flash file for writing with an empty invalid name\n");
255+
}
240256

241257
free(dev->array);
242258
dev->array = NULL;

‎src/mem/intel_flash.c‎

Lines changed: 54 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ enum {
6060
typedef struct flash_t {
6161
uint8_t command;
6262
uint8_t status;
63-
uint8_t pad;
63+
uint8_t dirty;
6464
uint8_t flags;
6565
uint8_t *array;
6666

@@ -180,8 +180,10 @@ flash_write(uint32_t addr, uint8_t val, void *priv)
180180
case CMD_ERASE_SETUP:
181181
if (val == CMD_ERASE_CONFIRM) {
182182
for (uint8_t i = 0; i < 6; i++) {
183-
if ((i == dev->program_addr) && (addr >= dev->block_start[i]) && (addr <= dev->block_end[i]))
183+
if ((i == dev->program_addr) && (addr >= dev->block_start[i]) && (addr <= dev->block_end[i])) {
184184
memset(&(dev->array[dev->block_start[i]]), 0xff, dev->block_len[i]);
185+
dev->dirty = 1;
186+
}
185187
}
186188

187189
dev->status = 0x80;
@@ -191,8 +193,10 @@ flash_write(uint32_t addr, uint8_t val, void *priv)
191193

192194
case CMD_PROGRAM_SETUP:
193195
case CMD_PROGRAM_SETUP_ALT:
194-
if (((addr & bb_mask) != (dev->block_start[6] & bb_mask)) && (addr == dev->program_addr))
196+
if (((addr & bb_mask) != (dev->block_start[6] & bb_mask)) && (addr == dev->program_addr)) {
195197
dev->array[addr] = val;
198+
dev->dirty = 1;
199+
}
196200
dev->command = CMD_READ_STATUS;
197201
dev->status = 0x80;
198202
break;
@@ -238,8 +242,10 @@ flash_writew(uint32_t addr, uint16_t val, void *priv)
238242
case CMD_ERASE_SETUP:
239243
if (val == CMD_ERASE_CONFIRM) {
240244
for (uint8_t i = 0; i < 6; i++) {
241-
if ((i == dev->program_addr) && (addr >= dev->block_start[i]) && (addr <= dev->block_end[i]))
245+
if ((i == dev->program_addr) && (addr >= dev->block_start[i]) && (addr <= dev->block_end[i])) {
242246
memset(&(dev->array[dev->block_start[i]]), 0xff, dev->block_len[i]);
247+
dev->dirty = 1;
248+
}
243249
}
244250

245251
dev->status = 0x80;
@@ -263,8 +269,10 @@ flash_writew(uint32_t addr, uint16_t val, void *priv)
263269
break;
264270
case CMD_ERASE_SETUP:
265271
for (uint8_t i = 0; i < 7; i++) {
266-
if ((addr >= dev->block_start[i]) && (addr <= dev->block_end[i]))
272+
if ((addr >= dev->block_start[i]) && (addr <= dev->block_end[i])) {
267273
dev->program_addr = i;
274+
dev->dirty = 1;
275+
}
268276
}
269277
break;
270278
case CMD_PROGRAM_SETUP:
@@ -529,44 +537,57 @@ intel_flash_init(const device_t *info)
529537
dev->command = CMD_READ_ARRAY;
530538
dev->status = 0;
531539

532-
fp = nvr_fopen(flash_path, "rb");
533-
if (!dump_missing && (fp != NULL)) {
534-
(void) !fread(&(dev->array[dev->block_start[BLOCK_MAIN1]]), dev->block_len[BLOCK_MAIN1], 1, fp);
535-
if (dev->block_len[BLOCK_MAIN2])
536-
(void) !fread(&(dev->array[dev->block_start[BLOCK_MAIN2]]), dev->block_len[BLOCK_MAIN2], 1, fp);
537-
if (dev->block_len[BLOCK_MAIN3])
538-
(void) !fread(&(dev->array[dev->block_start[BLOCK_MAIN3]]), dev->block_len[BLOCK_MAIN3], 1, fp);
539-
if (dev->block_len[BLOCK_MAIN4])
540-
(void) !fread(&(dev->array[dev->block_start[BLOCK_MAIN4]]), dev->block_len[BLOCK_MAIN4], 1, fp);
541-
542-
(void) !fread(&(dev->array[dev->block_start[BLOCK_DATA1]]), dev->block_len[BLOCK_DATA1], 1, fp);
543-
(void) !fread(&(dev->array[dev->block_start[BLOCK_DATA2]]), dev->block_len[BLOCK_DATA2], 1, fp);
544-
fclose(fp);
545-
}
540+
if (strlen(flash_path) != 0) {
541+
fp = nvr_fopen(flash_path, "rb");
542+
if (fp != NULL) {
543+
if (!dump_missing) {
544+
(void) !fread(&(dev->array[dev->block_start[BLOCK_MAIN1]]), dev->block_len[BLOCK_MAIN1], 1, fp);
545+
if (dev->block_len[BLOCK_MAIN2])
546+
(void) !fread(&(dev->array[dev->block_start[BLOCK_MAIN2]]), dev->block_len[BLOCK_MAIN2], 1, fp);
547+
if (dev->block_len[BLOCK_MAIN3])
548+
(void) !fread(&(dev->array[dev->block_start[BLOCK_MAIN3]]), dev->block_len[BLOCK_MAIN3], 1, fp);
549+
if (dev->block_len[BLOCK_MAIN4])
550+
(void) !fread(&(dev->array[dev->block_start[BLOCK_MAIN4]]), dev->block_len[BLOCK_MAIN4], 1, fp);
551+
552+
(void) !fread(&(dev->array[dev->block_start[BLOCK_DATA1]]), dev->block_len[BLOCK_DATA1], 1, fp);
553+
(void) !fread(&(dev->array[dev->block_start[BLOCK_DATA2]]), dev->block_len[BLOCK_DATA2], 1, fp);
554+
}
555+
fclose(fp);
556+
} else if (!dump_missing)
557+
dev->dirty = 1;
558+
} else
559+
fatal("Attempting to open the Flash file for reading with an empty invalid name\n");
546560

547561
return dev;
548562
}
549563

550564
static void
551565
intel_flash_close(void *priv)
552566
{
553-
FILE *fp;
554567
flash_t *dev = (flash_t *) priv;
555568

556-
fp = nvr_fopen(flash_path, "wb");
557-
if (!dump_missing) {
558-
fwrite(&(dev->array[dev->block_start[BLOCK_MAIN1]]), dev->block_len[BLOCK_MAIN1], 1, fp);
559-
if (dev->block_len[BLOCK_MAIN2])
560-
fwrite(&(dev->array[dev->block_start[BLOCK_MAIN2]]), dev->block_len[BLOCK_MAIN2], 1, fp);
561-
if (dev->block_len[BLOCK_MAIN3])
562-
fwrite(&(dev->array[dev->block_start[BLOCK_MAIN3]]), dev->block_len[BLOCK_MAIN3], 1, fp);
563-
if (dev->block_len[BLOCK_MAIN4])
564-
fwrite(&(dev->array[dev->block_start[BLOCK_MAIN4]]), dev->block_len[BLOCK_MAIN4], 1, fp);
565-
566-
fwrite(&(dev->array[dev->block_start[BLOCK_DATA1]]), dev->block_len[BLOCK_DATA1], 1, fp);
567-
fwrite(&(dev->array[dev->block_start[BLOCK_DATA2]]), dev->block_len[BLOCK_DATA2], 1, fp);
569+
if (dev->dirty) {
570+
if (strlen(flash_path) > 0) {
571+
FILE *fp = nvr_fopen(flash_path, "wb");
572+
if (fp != NULL) {
573+
if (!dump_missing) {
574+
fwrite(&(dev->array[dev->block_start[BLOCK_MAIN1]]), dev->block_len[BLOCK_MAIN1], 1, fp);
575+
if (dev->block_len[BLOCK_MAIN2])
576+
fwrite(&(dev->array[dev->block_start[BLOCK_MAIN2]]), dev->block_len[BLOCK_MAIN2], 1, fp);
577+
if (dev->block_len[BLOCK_MAIN3])
578+
fwrite(&(dev->array[dev->block_start[BLOCK_MAIN3]]), dev->block_len[BLOCK_MAIN3], 1, fp);
579+
if (dev->block_len[BLOCK_MAIN4])
580+
fwrite(&(dev->array[dev->block_start[BLOCK_MAIN4]]), dev->block_len[BLOCK_MAIN4], 1, fp);
581+
582+
fwrite(&(dev->array[dev->block_start[BLOCK_DATA1]]), dev->block_len[BLOCK_DATA1], 1, fp);
583+
fwrite(&(dev->array[dev->block_start[BLOCK_DATA2]]), dev->block_len[BLOCK_DATA2], 1, fp);
584+
}
585+
fclose(fp);
586+
} else if (!dump_missing)
587+
warning("Unable to open %s for writing, please make sure your NVR folder is writable\n", flash_path);
588+
} else
589+
fatal("Attempting to open the Flash file for writing with an empty invalid name\n");
568590
}
569-
fclose(fp);
570591

571592
free(dev->array);
572593
dev->array = NULL;

0 commit comments

Comments
 (0)