Patchwork nvramtool: Support CMOS data from non-CBFS file, too

login
register
about
Submitter Patrick Georgi
Date 2011-01-20 13:38:29
Message ID <1295530709.10580.28.camel@linux-0a8x.site>
Download mbox | patch
Permalink /patch/2543/
State Accepted
Headers show

Comments

Patrick Georgi - 2011-01-20 13:38:29
This patch adds a -D option to tell nvramtool to work on data in a plain
CMOS image (as extracted by the nvramtool dump option, for example).

Signed-off-by: Patrick Georgi <patrick.georgi@secunet.com>
Stefan Reinauer - 2011-01-20 18:46:00
* Georgi, Patrick <Patrick.Georgi@secunet.com> [110120 14:38]:
> This patch adds a -D option to tell nvramtool to work on data in a plain
> CMOS image (as extracted by the nvramtool dump option, for example).
> 
> Signed-off-by: Patrick Georgi <patrick.georgi@secunet.com>



Nice work!

Acked-by: Stefan Reinauer <stepan@coreboot.org>

Patch

Index: coreboot/util/nvramtool/nvramtool.c

===================================================================
--- coreboot.orig/util/nvramtool/nvramtool.c

+++ coreboot/util/nvramtool/nvramtool.c

@@ -28,6 +28,10 @@ 

  *  51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 \*****************************************************************************/
 
+#include <fcntl.h>

+#include <stdio.h>

+#include <stdlib.h>

+#include <sys/mman.h>

 #include "common.h"
 #include "opts.h"
 #include "lbtable.h"
@@ -93,6 +97,7 @@  static const hexdump_format_t cmos_dump_

  ****************************************************************************/
 int main(int argc, char *argv[])
 {
+	void *cmos_default = NULL;

 	cmos_layout_get_fn_t fn = get_layout_from_cmos_table;
 
 	parse_nvramtool_args(argc, argv);
@@ -105,12 +110,38 @@  int main(int argc, char *argv[])

 		fn = get_layout_from_cmos_table;
 	} else if (nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CBFS_FILE].found) {
 		open_cbfs(nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CBFS_FILE].param);
-		void *cmosdefault = cbfs_find_file("cmos.default", CBFS_COMPONENT_CMOS_DEFAULT, NULL);

-		if (cmosdefault == NULL) {

-			printf("Need a cmos.default in the CBFS image for now.\n");

+		if (!nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_FILE].found) {

+			cmos_default = cbfs_find_file("cmos.default", CBFS_COMPONENT_CMOS_DEFAULT, NULL);

+			if (cmos_default == NULL) {

+				fprintf(stderr, "Need a cmos.default in the CBFS image or separate cmos file (-D).\n");

+				exit(1);

+			}

+		}

+	}

+	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) {

+			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);
 		}
-		select_hal(HAL_MEMORY, cmosdefault);

+		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);

+		}

+	}

+	if (cmos_default) {

+		select_hal(HAL_MEMORY, cmos_default);

 		fn = get_layout_from_cbfs_file;
 	}
 
Index: coreboot/util/nvramtool/opts.c

===================================================================
--- coreboot.orig/util/nvramtool/opts.c

+++ coreboot/util/nvramtool/opts.c

@@ -41,7 +41,7 @@  static void register_op_modifier(nvramto

 static void resolve_op_modifiers(void);
 static void sanity_check_args(void);
 
-static const char getopt_string[] = "-ab:B:c::C:de:hil::np:r:tvw:xX:y:Y";

+static const char getopt_string[] = "-ab:B:c::C:dD:e:hil::np:r:tvw:xX:y:Y";

 
 /****************************************************************************
  * parse_nvramtool_args
@@ -89,6 +89,10 @@  void parse_nvramtool_args(int argc, char

 		case 'd':
 			register_op(&op_found, NVRAMTOOL_OP_LBTABLE_DUMP, NULL);
 			break;
+		case 'D':

+			register_op_modifier(NVRAMTOOL_MOD_USE_CMOS_FILE,

+					     optarg);

+			break;

 		case 'e':
 			register_op(&op_found, NVRAMTOOL_OP_SHOW_PARAM_VALUES,
 				    optarg);
Index: coreboot/util/nvramtool/opts.h

===================================================================
--- coreboot.orig/util/nvramtool/opts.h

+++ coreboot/util/nvramtool/opts.h

@@ -59,6 +59,7 @@  typedef struct {

 typedef enum { NVRAMTOOL_MOD_SHOW_VALUE_ONLY = 0,
 	NVRAMTOOL_MOD_USE_CMOS_LAYOUT_FILE,
 	NVRAMTOOL_MOD_USE_CBFS_FILE,
+	NVRAMTOOL_MOD_USE_CMOS_FILE,

 	NVRAMTOOL_MOD_USE_CMOS_OPT_TABLE,
 	NVRAMTOOL_NUM_OP_MODIFIERS	/* must always be last */
 } nvramtool_op_modifier_t;
Index: coreboot/util/nvramtool/common.c

===================================================================
--- coreboot.orig/util/nvramtool/common.c

+++ coreboot/util/nvramtool/common.c

@@ -82,7 +82,8 @@  void usage(FILE * outfile)

 		"LAYOUT_FILE.\n"
 		"       -t:             Use CMOS layout specified by CMOS option "
 		"table.\n"
-		"       -C CBFS_FILE:   Use CBFS file for layout and CMOS defaults.\n"

+		"       -C CBFS_FILE:   Use CBFS file for layout and CMOS data.\n"

+		"       -D CMOS_FILE:   Use CMOS file for CMOS data (overrides CMOS of -C).\n"

 		"       [-n] -r NAME:   Show parameter NAME.  If -n is given, "
 		"show value only.\n"
 		"       -e NAME:        Show all possible values for parameter "