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/cmos_ops.c b/util/nvramtool/cmos_ops.c
index 170e944..20b1093 100644
--- a/util/nvramtool/cmos_ops.c
+++ b/util/nvramtool/cmos_ops.c
@@ -1,6 +1,5 @@
 /*****************************************************************************\
  * cmos_ops.c
- * $Id$
  *****************************************************************************
  *  Copyright (C) 2002-2005 The Regents of the University of California.
  *  Produced at the Lawrence Livermore National Laboratory.
@@ -47,7 +46,7 @@
       /* Access to reserved parameters is not permitted. */
       return CMOS_OP_RESERVED;
 
-   if ((result = verify_cmos_op(e->bit, e->length)) != OK)
+   if ((result = verify_cmos_op(e->bit, e->length, e->config)) != OK)
       return result;
 
    assert(e->length > 0);
@@ -70,6 +69,7 @@
    switch (e->config)
     { case CMOS_ENTRY_ENUM:
       case CMOS_ENTRY_HEX:
+      case CMOS_ENTRY_STRING:
          break;
 
       default:
@@ -92,6 +92,7 @@
  { const cmos_enum_t *q;
    unsigned long long out;
    const char *p;
+   char *memory;
    int negative, result, found_one;
 
    if ((result = prepare_cmos_op_common(e)) != OK)
@@ -139,6 +140,15 @@
 
          break;
 
+      case CMOS_ENTRY_STRING:
+	 if (e->length < (8 * strlen(value_str)))
+	    return CMOS_OP_VALUE_TOO_WIDE;
+	 memory = malloc(e->length / 8);
+         memset(memory, 0, e->length / 8);
+         strcpy(memory, value_str);
+         out = (unsigned long)memory;
+	 break;
+
       default:
          BUG();
     }