Commit ccf8c6c7 authored by Peter Stuge's avatar Peter Stuge
Browse files

Check all mmap() calls and print helpful Linux error message


Corresponding to flashrom svn r386 and coreboot v2 svn r3890.
Signed-off-by: default avatarPeter Stuge <peter@stuge.se>
Acked-by: default avatarPeter Stuge <peter@stuge.se>
parent 72c9668b
......@@ -191,6 +191,7 @@ int coreboot_init(void)
0x00000000);
if (low_1MB == MAP_FAILED) {
perror("Can't mmap memory using " MEM_DEV);
mmap_errmsg();
exit(-2);
}
lb_table = 0;
......
......@@ -220,6 +220,7 @@ static int enable_flash_vt8237s_spi(struct pci_dev *dev, const char *name)
if (spibar == MAP_FAILED) {
perror("Can't mmap memory using " MEM_DEV);
mmap_errmsg();
exit(1);
}
......@@ -255,6 +256,7 @@ static int enable_flash_ich_dc_spi(struct pci_dev *dev, const char *name,
(off_t) tmp);
if (rcrb == MAP_FAILED) {
perror("Can't mmap memory using " MEM_DEV);
mmap_errmsg();
exit(1);
}
......@@ -681,6 +683,7 @@ static int enable_flash_sb600(struct pci_dev *dev, const char *name)
fd_mem, (off_t)tmp);
if (sb600_spibar == MAP_FAILED) {
perror("Can't mmap memory using " MEM_DEV);
mmap_errmsg();
exit(1);
}
sb600_spibar += low_bits;
......@@ -837,6 +840,7 @@ static int get_flashbase_sc520(struct pci_dev *dev, const char *name)
if (mmcr == MAP_FAILED) {
perror("Can't mmap Elan SC520 specific registers using " MEM_DEV);
mmap_errmsg();
exit(1);
}
......
......@@ -480,6 +480,7 @@ extern int verbose;
#define printf_debug(x...) { if (verbose) printf(x); }
/* flashrom.c */
void mmap_errmsg();
int map_flash_registers(struct flashchip *flash);
/* layout.c */
......
......@@ -84,6 +84,17 @@ struct pci_dev *pci_card_find(uint16_t vendor, uint16_t device,
return NULL;
}
void mmap_errmsg()
{
if (EINVAL == errno) {
fprintf(stderr, "In Linux this error can be caused by the CONFIG_NONPROMISC_DEVMEM (<2.6.27),\n");
fprintf(stderr, "CONFIG_STRICT_DEVMEM (>=2.6.27) and CONFIG_X86_PAT kernel options.\n");
fprintf(stderr, "Please check if either is enabled in your kernel before reporting a failure.\n");
fprintf(stderr, "You can override CONFIG_X86_PAT at boot with the nopat kernel parameter but\n");
fprintf(stderr, "disabling the other option unfortunately requires a kernel recompile. Sorry!\n");
}
}
int map_flash_registers(struct flashchip *flash)
{
volatile uint8_t *registers;
......@@ -94,6 +105,7 @@ int map_flash_registers(struct flashchip *flash)
if (registers == MAP_FAILED) {
perror("Can't mmap registers using " MEM_DEV);
mmap_errmsg();
exit(1);
}
flash->virtual_registers = registers;
......@@ -139,13 +151,7 @@ struct flashchip *probe_flash(struct flashchip *first_flash, int force)
fd_mem, (off_t) base);
if (bios == MAP_FAILED) {
perror("Can't mmap memory using " MEM_DEV);
if (EINVAL == errno) {
fprintf(stderr, "In Linux this error can be caused by the CONFIG_NONPROMISC_DEVMEM (<2.6.27),\n");
fprintf(stderr, "CONFIG_STRICT_DEVMEM (>=2.6.27) and CONFIG_X86_PAT kernel options.\n");
fprintf(stderr, "Please check if either is enabled in your kernel before reporting a failure.\n");
fprintf(stderr, "You can override CONFIG_X86_PAT at boot with the nopat kernel parameter but\n");
fprintf(stderr, "disabling the other option unfortunately requires a kernel recompile. Sorry!\n");
}
mmap_errmsg();
exit(1);
}
flash->virtual_memory = bios;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment