Author: oxygene
Date: Fri Jan 21 08:29:40 2011
New Revision: 6286
URL: https://tracker.coreboot.org/trac/coreboot/changeset/6286

Log:
Add nvramtool -D option that allows taking cmos data from
a plain binary file. Overrides using cmos.default in CBFS
if both -C and -D are given.

Signed-off-by: Patrick Georgi <[email protected]>
Acked-by: Stefan Reinauer <[email protected]>

Modified:
   trunk/util/nvramtool/common.c
   trunk/util/nvramtool/nvramtool.c
   trunk/util/nvramtool/opts.c
   trunk/util/nvramtool/opts.h

Modified: trunk/util/nvramtool/common.c
==============================================================================
--- trunk/util/nvramtool/common.c       Fri Jan 21 08:24:08 2011        (r6285)
+++ trunk/util/nvramtool/common.c       Fri Jan 21 08:29:40 2011        (r6286)
@@ -82,7 +82,8 @@
                "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 "

Modified: trunk/util/nvramtool/nvramtool.c
==============================================================================
--- trunk/util/nvramtool/nvramtool.c    Fri Jan 21 08:24:08 2011        (r6285)
+++ trunk/util/nvramtool/nvramtool.c    Fri Jan 21 08:29:40 2011        (r6286)
@@ -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 @@
  ****************************************************************************/
 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 @@
                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;
        }
 

Modified: trunk/util/nvramtool/opts.c
==============================================================================
--- trunk/util/nvramtool/opts.c Fri Jan 21 08:24:08 2011        (r6285)
+++ trunk/util/nvramtool/opts.c Fri Jan 21 08:29:40 2011        (r6286)
@@ -41,7 +41,7 @@
 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 @@
                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);

Modified: trunk/util/nvramtool/opts.h
==============================================================================
--- trunk/util/nvramtool/opts.h Fri Jan 21 08:24:08 2011        (r6285)
+++ trunk/util/nvramtool/opts.h Fri Jan 21 08:29:40 2011        (r6286)
@@ -59,6 +59,7 @@
 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;

-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to