Add crossystem fwupdate_tries and fix nv storage writes

Change-Id: I1835f4867de80aa3764e4a4c6d90b3fde2dc4308

R=reinauer@chromium.org
BUG=chromium_os:13672
TEST=manual

crossystem kern_nv=3
crossystem fwupdate_tries   # should print 3
crossystem fwupdate_tries=15
crossystem kern_nv          # should print 0x0000000F
crossystem kern_nv=0
crossystem fwupdate_tries   # should print 0

Review URL: http://codereview.chromium.org/6813056
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c
index 2e29d04..1c3fcc2 100644
--- a/host/lib/crossystem.c
+++ b/host/lib/crossystem.c
@@ -41,6 +41,10 @@
 } VdatIntField;
 
 
+/* Masks for kern_nv usage by kernel */
+#define KERN_NV_FWUPDATE_TRIES_MASK 0x0000000F
+
+
 /* Return true if the FWID starts with the specified string. */
 int FwidStartsWith(const char *start) {
   char fwid[128];
@@ -93,7 +97,7 @@
     goto VbSetNvCleanup;
 
   if (vnc.raw_changed) {
-    if (0 != VbReadNvStorage(&vnc))
+    if (0 != VbWriteNvStorage(&vnc))
       goto VbSetNvCleanup;
   }
 
@@ -351,6 +355,10 @@
     value = VbGetNvStorage(VBNV_DEBUG_RESET_MODE);
   } else if (!strcasecmp(name,"fwb_tries")) {
     value = VbGetNvStorage(VBNV_TRY_B_COUNT);
+  } else if (!strcasecmp(name,"fwupdate_tries")) {
+    value = VbGetNvStorage(VBNV_KERNEL_FIELD);
+    if (value != -1)
+      value &= KERN_NV_FWUPDATE_TRIES_MASK;
   }
   /* Other parameters */
   else if (!strcasecmp(name,"cros_debug")) {
@@ -397,6 +405,7 @@
 
 int VbSetSystemPropertyInt(const char* name, int value) {
   /* Check architecture-dependent properties first */
+
   if (0 == VbSetArchPropertyInt(name, value))
     return 0;
 
@@ -416,6 +425,13 @@
     return VbSetNvStorage(VBNV_DEBUG_RESET_MODE, value);
   } else if (!strcasecmp(name,"fwb_tries")) {
     return VbSetNvStorage(VBNV_TRY_B_COUNT, value);
+  } else if (!strcasecmp(name,"fwupdate_tries")) {
+    int kern_nv = VbGetNvStorage(VBNV_KERNEL_FIELD);
+    if (kern_nv == -1)
+      return -1;
+    kern_nv &= ~KERN_NV_FWUPDATE_TRIES_MASK;
+    kern_nv |= (value & KERN_NV_FWUPDATE_TRIES_MASK);
+    return VbSetNvStorage(VBNV_KERNEL_FIELD, kern_nv);
   }
 
   return -1;