X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=util%2Fnvramtool%2Fcli%2Fnvramtool.c;h=11a1a702afcf1a754330c9153efcd5e9986ee3bc;hb=ccf28ba9cb562e74ce17439d88dcc5a10aefeef6;hp=e3e7e8875ad0cf097d7060cf229b98d2be5a99b7;hpb=c6d2b09f7673a33e75a4f5a38368e9684c2ecc79;p=coreboot.git diff --git a/util/nvramtool/cli/nvramtool.c b/util/nvramtool/cli/nvramtool.c index e3e7e8875..11a1a702a 100644 --- a/util/nvramtool/cli/nvramtool.c +++ b/util/nvramtool/cli/nvramtool.c @@ -36,7 +36,7 @@ #include "opts.h" #include "lbtable.h" #include "layout.h" -#include "layout_file.h" +#include "accessors/layout-text.h" #include "input_file.h" #include "cmos_ops.h" #include "cmos_lowlevel.h" @@ -102,13 +102,9 @@ int main(int argc, char *argv[]) parse_nvramtool_args(argc, argv); - if (nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_LAYOUT_FILE].found) { - set_layout_filename(nvramtool_op_modifiers - [NVRAMTOOL_MOD_USE_CMOS_LAYOUT_FILE].param); - fn = get_layout_from_file; - } else if (nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_OPT_TABLE].found) { - fn = get_layout_from_cmos_table; - } else if (nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CBFS_FILE].found) { + /* If we should operate on a CBFS file default to reading the layout + * and CMOS contents from it. */ + if (nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CBFS_FILE].found) { open_cbfs(nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CBFS_FILE].param); if (!nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_FILE].found) { cmos_default = cbfs_find_file("cmos.default", CBFS_COMPONENT_CMOS_DEFAULT, NULL); @@ -117,36 +113,55 @@ int main(int argc, char *argv[]) exit(1); } } + fn = get_layout_from_cbfs_file; + } + + /* If the user wants to use a specific layout file or explicitly use + * the coreboot option table allow him to override previous settings. */ + if (nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_LAYOUT_FILE].found) { + set_layout_filename(nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_LAYOUT_FILE].param); + fn = get_layout_from_file; + } else if (nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_OPT_TABLE].found) { + fn = get_layout_from_cmos_table; } + + /* Allow the user to use a file for the CMOS contents, possibly + * overriding a previously opened "cmos.default" file from the CBFS. */ if (nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_FILE].found) { - int fd; struct stat fd_stat; - if ((fd = open(nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_FILE].param, O_RDWR | O_CREAT, 0666)) < 0) { + int fd; + + if ((fd = open(nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_FILE].param, O_RDWR | O_CREAT, 0666)) < 0) { fprintf(stderr, "Couldn't open '%s'\n", nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_FILE].param); exit(1); } + if (fstat(fd, &fd_stat) == -1) { fprintf(stderr, "Couldn't stat '%s'\n", nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_FILE].param); exit(1); } + if (fd_stat.st_size < 128) { lseek(fd, 127, SEEK_SET); write(fd, "\0", 1); fsync(fd); } + cmos_default = mmap(NULL, 128, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (cmos_default == MAP_FAILED) { fprintf(stderr, "Couldn't map '%s'\n", nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_FILE].param); exit(1); } } + + /* Switch to memory based CMOS access. */ if (cmos_default) { select_hal(HAL_MEMORY, cmos_default); - fn = get_layout_from_cbfs_file; } register_cmos_layout_get_fn(fn); - op_fns[nvramtool_op.op] (); + op_fns[nvramtool_op.op](); + return 0; } @@ -785,7 +800,7 @@ static int list_cmos_entry(const cmos_entry_t * e, int show_name) case CMOS_ENTRY_STRING: w = (char *)(unsigned long)value; while (*w) { - if(!isprint(*w)) { + if(!isprint((int)(unsigned char)*w)) { if (show_name) printf("# Bad value -> %s\n", e->name); else @@ -831,7 +846,7 @@ static uint16_t convert_checksum_value(const char value[]) uint16_t result; int negative; - for (p = value; isspace(*p); p++) ; + for (p = value; isspace((int)(unsigned char)*p); p++) ; negative = (*p == '-'); n = strtoul(value, (char **)&p, 0);