diff options
Diffstat (limited to 'host/lib/crossystem.c')
-rw-r--r-- | host/lib/crossystem.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c index 2e29d04d..7ad5d805 100644 --- a/host/lib/crossystem.c +++ b/host/lib/crossystem.c @@ -41,6 +41,10 @@ typedef enum VdatIntField { } 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 @@ int VbSetNvStorage(VbNvParam param, int value) { goto VbSetNvCleanup; if (vnc.raw_changed) { - if (0 != VbReadNvStorage(&vnc)) + if (0 != VbWriteNvStorage(&vnc)) goto VbSetNvCleanup; } @@ -351,6 +355,12 @@ int VbGetSystemPropertyInt(const char* name) { 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; + } else if (!strcasecmp(name,"loc_idx")) { + value = VbGetNvStorage(VBNV_LOCALIZATION_INDEX); } /* Other parameters */ else if (!strcasecmp(name,"cros_debug")) { @@ -397,6 +407,7 @@ const char* VbGetSystemPropertyString(const char* name, char* dest, int size) { int VbSetSystemPropertyInt(const char* name, int value) { /* Check architecture-dependent properties first */ + if (0 == VbSetArchPropertyInt(name, value)) return 0; @@ -416,6 +427,15 @@ int VbSetSystemPropertyInt(const char* name, int value) { 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); + } else if (!strcasecmp(name,"loc_idx")) { + return VbSetNvStorage(VBNV_LOCALIZATION_INDEX, value); } return -1; |