Add string support to nvramtool.

To add a string to your cmos.layout, you need to specify type 's':

#start     len       type    unused   name
416        512       s       0        boot_devices

With this patch you can do

$ nvramtool -w boot_devices="(hd0,0);(hd2,1);(hd3)"

And FILO will attempt to load a menu.lst from any of these devices in that
order.

The patch is not exactly pretty, but a cleaner solution might have resulted in
a complete rewrite of the tool, which I did not want.

Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Joseph Smith <joe@settoplinux.org>



git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3613 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
diff --git a/util/nvramtool/nvramtool.c b/util/nvramtool/nvramtool.c
index 98de6dc..1832477 100644
--- a/util/nvramtool/nvramtool.c
+++ b/util/nvramtool/nvramtool.c
@@ -1,6 +1,5 @@
 /*****************************************************************************\
  * nvramtool.c
- * $Id$
  *****************************************************************************
  *  Copyright (C) 2002-2005 The Regents of the University of California.
  *  Produced at the Lawrence Livermore National Laboratory.
@@ -477,6 +476,11 @@
                 e->length);
          break;
 
+      case CMOS_ENTRY_STRING:
+         printf("Parameter %s requires a %u-byte string.\n", name,
+                e->length / 8);
+         break;
+
       case CMOS_ENTRY_RESERVED:
          printf("Parameter %s is reserved.\n", name);
          break;
@@ -570,7 +574,7 @@
 
    /* write the value to nonvolatile RAM */
    set_iopl(3);
-   cmos_write(e->bit, e->length, n);
+   cmos_write(e, n);
    cmos_checksum_write(cmos_checksum_compute());
    set_iopl(0);
    return;
@@ -674,7 +678,7 @@
 
    /* read the value from CMOS */
    set_iopl(3);
-   value = cmos_read(e->bit, e->length);
+   value = cmos_read(e);
    set_iopl(0);
 
    /* display the value */
@@ -703,6 +707,16 @@
 
          break;
 
+      case CMOS_ENTRY_STRING:
+         if (show_name)
+	    printf("%s = %s\n", e->name, (char *)(unsigned long)value);
+	 else
+ 	    printf("%s\n", (char *)(unsigned long)value);
+
+         free((void *)(unsigned long)value);
+
+         break;
+
       case CMOS_ENTRY_RESERVED:
       default:
          BUG();