| From 9d70628b7dc1dbc3c1ac7f4f3c0f6aa6b237510d Mon Sep 17 00:00:00 2001 |
| From: Satish Kumar <satish.kumar01@arm.com> |
| Date: Wed, 6 Jul 2022 11:19:39 +0100 |
| Subject: [PATCH 5/6] corstone1000: support for UEFI FMP image Information |
| |
| The commit provides the support for UEFI FMP (Firmware Management |
| Protocol) SET and GET Image info APIs. |
| |
| The APIs to SET and GET image info is implemented. In current design, |
| SET is called by secure encalve and GET is called by the host. |
| |
| FMP image information is initialized on every boot and retained |
| in SRAM. The updatable values of the FMP are stored in private |
| metadata section of the flash. |
| |
| Change-Id: Iaf0b4a13a9c24f05e4a32509e61a8b96ee8e9e4b |
| Signed-off-by: Satish Kumar <satish.kumar01@arm.com> |
| Upstream-Status: Accepted [TF-Mv1.7.0] |
| --- |
| .../target/arm/corstone1000/CMakeLists.txt | 2 + |
| .../ext/target/arm/corstone1000/config.cmake | 8 +- |
| .../corstone1000/fw_update_agent/fwu_agent.c | 61 ++++- |
| .../corstone1000/fw_update_agent/fwu_agent.h | 3 + |
| .../corstone1000/fw_update_agent/uefi_fmp.c | 240 ++++++++++++++++++ |
| .../corstone1000/fw_update_agent/uefi_fmp.h | 56 ++++ |
| .../include/corstone1000_ioctl_requests.h | 14 +- |
| .../services/src/tfm_platform_system.c | 9 + |
| 8 files changed, 374 insertions(+), 19 deletions(-) |
| create mode 100644 platform/ext/target/arm/corstone1000/fw_update_agent/uefi_fmp.c |
| create mode 100644 platform/ext/target/arm/corstone1000/fw_update_agent/uefi_fmp.h |
| |
| diff --git a/platform/ext/target/arm/corstone1000/CMakeLists.txt b/platform/ext/target/arm/corstone1000/CMakeLists.txt |
| index 81522c7cf0..3602312a3a 100644 |
| --- a/platform/ext/target/arm/corstone1000/CMakeLists.txt |
| +++ b/platform/ext/target/arm/corstone1000/CMakeLists.txt |
| @@ -76,6 +76,8 @@ target_sources(platform_s |
| fw_update_agent/uefi_capsule_parser.c |
| fw_update_agent/fwu_agent.c |
| $<$<BOOL:${TFM_S_REG_TEST}>:${CMAKE_CURRENT_SOURCE_DIR}/target_cfg.c> |
| + fw_update_agent/uefi_fmp.c |
| + $<$<NOT:$<BOOL:${PLATFORM_DEFAULT_OTP}>>:${PLATFORM_DIR}/ext/accelerator/cc312/otp_cc312.c> |
| ) |
| |
| if (PLATFORM_IS_FVP) |
| diff --git a/platform/ext/target/arm/corstone1000/config.cmake b/platform/ext/target/arm/corstone1000/config.cmake |
| index a6a1a33c42..ab0fe17ba8 100644 |
| --- a/platform/ext/target/arm/corstone1000/config.cmake |
| +++ b/platform/ext/target/arm/corstone1000/config.cmake |
| @@ -50,7 +50,9 @@ else() |
| set(PLATFORM_PSA_ADAC_SECURE_DEBUG FALSE CACHE BOOL "Whether to use psa-adac secure debug.") |
| endif() |
| |
| -set(DEFAULT_MCUBOOT_SECURITY_COUNTERS OFF CACHE BOOL "Whether to use the default security counter configuration defined by TF-M project") |
| +set(DEFAULT_MCUBOOT_SECURITY_COUNTERS OFF CACHE BOOL "Whether to use the default security counter configuration defined by TF-M project") |
| |
| -set(PS_ENCRYPTION OFF CACHE BOOL "Enable encryption for Protected Storage partition") |
| -set(PS_ROLLBACK_PROTECTION OFF CACHE BOOL "Enable rollback protection for Protected Storage partition") |
| +set(PS_ENCRYPTION OFF CACHE BOOL "Enable encryption for Protected Storage partition") |
| +set(PS_ROLLBACK_PROTECTION OFF CACHE BOOL "Enable rollback protection for Protected Storage partition") |
| + |
| +set(PLATFORM_SERVICE_OUTPUT_BUFFER_SIZE 256 CACHE STRING "Size of output buffer in platform service.") |
| diff --git a/platform/ext/target/arm/corstone1000/fw_update_agent/fwu_agent.c b/platform/ext/target/arm/corstone1000/fw_update_agent/fwu_agent.c |
| index 3abb5dd0dc..72a5fc9c1d 100644 |
| --- a/platform/ext/target/arm/corstone1000/fw_update_agent/fwu_agent.c |
| +++ b/platform/ext/target/arm/corstone1000/fw_update_agent/fwu_agent.c |
| @@ -18,6 +18,7 @@ |
| #include "platform_description.h" |
| #include "tfm_plat_nv_counters.h" |
| #include "tfm_plat_defs.h" |
| +#include "uefi_fmp.h" |
| |
| /* Properties of image in a bank */ |
| struct fwu_image_properties { |
| @@ -84,6 +85,11 @@ struct fwu_private_metadata { |
| /* staged nv_counter: temprary location before written to the otp */ |
| uint32_t nv_counter[NR_OF_IMAGES_IN_FW_BANK]; |
| |
| + /* FMP information */ |
| + uint32_t fmp_version; |
| + uint32_t fmp_last_attempt_version; |
| + uint32_t fmp_last_attempt_status; |
| + |
| } __packed; |
| |
| #define MAX_BOOT_ATTEMPTS_PER_BANK 3 |
| @@ -278,7 +284,7 @@ enum fwu_agent_error_t fwu_metadata_provision(void) |
| { |
| enum fwu_agent_error_t ret; |
| struct fwu_private_metadata priv_metadata; |
| - uint32_t image_version = 0; |
| + uint32_t image_version = FWU_IMAGE_INITIAL_VERSION; |
| |
| FWU_LOG_MSG("%s: enter\n\r", __func__); |
| |
| @@ -302,8 +308,8 @@ enum fwu_agent_error_t fwu_metadata_provision(void) |
| memset(&_metadata, 0, sizeof(struct fwu_metadata)); |
| |
| _metadata.version = 1; |
| - _metadata.active_index = 0; |
| - _metadata.previous_active_index = 1; |
| + _metadata.active_index = BANK_0; |
| + _metadata.previous_active_index = BANK_1; |
| |
| /* bank 0 is the place where images are located at the |
| * start of device lifecycle */ |
| @@ -339,6 +345,10 @@ enum fwu_agent_error_t fwu_metadata_provision(void) |
| priv_metadata.boot_index = BANK_0; |
| priv_metadata.boot_attempted = 0; |
| |
| + priv_metadata.fmp_version = FWU_IMAGE_INITIAL_VERSION; |
| + priv_metadata.fmp_last_attempt_version = FWU_IMAGE_INITIAL_VERSION; |
| + priv_metadata.fmp_last_attempt_status = LAST_ATTEMPT_STATUS_SUCCESS; |
| + |
| ret = private_metadata_write(&priv_metadata); |
| if (ret) { |
| return ret; |
| @@ -540,9 +550,25 @@ enum fwu_agent_error_t corstone1000_fwu_flash_image(void) |
| &image_bank_offset); |
| switch(image_index) { |
| case IMAGE_ALL: |
| + |
| ret = flash_full_capsule(&_metadata, capsule_info.image[i], |
| capsule_info.size[i], |
| capsule_info.version[i]); |
| + |
| + if (ret != FWU_AGENT_SUCCESS) { |
| + |
| + priv_metadata.fmp_last_attempt_version = capsule_info.version[i]; |
| + priv_metadata.fmp_last_attempt_status = LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL; |
| + |
| + private_metadata_write(&priv_metadata); |
| + |
| + fmp_set_image_info(&full_capsule_image_guid, |
| + priv_metadata.fmp_version, |
| + priv_metadata.fmp_last_attempt_version, |
| + priv_metadata.fmp_last_attempt_status); |
| + } |
| + |
| + |
| break; |
| default: |
| FWU_LOG_MSG("%s: sent image not recognized\n\r", __func__); |
| @@ -866,17 +892,42 @@ enum fwu_agent_error_t corstone1000_fwu_host_ack(void) |
| |
| current_state = get_fwu_agent_state(&_metadata, &priv_metadata); |
| if (current_state == FWU_AGENT_STATE_REGULAR) { |
| + |
| ret = FWU_AGENT_SUCCESS; /* nothing to be done */ |
| + |
| + fmp_set_image_info(&full_capsule_image_guid, |
| + priv_metadata.fmp_version, |
| + priv_metadata.fmp_last_attempt_version, |
| + priv_metadata.fmp_last_attempt_status); |
| + |
| goto out; |
| + |
| } else if (current_state != FWU_AGENT_STATE_TRIAL) { |
| FWU_ASSERT(0); |
| } |
| |
| if (_metadata.active_index != priv_metadata.boot_index) { |
| + |
| /* firmware update failed, revert back to previous bank */ |
| + |
| + priv_metadata.fmp_last_attempt_version = |
| + _metadata.img_entry[IMAGE_0].img_props[_metadata.active_index].version; |
| + |
| + priv_metadata.fmp_last_attempt_status = LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL; |
| + |
| ret = fwu_select_previous(&_metadata, &priv_metadata); |
| + |
| } else { |
| + |
| /* firmware update successful */ |
| + |
| + priv_metadata.fmp_version = |
| + _metadata.img_entry[IMAGE_0].img_props[_metadata.active_index].version; |
| + priv_metadata.fmp_last_attempt_version = |
| + _metadata.img_entry[IMAGE_0].img_props[_metadata.active_index].version; |
| + |
| + priv_metadata.fmp_last_attempt_status = LAST_ATTEMPT_STATUS_SUCCESS; |
| + |
| ret = fwu_accept_image(&full_capsule_image_guid, &_metadata, |
| &priv_metadata); |
| if (!ret) { |
| @@ -886,6 +937,10 @@ enum fwu_agent_error_t corstone1000_fwu_host_ack(void) |
| |
| if (ret == FWU_AGENT_SUCCESS) { |
| disable_host_ack_timer(); |
| + fmp_set_image_info(&full_capsule_image_guid, |
| + priv_metadata.fmp_version, |
| + priv_metadata.fmp_last_attempt_version, |
| + priv_metadata.fmp_last_attempt_status); |
| } |
| |
| out: |
| diff --git a/platform/ext/target/arm/corstone1000/fw_update_agent/fwu_agent.h b/platform/ext/target/arm/corstone1000/fw_update_agent/fwu_agent.h |
| index 57b07e8d2c..aa18179024 100644 |
| --- a/platform/ext/target/arm/corstone1000/fw_update_agent/fwu_agent.h |
| +++ b/platform/ext/target/arm/corstone1000/fw_update_agent/fwu_agent.h |
| @@ -30,6 +30,9 @@ enum fwu_agent_error_t { |
| } \ |
| |
| |
| +/* Version used for the very first image of the device. */ |
| +#define FWU_IMAGE_INITIAL_VERSION 0 |
| + |
| enum fwu_agent_error_t fwu_metadata_provision(void); |
| enum fwu_agent_error_t fwu_metadata_init(void); |
| |
| diff --git a/platform/ext/target/arm/corstone1000/fw_update_agent/uefi_fmp.c b/platform/ext/target/arm/corstone1000/fw_update_agent/uefi_fmp.c |
| new file mode 100644 |
| index 0000000000..ce576e1794 |
| --- /dev/null |
| +++ b/platform/ext/target/arm/corstone1000/fw_update_agent/uefi_fmp.c |
| @@ -0,0 +1,240 @@ |
| +/* |
| + * Copyright (c) 2022, Arm Limited. All rights reserved. |
| + * |
| + * SPDX-License-Identifier: BSD-3-Clause |
| + * |
| + */ |
| + |
| +#include <string.h> |
| +#include <stdbool.h> |
| +#include "cmsis.h" |
| +#include "uefi_fmp.h" |
| + |
| +/* The count will increase when partial update is supported. |
| + * At present, only full WIC is considered as updatable image. |
| + */ |
| +#define NUMBER_OF_FMP_IMAGES 1 |
| +#define NO_OF_FMP_VARIABLES_PER_IMAGE 6 |
| + |
| +#define UEFI_ARCHITECTURE_64 |
| + |
| +#ifdef UEFI_ARCHITECTURE_64 |
| +typedef uint64_t uefi_ptr_t; |
| +typedef uint64_t efi_uintn_t; |
| +#else |
| +typedef uint32_t uefi_ptr_t; |
| +typedef uint32_t efi_uintn_t; |
| +#endif |
| + |
| +/* Below macro definations and struct declarations taken from UEFI spec 2.9 */ |
| + |
| +/* |
| + * Image Attribute Definitions |
| + */ |
| +#define IMAGE_ATTRIBUTE_IMAGE_UPDATABLE 0x00000001 |
| +#define IMAGE_ATTRIBUTE_RESET_REQUIRED 0x00000002 |
| +#define IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED 0x00000004 |
| +#define IMAGE_ATTRIBUTE_IN_USE 0x00000008 |
| +#define IMAGE_ATTRIBUTE_UEFI_IMAGE 0x00000010 |
| +#define IMAGE_ATTRIBUTE_DEPENDENCY 0x00000020 |
| + |
| +typedef uint32_t DescriptorVersion_t; |
| +typedef uint32_t DescriptorSize_t; |
| +typedef uint8_t DescriptorCount_t; |
| + |
| +typedef __PACKED_STRUCT { |
| + uint8_t ImageIndex; |
| + struct efi_guid ImageTypeId; |
| + uint64_t ImageId; |
| + uefi_ptr_t PtrImageIdName; |
| + uint32_t Version; |
| + uefi_ptr_t PtrVersionName; |
| + efi_uintn_t Size; |
| + uint64_t AttributesSupported; |
| + uint64_t AttributesSetting; |
| + uint64_t Compatibilities; |
| + /* Introduced with DescriptorVersion 2+ */ |
| + uint32_t LowestSupportedImageVersion; |
| + /* Introduced with DescriptorVersion 3+ */ |
| + uint32_t LastAttemptVersion; |
| + uint32_t LastAttemptStatus; |
| + uint64_t HardwareInstance; |
| + /* Introduced with DescriptorVersion 4+ */ |
| + uefi_ptr_t PtrDependencies; |
| +} EFI_FIRMWARE_IMAGE_DESCRIPTOR; |
| + |
| +typedef __PACKED_STRUCT { |
| + DescriptorVersion_t DescriptorVersion; |
| + DescriptorSize_t DescriptorsSize; |
| + DescriptorCount_t DescriptorCount; |
| + EFI_FIRMWARE_IMAGE_DESCRIPTOR ImageDescriptor; |
| + uint16_t *ImageName; |
| + uint32_t ImageNameSize; |
| + uint16_t *ImageVersionName; |
| + uint32_t ImageVersionNameSize; |
| +} EFI_FIRMWARE_MANAGEMENT_PROTOCOL_IMAGE_INFO; |
| + |
| + |
| +static uint16_t corstone_image_name0[] = { 'C', 'O', 'R', 'S', 'T', 'O', 'N', 'E', '1', '0', '0', '0', '_', 'W', 'I', 'C', '\0' }; |
| +static uint16_t corstone_version_name0[] = { 'C', 'O', 'R', 'S', 'T', 'O', 'N', 'E', '1', '0', '0', '0', '_', 'B', 'E', 'S', 'T', '\0'}; |
| + |
| +static EFI_FIRMWARE_MANAGEMENT_PROTOCOL_IMAGE_INFO fmp_info[NUMBER_OF_FMP_IMAGES]; |
| + |
| +extern struct efi_guid full_capsule_image_guid; |
| + |
| +static bool is_fmp_info_initialized = false; |
| + |
| +static void init_fmp_info(void) |
| +{ |
| + memset(fmp_info, 0, |
| + sizeof(EFI_FIRMWARE_MANAGEMENT_PROTOCOL_IMAGE_INFO) * NUMBER_OF_FMP_IMAGES); |
| + |
| + /* Fill information for the WIC. |
| + * Add further details when partial image is supported. |
| + */ |
| + |
| + fmp_info[0].DescriptorVersion = 4; |
| + fmp_info[0].DescriptorCount = NUMBER_OF_FMP_IMAGES; |
| + fmp_info[0].DescriptorsSize = |
| + sizeof(EFI_FIRMWARE_IMAGE_DESCRIPTOR) + |
| + sizeof(corstone_image_name0) + sizeof(corstone_version_name0); |
| + |
| + fmp_info[0].ImageDescriptor.ImageIndex = 1; |
| + |
| + memcpy(&fmp_info[0].ImageDescriptor.ImageTypeId, &full_capsule_image_guid, |
| + sizeof(struct efi_guid)); |
| + |
| + fmp_info[0].ImageDescriptor.ImageId = 1; |
| + fmp_info[0].ImageDescriptor.Version = FWU_IMAGE_INITIAL_VERSION; |
| + fmp_info[0].ImageDescriptor.AttributesSupported = 1; |
| + fmp_info[0].ImageDescriptor.AttributesSetting = ( |
| + IMAGE_ATTRIBUTE_IMAGE_UPDATABLE | IMAGE_ATTRIBUTE_RESET_REQUIRED); |
| + fmp_info[0].ImageDescriptor.LowestSupportedImageVersion = |
| + FWU_IMAGE_INITIAL_VERSION; |
| + fmp_info[0].ImageDescriptor.LastAttemptVersion = FWU_IMAGE_INITIAL_VERSION; |
| + fmp_info[0].ImageDescriptor.LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; |
| + |
| + fmp_info[0].ImageName = corstone_image_name0; |
| + fmp_info[0].ImageNameSize = sizeof(corstone_image_name0); |
| + fmp_info[0].ImageVersionName = corstone_version_name0; |
| + fmp_info[0].ImageVersionNameSize = sizeof(corstone_version_name0); |
| + |
| + is_fmp_info_initialized = true; |
| + |
| + return; |
| +} |
| + |
| +enum fwu_agent_error_t fmp_set_image_info(struct efi_guid *guid, |
| + uint32_t current_version, uint32_t attempt_version, |
| + uint32_t last_attempt_status) |
| +{ |
| + enum fwu_agent_error_t status = FWU_AGENT_ERROR; |
| + |
| + FWU_LOG_MSG("%s:%d Enter\n\r", __func__, __LINE__); |
| + |
| + if (is_fmp_info_initialized == false) { |
| + init_fmp_info(); |
| + } |
| + |
| + for (int i = 0; i < NUMBER_OF_FMP_IMAGES; i++) { |
| + if ((memcmp(guid, &fmp_info[i].ImageDescriptor.ImageTypeId, |
| + sizeof(struct efi_guid))) == 0) |
| + { |
| + FWU_LOG_MSG("FMP image update: image id = %u\n\r", |
| + fmp_info[i].ImageDescriptor.ImageId); |
| + fmp_info[i].ImageDescriptor.Version = current_version; |
| + fmp_info[i].ImageDescriptor.LastAttemptVersion = attempt_version; |
| + fmp_info[i].ImageDescriptor.LastAttemptStatus = last_attempt_status; |
| + FWU_LOG_MSG("FMP image update: status = %u" |
| + "version=%u last_attempt_version=%u.\n\r", |
| + last_attempt_status, current_version, |
| + attempt_version); |
| + status = FWU_AGENT_SUCCESS; |
| + break; |
| + } |
| + } |
| + |
| + FWU_LOG_MSG("%s:%d Exit.\n\r", __func__, __LINE__); |
| + return status; |
| +} |
| + |
| + |
| +#define NO_OF_FMP_VARIABLES (NUMBER_OF_FMP_IMAGES * NO_OF_FMP_VARIABLES_PER_IMAGE) |
| + |
| +static enum fwu_agent_error_t pack_image_info(void *buffer, uint32_t size) |
| +{ |
| + typedef __PACKED_STRUCT { |
| + uint32_t variable_count; |
| + uint32_t variable_size[NO_OF_FMP_VARIABLES]; |
| + uint8_t variable[]; |
| + } packed_buffer_t; |
| + |
| + packed_buffer_t *packed_buffer = buffer; |
| + int runner = 0; |
| + int index = 0; |
| + int current_size = sizeof(packed_buffer_t); |
| + int size_requirement_1 = 0; |
| + int size_requirement_2 = 0; |
| + |
| + if (size < current_size) { |
| + FWU_LOG_MSG("%s:%d Buffer too small.\n\r", __func__, __LINE__); |
| + return FWU_AGENT_ERROR; |
| + } |
| + |
| + packed_buffer->variable_count = NO_OF_FMP_VARIABLES; |
| + |
| + for (int i = 0; i < NUMBER_OF_FMP_IMAGES; i++) { |
| + |
| + packed_buffer->variable_size[index++] = sizeof(DescriptorVersion_t); |
| + packed_buffer->variable_size[index++] = sizeof(DescriptorSize_t); |
| + packed_buffer->variable_size[index++] = sizeof(DescriptorCount_t); |
| + packed_buffer->variable_size[index++] = sizeof(EFI_FIRMWARE_IMAGE_DESCRIPTOR); |
| + packed_buffer->variable_size[index++] = fmp_info[i].ImageNameSize; |
| + packed_buffer->variable_size[index++] = fmp_info[i].ImageVersionNameSize; |
| + |
| + size_requirement_1 = sizeof(DescriptorVersion_t) + sizeof(DescriptorSize_t) + |
| + sizeof(DescriptorCount_t) + sizeof(EFI_FIRMWARE_IMAGE_DESCRIPTOR); |
| + |
| + size_requirement_2 = fmp_info[i].ImageNameSize + fmp_info[i].ImageVersionNameSize; |
| + |
| + current_size += size_requirement_1 + size_requirement_2; |
| + |
| + if (size < current_size) { |
| + FWU_LOG_MSG("%s:%d Buffer too small.\n\r", __func__, __LINE__); |
| + return FWU_AGENT_ERROR; |
| + } |
| + |
| + FWU_LOG_MSG("%s:%d ImageInfo size = %u, ImageName size = %u, " |
| + "ImageVersionName size = %u\n\r", __func__, __LINE__, |
| + sizeof(EFI_FIRMWARE_IMAGE_DESCRIPTOR), fmp_info[i].ImageNameSize, |
| + fmp_info[i].ImageVersionNameSize); |
| + |
| + memcpy(&packed_buffer->variable[runner], &fmp_info[i], size_requirement_1); |
| + runner += size_requirement_1; |
| + |
| + memcpy(&packed_buffer->variable[runner], fmp_info[i].ImageName, |
| + fmp_info[i].ImageNameSize); |
| + runner += fmp_info[i].ImageNameSize; |
| + |
| + memcpy(&packed_buffer->variable[runner], fmp_info[i].ImageVersionName, |
| + fmp_info[i].ImageVersionNameSize); |
| + runner += fmp_info[i].ImageVersionNameSize; |
| + |
| + } |
| + |
| + return FWU_AGENT_SUCCESS; |
| +} |
| + |
| +enum fwu_agent_error_t fmp_get_image_info(void *buffer, uint32_t size) |
| +{ |
| + enum fwu_agent_error_t status; |
| + |
| + FWU_LOG_MSG("%s:%d Enter\n\r", __func__, __LINE__); |
| + |
| + status = pack_image_info(buffer, size); |
| + |
| + FWU_LOG_MSG("%s:%d Exit\n\r", __func__, __LINE__); |
| + |
| + return status; |
| +} |
| + |
| diff --git a/platform/ext/target/arm/corstone1000/fw_update_agent/uefi_fmp.h b/platform/ext/target/arm/corstone1000/fw_update_agent/uefi_fmp.h |
| new file mode 100644 |
| index 0000000000..d876bd7cff |
| --- /dev/null |
| +++ b/platform/ext/target/arm/corstone1000/fw_update_agent/uefi_fmp.h |
| @@ -0,0 +1,56 @@ |
| +/* |
| + * Copyright (c) 2022, Arm Limited. All rights reserved. |
| + * |
| + * SPDX-License-Identifier: BSD-3-Clause |
| + * |
| + */ |
| + |
| +#ifndef UEFI_FMP_H |
| +#define UEFI_FMP_H |
| + |
| + |
| +#include <stdint.h> |
| +#include "fwu_agent.h" |
| +#include "../fip_parser/external/uuid.h" |
| + |
| +/* |
| + * Last Attempt Status Value |
| + */ |
| + |
| +#define LAST_ATTEMPT_STATUS_SUCCESS 0x00000000 |
| +#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL 0x00000001 |
| +#define LAST_ATTEMPT_STATUS_ERROR_INSUFFICIENT_RESOURCES 0x00000002 |
| +#define LAST_ATTEMPT_STATUS_ERROR_INCORRECT_VERSION 0x00000003 |
| +#define LAST_ATTEMPT_STATUS_ERROR_INVALID_FORMAT 0x00000004 |
| +#define LAST_ATTEMPT_STATUS_ERROR_AUTH_ERROR 0x00000005 |
| +#define LAST_ATTEMPT_STATUS_ERROR_PWR_EVT_AC 0x00000006 |
| +#define LAST_ATTEMPT_STATUS_ERROR_PWR_EVT_BATT 0x00000007 |
| +#define LAST_ATTEMPT_STATUS_ERROR_UNSATISFIED_DEPENDENCIES 0x00000008 |
| +/* The LastAttemptStatus values of 0x1000 - 0x4000 are reserved for vendor usage. */ |
| +#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN 0x00001000 |
| +#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MAX 0x00004000 |
| + |
| + |
| + |
| +/* |
| + * Updates FMP information for the image matched by guid. |
| + * |
| + * guid : guid of the image |
| + * current_version: current versions for the image |
| + * attempt_version: attempted versions for the image |
| + * |
| + */ |
| +enum fwu_agent_error_t fmp_set_image_info(struct efi_guid *guid, |
| + uint32_t current_version, uint32_t attempt_version, |
| + uint32_t last_attempt_status); |
| + |
| +/* |
| + * Return fmp image information for all the updable images. |
| + * |
| + * buffer : pointer to the out buffer |
| + * size : size of the buffer |
| + * |
| + */ |
| +enum fwu_agent_error_t fmp_get_image_info(void *buffer, uint32_t size); |
| + |
| +#endif /* UEFI_FMP_H */ |
| diff --git a/platform/ext/target/arm/corstone1000/services/include/corstone1000_ioctl_requests.h b/platform/ext/target/arm/corstone1000/services/include/corstone1000_ioctl_requests.h |
| index 8ac67346b6..c5f3537e9d 100644 |
| --- a/platform/ext/target/arm/corstone1000/services/include/corstone1000_ioctl_requests.h |
| +++ b/platform/ext/target/arm/corstone1000/services/include/corstone1000_ioctl_requests.h |
| @@ -14,19 +14,7 @@ |
| enum corstone1000_ioctl_id_t { |
| IOCTL_CORSTONE1000_FWU_FLASH_IMAGES = 0, |
| IOCTL_CORSTONE1000_FWU_HOST_ACK, |
| + IOCTL_CORSTONE1000_FMP_GET_IMAGE_INFO, |
| }; |
| |
| - |
| -typedef struct corstone1000_ioctl_in_params { |
| - |
| - uint32_t ioctl_id; |
| - |
| -} corstone1000_ioctl_in_params_t; |
| - |
| -typedef struct corstone1000_ioctl_out_params { |
| - |
| - int32_t result; |
| - |
| -} corstone1000_ioctl_out_params_t; |
| - |
| #endif /* CORSTONE1000_IOCTL_REQUESTS_H */ |
| diff --git a/platform/ext/target/arm/corstone1000/services/src/tfm_platform_system.c b/platform/ext/target/arm/corstone1000/services/src/tfm_platform_system.c |
| index 5b3f3e14a2..41305ed966 100644 |
| --- a/platform/ext/target/arm/corstone1000/services/src/tfm_platform_system.c |
| +++ b/platform/ext/target/arm/corstone1000/services/src/tfm_platform_system.c |
| @@ -9,6 +9,7 @@ |
| #include "platform_description.h" |
| #include "corstone1000_ioctl_requests.h" |
| #include "fwu_agent.h" |
| +#include "uefi_fmp.h" |
| |
| void tfm_platform_hal_system_reset(void) |
| { |
| @@ -36,6 +37,14 @@ enum tfm_platform_err_t tfm_platform_hal_ioctl(tfm_platform_ioctl_req_t request, |
| corstone1000_fwu_host_ack(); |
| break; |
| |
| + case IOCTL_CORSTONE1000_FMP_GET_IMAGE_INFO: |
| + if (out_vec == NULL) { |
| + ret = TFM_PLATFORM_ERR_INVALID_PARAM; |
| + break; |
| + } |
| + fmp_get_image_info(out_vec[0].base, out_vec[0].len); |
| + break; |
| + |
| default: |
| ret = TFM_PLATFORM_ERR_NOT_SUPPORTED; |
| break; |
| -- |
| 2.25.1 |
| |