summaryrefslogtreecommitdiff
path: root/firmware/2lib/2secdata_firmware.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/2lib/2secdata_firmware.c')
-rw-r--r--firmware/2lib/2secdata_firmware.c70
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);
}