vboot2: Add try RO software sync flag
authorMary Ruthven <mruthven@chromium.org>
Tue, 5 Jan 2016 22:59:05 +0000 (14:59 -0800)
committerchrome-bot <chrome-bot@chromium.org>
Wed, 6 Jan 2016 13:22:40 +0000 (05:22 -0800)
This flag will be used by the firmware updater to indicate that RO
software sync should be attempted.

BUG=chrome-os-partner:48703
BRANCH=None
TEST=make runtests

Change-Id: I42090ac47da45c724e66334648ab447ad3c21178
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/320621
Reviewed-by: Randall Spangler <rspangler@chromium.org>
firmware/2lib/2nvstorage.c
firmware/2lib/include/2nvstorage.h
firmware/2lib/include/2nvstorage_fields.h
firmware/include/vboot_nvstorage.h
firmware/lib/vboot_nvstorage.c
host/lib/crossystem.c
tests/vb2_nvstorage_tests.c
tests/vboot_nvstorage_test.c
utility/crossystem.c

index 851c387..3e2a874 100644 (file)
@@ -169,6 +169,9 @@ uint32_t vb2_nv_get(struct vb2_context *ctx, enum vb2_nv_param param)
 
        case VB2_NV_BOOT_ON_AC_DETECT:
                return GETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_BOOT_ON_AC_DETECT);
+
+       case VB2_NV_TRY_RO_SYNC:
+               return GETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_TRY_RO_SYNC);
        }
 
        /*
@@ -343,6 +346,10 @@ void vb2_nv_set(struct vb2_context *ctx,
                SETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_BOOT_ON_AC_DETECT);
                break;
 
+       case VB2_NV_TRY_RO_SYNC:
+               SETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_TRY_RO_SYNC);
+               break;
+
        }
 
        /*
index 31dfc8d..5c958c7 100644 (file)
@@ -94,6 +94,8 @@ enum vb2_nv_param {
        VB2_NV_FASTBOOT_UNLOCK_IN_FW,
        /* Boot system when AC detected (0=no, 1=yes). */
        VB2_NV_BOOT_ON_AC_DETECT,
+       /* Try to update the EC-RO image after updating the EC-RW image(0=no, 1=yes). */
+       VB2_NV_TRY_RO_SYNC,
 };
 
 /* Set default boot in developer mode */
index fd625d0..9ec3d88 100644 (file)
@@ -70,8 +70,9 @@ enum vb2_nv_offset {
 #define VB2_NV_TPM_CLEAR_OWNER_DONE            0x02
 #define VB2_NV_TPM_REBOOTED                    0x04
 
-/* Fields in VB2_NV_OFFS_MISC (unused = 0xfc) */
+/* Fields in VB2_NV_OFFS_MISC (unused = 0xf8) */
 #define VB2_NV_MISC_UNLOCK_FASTBOOT            0x01
 #define VB2_NV_MISC_BOOT_ON_AC_DETECT          0x02
+#define VB2_NV_MISC_TRY_RO_SYNC                       0x04
 
 #endif  /* VBOOT_REFERENCE_VBOOT_2NVSTORAGE_FIELDS_H_ */
index dc4ab50..91f62cb 100644 (file)
@@ -118,6 +118,8 @@ typedef enum VbNvParam {
        VBNV_FASTBOOT_UNLOCK_IN_FW,
        /* Boot system when AC detected (0=no, 1=yes). */
        VBNV_BOOT_ON_AC_DETECT,
+       /* Try to update the EC-RO image (0=no, 1=yes). */
+       VBNV_TRY_RO_SYNC,
 
 } VbNvParam;
 
index 403ce30..d022c5d 100644 (file)
@@ -63,6 +63,7 @@
 #define MISC_OFFSET                        8
 #define MISC_UNLOCK_FASTBOOT            0x01
 #define MISC_BOOT_ON_AC_DETECT          0x02
+#define MISC_TRY_RO_SYNC               0x04
 
 #define KERNEL_FIELD_OFFSET         11
 #define CRC_OFFSET                  15
@@ -226,6 +227,10 @@ int VbNvGet(VbNvContext *context, VbNvParam param, uint32_t *dest)
                *dest = (raw[MISC_OFFSET] & MISC_BOOT_ON_AC_DETECT) ? 1 : 0;
                return 0;
 
+       case VBNV_TRY_RO_SYNC:
+               *dest = (raw[MISC_OFFSET] & MISC_TRY_RO_SYNC) ? 1 : 0;
+               return 0;
+
        default:
                return 1;
        }
@@ -444,6 +449,13 @@ int VbNvSet(VbNvContext *context, VbNvParam param, uint32_t value)
                        raw[MISC_OFFSET] &= ~MISC_BOOT_ON_AC_DETECT;
                break;
 
+       case VBNV_TRY_RO_SYNC:
+               if (value)
+                       raw[MISC_OFFSET] |= MISC_TRY_RO_SYNC;
+               else
+                       raw[MISC_OFFSET] &= ~MISC_TRY_RO_SYNC;
+               break;
+
        default:
                return 1;
        }
index e2066ce..fd5cd9e 100644 (file)
@@ -540,6 +540,8 @@ int VbGetSystemPropertyInt(const char* name) {
          value = VbGetNvStorage(VBNV_FASTBOOT_UNLOCK_IN_FW);
   } else if (!strcasecmp(name, "boot_on_ac_detect")) {
          value = VbGetNvStorage(VBNV_BOOT_ON_AC_DETECT);
+  } else if (!strcasecmp(name, "try_ro_sync")) {
+         value = VbGetNvStorage(VBNV_TRY_RO_SYNC);
   }
 
   return value;
@@ -674,6 +676,8 @@ int VbSetSystemPropertyInt(const char* name, int value) {
     return VbSetNvStorage_WithBackup(VBNV_FASTBOOT_UNLOCK_IN_FW, value);
   } else if (!strcasecmp(name, "boot_on_ac_detect")) {
     return VbSetNvStorage_WithBackup(VBNV_BOOT_ON_AC_DETECT, value);
+  } else if (!strcasecmp(name, "try_ro_sync")) {
+    return VbSetNvStorage_WithBackup(VBNV_TRY_RO_SYNC, value);
   }
 
   return -1;
index 7796a1b..45dd7b5 100644 (file)
@@ -53,6 +53,7 @@ static struct nv_field nvfields[] = {
        {VB2_NV_BACKUP_NVRAM_REQUEST, 0, 1, 0, "backup nvram request"},
        {VB2_NV_FASTBOOT_UNLOCK_IN_FW, 0, 1, 0, "fastboot unlock in fw"},
        {VB2_NV_BOOT_ON_AC_DETECT, 0, 1, 0, "boot on ac detect"},
+       {VB2_NV_TRY_RO_SYNC, 0, 1, 0, "try read only software sync"},
        {0, 0, 0, 0, NULL}
 };
 
index 6a90ea4..ecfe171 100644 (file)
@@ -48,6 +48,7 @@ static VbNvField nvfields[] = {
   {VBNV_FW_PREV_RESULT, VBNV_FW_RESULT_UNKNOWN, 1, 3, "firmware prev result"},
   {VBNV_FASTBOOT_UNLOCK_IN_FW, 0, 1, 0, "fastboot unlock in firmware"},
   {VBNV_BOOT_ON_AC_DETECT, 0, 1, 0, "boot on ac detect"},
+  {VBNV_TRY_RO_SYNC, 0, 1, 0, "try read only software sync"},
   {0, 0, 0, 0, NULL}
 };
 
index 8f944b1..330a3fd 100644 (file)
@@ -87,6 +87,7 @@ const Param sys_param_list[] = {
   {"tpm_fwver", 0, "Firmware version stored in TPM", "0x%08x"},
   {"tpm_kernver", 0, "Kernel version stored in TPM", "0x%08x"},
   {"tpm_rebooted", 0, "TPM requesting repeated reboot (vboot2)"},
+  {"try_ro_sync", 0, "try read only software sync"},
   {"tried_fwb", 0, "Tried firmware B before A this boot"},
   {"vdat_flags", 0, "Flags from VbSharedData", "0x%08x"},
   {"vdat_lfdebug", IS_STRING|NO_PRINT_ALL,