diff options
Diffstat (limited to 'futility/updater.c')
-rw-r--r-- | futility/updater.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/futility/updater.c b/futility/updater.c index a8dfb8d8..8048a5b7 100644 --- a/futility/updater.c +++ b/futility/updater.c @@ -472,7 +472,8 @@ static int write_optional_firmware(struct updater_config *cfg, */ static int preserve_gbb(const struct firmware_image *image_from, struct firmware_image *image_to, - int preserve_flags) + int preserve_flags, int override_flags, + uint64_t override_value) { const struct vb2_gbb_header *gbb_from; struct vb2_gbb_header *gbb_to; @@ -484,8 +485,10 @@ static int preserve_gbb(const struct firmware_image *image_from, if (!gbb_from || !gbb_to) return -1; - /* Preserve flags (for non-factory mode). */ - if (preserve_flags) + /* Preserve (for non-factory mode) or override flags. */ + if (override_flags) + gbb_to->flags = override_value; + else if (preserve_flags) gbb_to->flags = gbb_from->flags; /* Preserve HWID. */ @@ -583,7 +586,8 @@ static int preserve_images(struct updater_config *cfg) int errcnt = 0, found; struct firmware_image *from = &cfg->image_current, *to = &cfg->image; - errcnt += preserve_gbb(from, to, !cfg->factory_update); + errcnt += preserve_gbb(from, to, !cfg->factory_update, + cfg->override_gbb_flags, cfg->gbb_flags); errcnt += preserve_management_engine(cfg, from, to); errcnt += preserve_fmap_sections(from, to, &found); @@ -998,7 +1002,7 @@ static enum updater_error_codes update_try_rw_firmware( int has_update = 1; int is_vboot2 = get_system_property(SYS_PROP_FW_VBOOT2, cfg); - preserve_gbb(image_from, image_to, 1); + preserve_gbb(image_from, image_to, 1, 0, 0); if (!wp_enabled && section_needs_update( image_from, image_to, FMAP_RO_SECTION)) return UPDATE_ERR_NEED_RO_UPDATE; @@ -1502,6 +1506,8 @@ int updater_setup_config(struct updater_config *cfg, check_wp_disabled = 1; cfg->try_update = 0; } + cfg->gbb_flags = arg->gbb_flags; + cfg->override_gbb_flags = arg->override_gbb_flags; /* Setup properties and fields that do not have external dependency. */ if (arg->programmer) { |