diff options
Diffstat (limited to 'firmware/2lib/2secdata_firmware.c')
-rw-r--r-- | firmware/2lib/2secdata_firmware.c | 70 |
1 files changed, 42 insertions, 28 deletions
diff --git a/firmware/2lib/2secdata_firmware.c b/firmware/2lib/2secdata_firmware.c index 1d3c855d..baca6c46 100644 --- a/firmware/2lib/2secdata_firmware.c +++ b/firmware/2lib/2secdata_firmware.c @@ -66,60 +66,68 @@ vb2_error_t vb2_secdata_firmware_init(struct vb2_context *ctx) sd->status |= VB2_SD_STATUS_SECDATA_FIRMWARE_INIT; /* Read this now to make sure crossystem has it even in rec mode */ - rv = vb2_secdata_firmware_get(ctx, VB2_SECDATA_FIRMWARE_VERSIONS, - &sd->fw_version_secdata); - if (rv) - return rv; + sd->fw_version_secdata = + vb2_secdata_firmware_get(ctx, VB2_SECDATA_FIRMWARE_VERSIONS); return VB2_SUCCESS; } -vb2_error_t vb2_secdata_firmware_get(struct vb2_context *ctx, - enum vb2_secdata_firmware_param param, - uint32_t *dest) +uint32_t vb2_secdata_firmware_get(struct vb2_context *ctx, + enum vb2_secdata_firmware_param param) { struct vb2_shared_data *sd = vb2_get_sd(ctx); struct vb2_secdata_firmware *sec = (struct vb2_secdata_firmware *)ctx->secdata_firmware; + const char *msg; - if (!(sd->status & VB2_SD_STATUS_SECDATA_FIRMWARE_INIT)) - return VB2_ERROR_SECDATA_FIRMWARE_GET_UNINITIALIZED; + if (!(sd->status & VB2_SD_STATUS_SECDATA_FIRMWARE_INIT)) { + msg = "get before init"; + goto fail; + } switch (param) { case VB2_SECDATA_FIRMWARE_FLAGS: - *dest = sec->flags; - return VB2_SUCCESS; + return sec->flags; case VB2_SECDATA_FIRMWARE_VERSIONS: - *dest = sec->fw_versions; - return VB2_SUCCESS; + return sec->fw_versions; default: - return VB2_ERROR_SECDATA_FIRMWARE_GET_PARAM; + msg = "invalid param"; } + + fail: + if (!(ctx->flags & VB2_CONTEXT_RECOVERY_MODE)) + VB2_DIE("%s\n", msg); + VB2_DEBUG("ERROR [%s] ignored in recovery mode\n", msg); + return 0; } -vb2_error_t vb2_secdata_firmware_set(struct vb2_context *ctx, - enum vb2_secdata_firmware_param param, - uint32_t value) +void vb2_secdata_firmware_set(struct vb2_context *ctx, + enum vb2_secdata_firmware_param param, + uint32_t value) { + struct vb2_shared_data *sd = vb2_get_sd(ctx); struct vb2_secdata_firmware *sec = (struct vb2_secdata_firmware *)ctx->secdata_firmware; - uint32_t now; + const char *msg; - if (!(vb2_get_sd(ctx)->status & VB2_SD_STATUS_SECDATA_FIRMWARE_INIT)) - return VB2_ERROR_SECDATA_FIRMWARE_SET_UNINITIALIZED; + if (!(sd->status & VB2_SD_STATUS_SECDATA_FIRMWARE_INIT)) { + msg = "set before init"; + goto fail; + } - /* If not changing the value, don't regenerate the CRC */ - if (vb2_secdata_firmware_get(ctx, param, &now) == VB2_SUCCESS && - now == value) - return VB2_SUCCESS; + /* If not changing the value, just return early */ + if (value == vb2_secdata_firmware_get(ctx, param)) + return; switch (param) { case VB2_SECDATA_FIRMWARE_FLAGS: /* Make sure flags is in valid range */ - if (value > 0xff) - return VB2_ERROR_SECDATA_FIRMWARE_SET_FLAGS; + if (value > 0xff) { + msg = "flags out of range"; + goto fail; + } VB2_DEBUG("secdata_firmware flags updated from 0x%x to 0x%x\n", sec->flags, value); @@ -134,11 +142,17 @@ vb2_error_t vb2_secdata_firmware_set(struct vb2_context *ctx, break; default: - return VB2_ERROR_SECDATA_FIRMWARE_SET_PARAM; + msg = "invalid param"; + goto fail; } /* Regenerate CRC */ sec->crc8 = vb2_crc8(sec, offsetof(struct vb2_secdata_firmware, crc8)); ctx->flags |= VB2_CONTEXT_SECDATA_FIRMWARE_CHANGED; - return VB2_SUCCESS; + return; + + fail: + if (!(ctx->flags & VB2_CONTEXT_RECOVERY_MODE)) + VB2_DIE("%s\n", msg); + VB2_DEBUG("ERROR [%s] ignored in recovery mode\n", msg); } |