diff options
Diffstat (limited to 'firmware/2lib/2secdata_kernel.c')
-rw-r--r-- | firmware/2lib/2secdata_kernel.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/firmware/2lib/2secdata_kernel.c b/firmware/2lib/2secdata_kernel.c index 27342f38..8b3cf59c 100644 --- a/firmware/2lib/2secdata_kernel.c +++ b/firmware/2lib/2secdata_kernel.c @@ -32,7 +32,7 @@ uint8_t vb2_secdata_kernel_crc(struct vb2_context *ctx) } else { struct vb2_secdata_kernel_v1 *sec = (void *)ctx->secdata_kernel; - offset = offsetof(struct vb2_secdata_kernel_v1, reserved0); + offset = offsetof(struct vb2_secdata_kernel_v1, flags); size = sec->struct_size - offset; } @@ -180,6 +180,8 @@ uint32_t vb2_secdata_kernel_get(struct vb2_context *ctx, { struct vb2_shared_data *sd = vb2_get_sd(ctx); const char *msg; + const struct vb2_secdata_kernel_v0 *v0 = (void *)ctx->secdata_kernel; + const struct vb2_secdata_kernel_v1 *v1 = (void *)ctx->secdata_kernel; if (!(sd->status & VB2_SD_STATUS_SECDATA_KERNEL_INIT)) { msg = "get before init"; @@ -188,15 +190,14 @@ uint32_t vb2_secdata_kernel_get(struct vb2_context *ctx, switch (param) { case VB2_SECDATA_KERNEL_VERSIONS: + return is_v0(ctx) ? v0->kernel_versions : v1->kernel_versions; + case VB2_SECDATA_KERNEL_FLAGS: if (is_v0(ctx)) { - struct vb2_secdata_kernel_v0 *sec = - (void *)ctx->secdata_kernel; - return sec->kernel_versions; - } else { - struct vb2_secdata_kernel_v1 *sec = - (void *)ctx->secdata_kernel; - return sec->kernel_versions; + VB2_DEBUG("VB2_SECDATA_KERNEL_FLAGS not supported for " + "secdata_kernel v0, return 0\n"); + return 0; } + return v1->flags; default: msg = "invalid param"; } @@ -230,15 +231,30 @@ void vb2_secdata_kernel_set(struct vb2_context *ctx, ptr = is_v0(ctx) ? &v0->kernel_versions : &v1->kernel_versions; VB2_DEBUG("secdata_kernel versions updated from %#x to %#x\n", *ptr, value); + *ptr = value; break; + case VB2_SECDATA_KERNEL_FLAGS: + if (is_v0(ctx)) { + VB2_DEBUG("VB2_SECDATA_KERNEL_FLAGS not supported for " + "secdata_kernel v0, silently ignore\n"); + return; + } + + /* Make sure flags is in valid range */ + if (value > UINT8_MAX) { + msg = "flags out of range"; + goto fail; + } + VB2_DEBUG("secdata_kernel flags updated from %#x to %#x\n", + v1->flags, value); + v1->flags = value; + break; default: msg = "invalid param"; goto fail; } - *ptr = value; - if (is_v0(ctx)) v0->crc8 = vb2_secdata_kernel_crc(ctx); else |