1
0
mirror of https://git.yoctoproject.org/meta-arm synced 2026-06-05 14:30:10 +00:00

arm-bsp/trusted-services: corstone-1000: Remove old capsule update implementation

This change removes the obsolete out-of-tree patches and legacy support related
to the old capsule update mechanism for the Corstone-1000 platform.
The Trusted-Services components are now aligned with the upstream implementation,
and outdated patches have been dropped or rebased as necessary.

- Removed deprecated patches targeting old capsule update logic
- Rebasing of remaining patches to ensure compatibility with updated TS interface

This prepares the platform for the new PSA FWU-based capsule update path and
reduces technical debt in Trusted-Services integration.

Signed-off-by: Harsimran Singh Tungal <harsimransingh.tungal@arm.com>
Signed-off-by: Jon Mason <jon.mason@arm.com>
This commit is contained in:
Harsimran Singh Tungal
2025-07-30 12:53:22 +01:00
committed by Jon Mason
parent 0112cd479b
commit b7e0e4c566
27 changed files with 234 additions and 2383 deletions
@@ -1,378 +0,0 @@
From fd171007b073a4cff7c3deabfdff233c0a9ed507 Mon Sep 17 00:00:00 2001
From: Julian Hall <julian.hall@arm.com>
Date: Tue, 12 Oct 2021 15:45:41 +0100
Subject: [PATCH 01/12] Add stub capsule update service components
To facilitate development of a capsule update service provider,
stub components are added to provide a starting point for an
implementation. The capsule update service provider is integrated
into the se-proxy/common deployment.
Upstream-Status: Inappropriate [Trusted-Services Design needs to be followed]
Signed-off-by: Vishnu Banavath <vishnu.banavath@arm.com>
Signed-off-by: Julian Hall <julian.hall@arm.com>
Change-Id: I0d4049bb4de5af7ca80806403301692507085d28
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
---
.../backend/capsule_update_backend.h | 24 ++++
.../provider/capsule_update_provider.c | 135 ++++++++++++++++++
.../provider/capsule_update_provider.h | 51 +++++++
.../capsule_update/provider/component.cmake | 13 ++
.../se-proxy/infra/corstone1000/infra.cmake | 1 +
deployments/se-proxy/se_proxy_interfaces.h | 9 +-
.../capsule_update/capsule_update_proto.h | 13 ++
protocols/service/capsule_update/opcodes.h | 17 +++
protocols/service/capsule_update/parameters.h | 15 ++
9 files changed, 274 insertions(+), 4 deletions(-)
create mode 100644 components/service/capsule_update/backend/capsule_update_backend.h
create mode 100644 components/service/capsule_update/provider/capsule_update_provider.c
create mode 100644 components/service/capsule_update/provider/capsule_update_provider.h
create mode 100644 components/service/capsule_update/provider/component.cmake
create mode 100644 protocols/service/capsule_update/capsule_update_proto.h
create mode 100644 protocols/service/capsule_update/opcodes.h
create mode 100644 protocols/service/capsule_update/parameters.h
diff --git a/components/service/capsule_update/backend/capsule_update_backend.h b/components/service/capsule_update/backend/capsule_update_backend.h
new file mode 100644
index 000000000..f3144ff1d
--- /dev/null
+++ b/components/service/capsule_update/backend/capsule_update_backend.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CAPSULE_UPDATE_BACKEND_H
+#define CAPSULE_UPDATE_BACKEND_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Defines the common capsule update backend interface. Concrete backends
+ * implement this interface for different types of platform.
+ */
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* CAPSULE_UPDATE_BACKEND_H */
diff --git a/components/service/capsule_update/provider/capsule_update_provider.c b/components/service/capsule_update/provider/capsule_update_provider.c
new file mode 100644
index 000000000..f35c272d2
--- /dev/null
+++ b/components/service/capsule_update/provider/capsule_update_provider.c
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <psa/client.h>
+#include <psa/sid.h>
+#include <trace.h>
+
+#include <protocols/service/capsule_update/capsule_update_proto.h>
+#include <protocols/rpc/common/packed-c/status.h>
+#include "capsule_update_provider.h"
+
+
+#define CAPSULE_UPDATE_REQUEST (0x1)
+#define KERNEL_STARTED_EVENT (0x2)
+
+enum corstone1000_ioctl_id_t {
+ IOCTL_CORSTONE1000_FWU_FLASH_IMAGES = 0,
+ IOCTL_CORSTONE1000_FWU_HOST_ACK,
+};
+
+/* Service request handlers */
+static rpc_status_t update_capsule_handler(void *context, struct rpc_request *req);
+static rpc_status_t boot_confirmed_handler(void *context, struct rpc_request *req);
+
+/* Handler mapping table for service */
+static const struct service_handler handler_table[] = {
+ {CAPSULE_UPDATE_OPCODE_UPDATE_CAPSULE, update_capsule_handler},
+ {CAPSULE_UPDATE_OPCODE_BOOT_CONFIRMED, boot_confirmed_handler}
+};
+
+struct rpc_service_interface *capsule_update_provider_init(
+ struct capsule_update_provider *context)
+{
+ struct rpc_service_interface *rpc_interface = NULL;
+ const struct rpc_uuid dummy_uuid = { .uuid = { 0 }};
+ if (!context)
+ return NULL;
+
+ service_provider_init(
+ &context->base_provider,
+ context,
+ &dummy_uuid,
+ handler_table,
+ sizeof(handler_table)/sizeof(struct service_handler));
+
+ rpc_interface = service_provider_get_rpc_interface(&context->base_provider);
+
+
+ return rpc_interface;
+}
+
+void capsule_update_provider_deinit(struct capsule_update_provider *context)
+{
+ (void)context;
+}
+
+static rpc_status_t event_handler(uint32_t opcode, struct rpc_caller_interface *caller)
+{
+ uint32_t ioctl_id;
+ psa_handle_t handle;
+ rpc_status_t rpc_status = TS_RPC_CALL_ACCEPTED;
+
+ struct psa_invec in_vec[] = {
+ { .base = &ioctl_id, .len = sizeof(ioctl_id) }
+ };
+
+ if(!caller) {
+ EMSG("event_handler rpc_caller is NULL");
+ rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
+ return rpc_status;
+ }
+
+ IMSG("event handler opcode %x", opcode);
+ switch(opcode) {
+ case CAPSULE_UPDATE_REQUEST:
+ /* Openamp call with IOCTL for firmware update*/
+ ioctl_id = IOCTL_CORSTONE1000_FWU_FLASH_IMAGES;
+ handle = psa_connect(caller, TFM_SP_PLATFORM_IOCTL_SID,
+ TFM_SP_PLATFORM_IOCTL_VERSION);
+ if (handle <= 0) {
+ EMSG("%s Invalid handle", __func__);
+ rpc_status = TS_RPC_ERROR_INVALID_PARAMETER;
+ return rpc_status;
+ }
+ psa_call(caller,handle, PSA_IPC_CALL,
+ in_vec,IOVEC_LEN(in_vec), NULL, 0);
+ break;
+
+ case KERNEL_STARTED_EVENT:
+ ioctl_id = IOCTL_CORSTONE1000_FWU_HOST_ACK;
+ /*openamp call with IOCTL for kernel start*/
+ handle = psa_connect(caller, TFM_SP_PLATFORM_IOCTL_SID,
+ TFM_SP_PLATFORM_IOCTL_VERSION);
+ if (handle <= 0) {
+ EMSG("%s Invalid handle", __func__);
+ rpc_status = TS_RPC_ERROR_INVALID_PARAMETER;
+ return rpc_status;
+ }
+ psa_call(caller,handle, PSA_IPC_CALL,
+ in_vec,IOVEC_LEN(in_vec), NULL, 0);
+ break;
+ default:
+ EMSG("%s unsupported opcode", __func__);
+ rpc_status = TS_RPC_ERROR_INVALID_PARAMETER;
+ return rpc_status;
+ }
+ return rpc_status;
+
+}
+
+static rpc_status_t update_capsule_handler(void *context, struct rpc_request *req)
+{
+ struct capsule_update_provider *this_instance = (struct capsule_update_provider*)context;
+ struct rpc_caller_interface *caller = this_instance->client.session->caller;
+ uint32_t opcode = req->opcode;
+ rpc_status_t rpc_status = TS_RPC_ERROR_NOT_READY;
+
+ rpc_status = event_handler(opcode, caller);
+ return rpc_status;
+}
+
+static rpc_status_t boot_confirmed_handler(void *context, struct rpc_request *req)
+{
+ struct capsule_update_provider *this_instance = (struct capsule_update_provider*)context;
+ struct rpc_caller_interface *caller = this_instance->client.session->caller;
+ uint32_t opcode = req->opcode;
+ rpc_status_t rpc_status = TS_RPC_ERROR_NOT_READY;
+
+ rpc_status = event_handler(opcode, caller);
+
+ return rpc_status;
+}
diff --git a/components/service/capsule_update/provider/capsule_update_provider.h b/components/service/capsule_update/provider/capsule_update_provider.h
new file mode 100644
index 000000000..5dc5535d6
--- /dev/null
+++ b/components/service/capsule_update/provider/capsule_update_provider.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CAPSULE_UPDATE_PROVIDER_H
+#define CAPSULE_UPDATE_PROVIDER_H
+
+#include <rpc/common/endpoint/rpc_service_interface.h>
+#include <service/common/provider/service_provider.h>
+#include <service/common/client/service_client.h>
+#include <service/capsule_update/backend/capsule_update_backend.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * The capsule_update_provider is a service provider that accepts update capsule
+ * requests and delegates them to a suitable backend that applies the update.
+ */
+struct capsule_update_provider
+{
+ struct service_provider base_provider;
+ struct service_client client;
+};
+
+/**
+ * \brief Initialize an instance of the capsule update service provider
+ *
+ * @param[in] context The instance to initialize
+ *
+ * \return An rpc_service_interface or NULL on failure
+ */
+struct rpc_service_interface *capsule_update_provider_init(
+ struct capsule_update_provider *context);
+
+/**
+ * \brief Cleans up when the instance is no longer needed
+ *
+ * \param[in] context The instance to de-initialize
+ */
+void capsule_update_provider_deinit(
+ struct capsule_update_provider *context);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* CAPSULE_UPDATE_PROVIDER_H */
diff --git a/components/service/capsule_update/provider/component.cmake b/components/service/capsule_update/provider/component.cmake
new file mode 100644
index 000000000..1d412eb23
--- /dev/null
+++ b/components/service/capsule_update/provider/component.cmake
@@ -0,0 +1,13 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+if (NOT DEFINED TGT)
+ message(FATAL_ERROR "mandatory parameter TGT is not defined.")
+endif()
+
+target_sources(${TGT} PRIVATE
+ "${CMAKE_CURRENT_LIST_DIR}/capsule_update_provider.c"
+ )
diff --git a/deployments/se-proxy/infra/corstone1000/infra.cmake b/deployments/se-proxy/infra/corstone1000/infra.cmake
index 3830f9d61..27af8a333 100644
--- a/deployments/se-proxy/infra/corstone1000/infra.cmake
+++ b/deployments/se-proxy/infra/corstone1000/infra.cmake
@@ -27,6 +27,7 @@ add_components(TARGET "se-proxy"
"components/service/fwu/provider/serializer"
"components/service/fwu/psa_fwu_m/agent"
"components/service/fwu/psa_fwu_m/interface/stub"
+ "components/service/capsule_update/provider"
"components/service/secure_storage/backend/secure_storage_ipc"
)
diff --git a/deployments/se-proxy/se_proxy_interfaces.h b/deployments/se-proxy/se_proxy_interfaces.h
index 48908f846..3d4a7c204 100644
--- a/deployments/se-proxy/se_proxy_interfaces.h
+++ b/deployments/se-proxy/se_proxy_interfaces.h
@@ -8,9 +8,10 @@
#define SE_PROXY_INTERFACES_H
/* Interface IDs from service endpoints available from an se-proxy deployment */
-#define SE_PROXY_INTERFACE_ID_ITS (0)
-#define SE_PROXY_INTERFACE_ID_PS (1)
-#define SE_PROXY_INTERFACE_ID_CRYPTO (2)
-#define SE_PROXY_INTERFACE_ID_ATTEST (3)
+#define SE_PROXY_INTERFACE_ID_ITS (0)
+#define SE_PROXY_INTERFACE_ID_PS (1)
+#define SE_PROXY_INTERFACE_ID_CRYPTO (2)
+#define SE_PROXY_INTERFACE_ID_ATTEST (3)
+#define SE_PROXY_INTERFACE_ID_CAPSULE_UPDATE (4)
#endif /* SE_PROXY_INTERFACES_H */
diff --git a/protocols/service/capsule_update/capsule_update_proto.h b/protocols/service/capsule_update/capsule_update_proto.h
new file mode 100644
index 000000000..8f326cd38
--- /dev/null
+++ b/protocols/service/capsule_update/capsule_update_proto.h
@@ -0,0 +1,13 @@
+/*
+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CAPSULE_UPDATE_PROTO_H
+#define CAPSULE_UPDATE_PROTO_H
+
+#include <protocols/service/capsule_update/opcodes.h>
+#include <protocols/service/capsule_update/parameters.h>
+
+#endif /* CAPSULE_UPDATE_PROTO_H */
diff --git a/protocols/service/capsule_update/opcodes.h b/protocols/service/capsule_update/opcodes.h
new file mode 100644
index 000000000..8185a0902
--- /dev/null
+++ b/protocols/service/capsule_update/opcodes.h
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CAPSULE_UPDATE_OPCODES_H
+#define CAPSULE_UPDATE_OPCODES_H
+
+/**
+ * Opcode definitions for the capsule update service
+ */
+
+#define CAPSULE_UPDATE_OPCODE_UPDATE_CAPSULE 1
+#define CAPSULE_UPDATE_OPCODE_BOOT_CONFIRMED 2
+
+#endif /* CAPSULE_UPDATE_OPCODES_H */
diff --git a/protocols/service/capsule_update/parameters.h b/protocols/service/capsule_update/parameters.h
new file mode 100644
index 000000000..285d92418
--- /dev/null
+++ b/protocols/service/capsule_update/parameters.h
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CAPSULE_UPDATE_PARAMETERS_H
+#define CAPSULE_UPDATE_PARAMETERS_H
+
+/**
+ * Operation parameter definitions for the capsule update service access protocol.
+ */
+
+
+#endif /* CAPSULE_UPDATE_PARAMETERS_H */
--
2.25.1
@@ -1,418 +0,0 @@
From fea499f48d07638417511f194c2977133fd75b4d Mon Sep 17 00:00:00 2001
From: Satish Kumar <satish.kumar01@arm.com>
Date: Fri, 8 Jul 2022 09:48:06 +0100
Subject: [PATCH 03/12] FMP Support in Corstone1000.
The FMP support is used by u-boot to pupolate ESRT information
for the kernel.
The solution is platform specific and needs to be revisted.
Signed-off-by: Satish Kumar <satish.kumar01@arm.com>
Upstream-Status: Inappropriate [The solution is platform specific and needs to be revisted]
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
---
.../provider/capsule_update_provider.c | 5 +
.../capsule_update/provider/component.cmake | 1 +
.../provider/corstone1000_fmp_service.c | 307 ++++++++++++++++++
.../provider/corstone1000_fmp_service.h | 26 ++
4 files changed, 339 insertions(+)
create mode 100644 components/service/capsule_update/provider/corstone1000_fmp_service.c
create mode 100644 components/service/capsule_update/provider/corstone1000_fmp_service.h
diff --git a/components/service/capsule_update/provider/capsule_update_provider.c b/components/service/capsule_update/provider/capsule_update_provider.c
index f35c272d2..bfeb7301a 100644
--- a/components/service/capsule_update/provider/capsule_update_provider.c
+++ b/components/service/capsule_update/provider/capsule_update_provider.c
@@ -11,6 +11,7 @@
#include <protocols/service/capsule_update/capsule_update_proto.h>
#include <protocols/rpc/common/packed-c/status.h>
#include "capsule_update_provider.h"
+#include "corstone1000_fmp_service.h"
#define CAPSULE_UPDATE_REQUEST (0x1)
@@ -49,6 +50,8 @@ struct rpc_service_interface *capsule_update_provider_init(
rpc_interface = service_provider_get_rpc_interface(&context->base_provider);
+ provision_fmp_variables_metadata(context->client.session->caller);
+
return rpc_interface;
}
@@ -87,6 +90,7 @@ static rpc_status_t event_handler(uint32_t opcode, struct rpc_caller_interface *
}
psa_call(caller,handle, PSA_IPC_CALL,
in_vec,IOVEC_LEN(in_vec), NULL, 0);
+ set_fmp_image_info(caller, handle);
break;
case KERNEL_STARTED_EVENT:
@@ -101,6 +105,7 @@ static rpc_status_t event_handler(uint32_t opcode, struct rpc_caller_interface *
}
psa_call(caller,handle, PSA_IPC_CALL,
in_vec,IOVEC_LEN(in_vec), NULL, 0);
+ set_fmp_image_info(caller, handle);
break;
default:
EMSG("%s unsupported opcode", __func__);
diff --git a/components/service/capsule_update/provider/component.cmake b/components/service/capsule_update/provider/component.cmake
index 1d412eb23..6b0601494 100644
--- a/components/service/capsule_update/provider/component.cmake
+++ b/components/service/capsule_update/provider/component.cmake
@@ -10,4 +10,5 @@ endif()
target_sources(${TGT} PRIVATE
"${CMAKE_CURRENT_LIST_DIR}/capsule_update_provider.c"
+ "${CMAKE_CURRENT_LIST_DIR}/corstone1000_fmp_service.c"
)
diff --git a/components/service/capsule_update/provider/corstone1000_fmp_service.c b/components/service/capsule_update/provider/corstone1000_fmp_service.c
new file mode 100644
index 000000000..2222251a7
--- /dev/null
+++ b/components/service/capsule_update/provider/corstone1000_fmp_service.c
@@ -0,0 +1,307 @@
+/*
+ * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "corstone1000_fmp_service.h"
+#include <psa/client.h>
+#include <psa/sid.h>
+#include <psa/storage_common.h>
+#include <trace.h>
+
+#include <service/uefi/smm_variable/backend/variable_index.h>
+
+#define VARIABLE_INDEX_STORAGE_UID (0x787)
+
+/**
+ * Variable attributes
+ */
+#define EFI_VARIABLE_NON_VOLATILE (0x00000001)
+#define EFI_VARIABLE_BOOTSERVICE_ACCESS (0x00000002)
+#define EFI_VARIABLE_RUNTIME_ACCESS (0x00000004)
+#define EFI_VARIABLE_HARDWARE_ERROR_RECORD (0x00000008)
+#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS (0x00000010)
+#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS (0x00000020)
+#define EFI_VARIABLE_APPEND_WRITE (0x00000040)
+#define EFI_VARIABLE_MASK \
+ (EFI_VARIABLE_NON_VOLATILE | \
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | \
+ EFI_VARIABLE_RUNTIME_ACCESS | \
+ EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
+ EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
+ EFI_VARIABLE_APPEND_WRITE)
+
+#define FMP_VARIABLES_COUNT 6
+
+static struct variable_metadata fmp_variables_metadata[FMP_VARIABLES_COUNT] = {
+ {
+ { 0x86c77a67, 0x0b97, 0x4633, \
+ { 0xa1, 0x87, 0x49, 0x10, 0x4d, 0x06, 0x85, 0xc7} },
+ /* name size = (variable_name + \0) * sizeof(u16) */
+ .name_size = 42, { 'F', 'm', 'p', 'D', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'V', 'e', 'r', 's', 'i', 'o', 'n' },
+ .attributes = EFI_VARIABLE_NON_VOLATILE, .uid = 0
+ },
+ {
+ { 0x86c77a67, 0x0b97, 0x4633, \
+ { 0xa1, 0x87, 0x49, 0x10, 0x4d, 0x06, 0x85, 0xc7} },
+ /* name size = (variable_name + \0) * sizeof(u16) */
+ .name_size = 34, { 'F', 'm', 'p', 'I', 'm', 'a', 'g', 'e', 'I', 'n', 'f', 'o', 'S', 'i', 'z', 'e' },
+ .attributes = EFI_VARIABLE_NON_VOLATILE, .uid = 0
+ },
+ {
+ { 0x86c77a67, 0x0b97, 0x4633, \
+ { 0xa1, 0x87, 0x49, 0x10, 0x4d, 0x06, 0x85, 0xc7} },
+ /* name size = (variable_name + \0) * sizeof(u16) */
+ .name_size = 38, { 'F', 'm', 'p', 'D', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'C', 'o', 'u', 'n', 't' },
+ .attributes = EFI_VARIABLE_NON_VOLATILE, .uid = 0
+ },
+ {
+ { 0x86c77a67, 0x0b97, 0x4633, \
+ { 0xa1, 0x87, 0x49, 0x10, 0x4d, 0x06, 0x85, 0xc7} },
+ /* name size = (variable_name + \0) * sizeof(u16) */
+ .name_size = 26, { 'F', 'm', 'p', 'I', 'm', 'a', 'g', 'e', 'I', 'n', 'f', 'o' },
+ .attributes = EFI_VARIABLE_NON_VOLATILE, .uid = 0
+ },
+ {
+ { 0x86c77a67, 0x0b97, 0x4633, \
+ { 0xa1, 0x87, 0x49, 0x10, 0x4d, 0x06, 0x85, 0xc7} },
+ /* name size = (variable_name + \0) * sizeof(u16) */
+ .name_size = 28, { 'F', 'm', 'p', 'I', 'm', 'a', 'g', 'e', 'N', 'a', 'm', 'e', '1' },
+ .attributes = EFI_VARIABLE_NON_VOLATILE, .uid = 0
+ },
+ {
+ { 0x86c77a67, 0x0b97, 0x4633, \
+ { 0xa1, 0x87, 0x49, 0x10, 0x4d, 0x06, 0x85, 0xc7} },
+ /* name size = (variable_name + \0) * sizeof(u16) */
+ .name_size = 32, { 'F', 'm', 'p', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'N', 'a', 'm', 'e', '1' },
+ .attributes = EFI_VARIABLE_NON_VOLATILE, .uid = 0
+ },
+};
+
+static psa_status_t protected_storage_set(struct rpc_caller_interface *caller,
+ psa_storage_uid_t uid, size_t data_length, const void *p_data)
+{
+ psa_status_t psa_status;
+ psa_storage_create_flags_t create_flags = PSA_STORAGE_FLAG_NONE;
+
+ struct psa_invec in_vec[] = {
+ { .base = psa_ptr_to_u32(&uid), .len = sizeof(uid) },
+ { .base = psa_ptr_const_to_u32(p_data), .len = data_length },
+ { .base = psa_ptr_to_u32(&create_flags), .len = sizeof(create_flags) },
+ };
+
+ psa_status = psa_call(caller, TFM_PROTECTED_STORAGE_SERVICE_HANDLE, TFM_PS_ITS_SET,
+ in_vec, IOVEC_LEN(in_vec), NULL, 0);
+ if (psa_status < 0)
+ EMSG("ipc_set: psa_call failed: %d", psa_status);
+
+ return psa_status;
+}
+
+static psa_status_t protected_storage_get(struct rpc_caller_interface *caller,
+ psa_storage_uid_t uid, size_t data_size, void *p_data)
+{
+ psa_status_t psa_status;
+ uint32_t offset = 0;
+
+ struct psa_invec in_vec[] = {
+ { .base = psa_ptr_to_u32(&uid), .len = sizeof(uid) },
+ { .base = psa_ptr_to_u32(&offset), .len = sizeof(offset) },
+ };
+
+ struct psa_outvec out_vec[] = {
+ { .base = psa_ptr_to_u32(p_data), .len = data_size },
+ };
+
+ psa_status = psa_call(caller, TFM_PROTECTED_STORAGE_SERVICE_HANDLE,
+ TFM_PS_ITS_GET, in_vec, IOVEC_LEN(in_vec),
+ out_vec, IOVEC_LEN(out_vec));
+
+ if (psa_status == PSA_SUCCESS && out_vec[0].len != data_size) {
+ EMSG("Return size does not match with expected size.");
+ return PSA_ERROR_BUFFER_TOO_SMALL;
+ }
+
+ return psa_status;
+}
+
+static uint64_t name_hash(EFI_GUID *guid, size_t name_size,
+ const int16_t *name)
+{
+ /* Using djb2 hash by Dan Bernstein */
+ uint64_t hash = 5381;
+
+ /* Calculate hash over GUID */
+ hash = ((hash << 5) + hash) + guid->Data1;
+ hash = ((hash << 5) + hash) + guid->Data2;
+ hash = ((hash << 5) + hash) + guid->Data3;
+
+ for (int i = 0; i < 8; ++i) {
+
+ hash = ((hash << 5) + hash) + guid->Data4[i];
+ }
+
+ /* Extend to cover name up to but not including null terminator */
+ for (int i = 0; i < name_size / sizeof(int16_t); ++i) {
+
+ if (!name[i]) break;
+ hash = ((hash << 5) + hash) + name[i];
+ }
+
+ return hash;
+}
+
+
+static void initialize_metadata(void)
+{
+ for (int i = 0; i < FMP_VARIABLES_COUNT; i++) {
+
+ fmp_variables_metadata[i].uid = name_hash(
+ &fmp_variables_metadata[i].guid,
+ fmp_variables_metadata[i].name_size,
+ fmp_variables_metadata[i].name);
+ }
+}
+
+
+void provision_fmp_variables_metadata(struct rpc_caller_interface *caller)
+{
+ struct variable_metadata metadata;
+ psa_status_t status;
+ uint32_t dummy_values = 0xDEAD;
+
+ EMSG("Provisioning FMP metadata.");
+
+ initialize_metadata();
+
+ status = protected_storage_get(caller, VARIABLE_INDEX_STORAGE_UID,
+ sizeof(struct variable_metadata), &metadata);
+
+ if (status == PSA_SUCCESS) {
+ EMSG("UEFI variables store is already provisioned.");
+ return;
+ }
+
+ /* Provision FMP variables with dummy values. */
+ for (int i = 0; i < FMP_VARIABLES_COUNT; i++) {
+ protected_storage_set(caller, fmp_variables_metadata[i].uid,
+ sizeof(dummy_values), &dummy_values);
+ }
+
+ status = protected_storage_set(caller, VARIABLE_INDEX_STORAGE_UID,
+ sizeof(struct variable_metadata) * FMP_VARIABLES_COUNT,
+ fmp_variables_metadata);
+
+ if (status != EFI_SUCCESS) {
+ return;
+ }
+
+ EMSG("FMP metadata is provisioned");
+}
+
+typedef struct {
+ void *base;
+ int len;
+} variable_data_t;
+
+static variable_data_t fmp_variables_data[FMP_VARIABLES_COUNT];
+
+#define IMAGE_INFO_BUFFER_SIZE 256
+static char image_info_buffer[IMAGE_INFO_BUFFER_SIZE];
+#define IOCTL_CORSTONE1000_FMP_IMAGE_INFO 2
+
+static psa_status_t unpack_image_info(void *buffer, uint32_t size)
+{
+ typedef struct __attribute__ ((__packed__)) {
+ uint32_t variable_count;
+ uint32_t variable_size[FMP_VARIABLES_COUNT];
+ uint8_t variable[];
+ } packed_buffer_t;
+
+ packed_buffer_t *packed_buffer = buffer;
+ int runner = 0;
+
+ if (packed_buffer->variable_count != FMP_VARIABLES_COUNT) {
+ EMSG("Expected fmp varaibles = %u, but received = %u",
+ FMP_VARIABLES_COUNT, packed_buffer->variable_count);
+ return PSA_ERROR_PROGRAMMER_ERROR;
+ }
+
+ for (int i = 0; i < packed_buffer->variable_count; i++) {
+ EMSG("FMP variable %d : size %u", i, packed_buffer->variable_size[i]);
+ fmp_variables_data[i].base = &packed_buffer->variable[runner];
+ fmp_variables_data[i].len= packed_buffer->variable_size[i];
+ runner += packed_buffer->variable_size[i];
+ }
+
+ return PSA_SUCCESS;
+}
+
+static psa_status_t get_image_info(struct rpc_caller_interface *caller,
+ psa_handle_t platform_service_handle)
+{
+ psa_status_t status;
+ psa_handle_t handle;
+ uint32_t ioctl_id = IOCTL_CORSTONE1000_FMP_IMAGE_INFO;
+
+ struct psa_invec in_vec[] = {
+ { .base = &ioctl_id, .len = sizeof(ioctl_id) },
+ };
+
+ struct psa_outvec out_vec[] = {
+ { .base = image_info_buffer, .len = IMAGE_INFO_BUFFER_SIZE },
+ };
+
+ memset(image_info_buffer, 0, IMAGE_INFO_BUFFER_SIZE);
+
+ psa_call(caller, platform_service_handle, PSA_IPC_CALL,
+ in_vec, IOVEC_LEN(in_vec), out_vec, IOVEC_LEN(out_vec));
+
+ status = unpack_image_info(image_info_buffer, IMAGE_INFO_BUFFER_SIZE);
+ if (status != PSA_SUCCESS) {
+ return status;
+ }
+
+ return PSA_SUCCESS;
+}
+
+static psa_status_t set_image_info(struct rpc_caller_interface *caller)
+{
+ psa_status_t status;
+
+ for (int i = 0; i < FMP_VARIABLES_COUNT; i++) {
+
+ status = protected_storage_set(caller,
+ fmp_variables_metadata[i].uid,
+ fmp_variables_data[i].len, fmp_variables_data[i].base);
+
+ if (status != PSA_SUCCESS) {
+
+ EMSG("FMP variable %d set unsuccessful", i);
+ return status;
+ }
+
+ EMSG("FMP variable %d set success", i);
+ }
+
+ return PSA_SUCCESS;
+}
+
+void set_fmp_image_info(struct rpc_caller_interface *caller,
+ psa_handle_t platform_service_handle)
+{
+ psa_status_t status;
+
+ status = get_image_info(caller, platform_service_handle);
+ if (status != PSA_SUCCESS) {
+ return;
+ }
+
+ status = set_image_info(caller);
+ if (status != PSA_SUCCESS) {
+ return;
+ }
+
+ return;
+}
diff --git a/components/service/capsule_update/provider/corstone1000_fmp_service.h b/components/service/capsule_update/provider/corstone1000_fmp_service.h
new file mode 100644
index 000000000..d0023dc07
--- /dev/null
+++ b/components/service/capsule_update/provider/corstone1000_fmp_service.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CORSTONE1000_FMP_SERVICE_H
+#define CORSTONE1000_FMP_SERVICE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rpc_caller.h>
+#include <psa/client.h>
+
+void provision_fmp_variables_metadata(struct rpc_caller_interface *caller);
+
+void set_fmp_image_info(struct rpc_caller_interface *caller,
+ psa_handle_t platform_service_handle);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* CORSTONE1000_FMP_SERVICE_H */
--
2.25.1
@@ -1,141 +0,0 @@
From 81d1dbe3f04195c0ad26790e127d61149e4f5b78 Mon Sep 17 00:00:00 2001
From: Emekcan Aras <emekcan.aras@arm.com>
Date: Sun, 18 Jun 2023 14:38:42 +0100
Subject: [PATCH 05/12] plat: corstone1000: Use the stateless platform service
calls Calls to psa_connect is not needed and psa_call can be called directly
with a pre defined handle.
Signed-off-by: Satish Kumar <satish.kumar01@arm.com>
Signed-off-by: Mohamed Omar Asaker <mohamed.omarasaker@arm.com>
Signed-off-by: Emekcan Aras <emekcan.aras@arm.com>
Upstream-Status: Inappropriate [Design is to revisted]
---
.../provider/capsule_update_provider.c | 24 ++++---------------
.../provider/corstone1000_fmp_service.c | 10 ++++----
.../provider/corstone1000_fmp_service.h | 3 +--
components/service/common/include/psa/sid.h | 7 ++++++
4 files changed, 17 insertions(+), 27 deletions(-)
diff --git a/components/service/capsule_update/provider/capsule_update_provider.c b/components/service/capsule_update/provider/capsule_update_provider.c
index bfeb7301a..12c552dae 100644
--- a/components/service/capsule_update/provider/capsule_update_provider.c
+++ b/components/service/capsule_update/provider/capsule_update_provider.c
@@ -63,7 +63,6 @@ void capsule_update_provider_deinit(struct capsule_update_provider *context)
static rpc_status_t event_handler(uint32_t opcode, struct rpc_caller_interface *caller)
{
uint32_t ioctl_id;
- psa_handle_t handle;
rpc_status_t rpc_status = TS_RPC_CALL_ACCEPTED;
struct psa_invec in_vec[] = {
@@ -81,31 +80,18 @@ static rpc_status_t event_handler(uint32_t opcode, struct rpc_caller_interface *
case CAPSULE_UPDATE_REQUEST:
/* Openamp call with IOCTL for firmware update*/
ioctl_id = IOCTL_CORSTONE1000_FWU_FLASH_IMAGES;
- handle = psa_connect(caller, TFM_SP_PLATFORM_IOCTL_SID,
- TFM_SP_PLATFORM_IOCTL_VERSION);
- if (handle <= 0) {
- EMSG("%s Invalid handle", __func__);
- rpc_status = TS_RPC_ERROR_INVALID_PARAMETER;
- return rpc_status;
- }
- psa_call(caller,handle, PSA_IPC_CALL,
+ psa_call(caller,TFM_PLATFORM_SERVICE_HANDLE, TFM_PLATFORM_API_ID_IOCTL,
in_vec,IOVEC_LEN(in_vec), NULL, 0);
- set_fmp_image_info(caller, handle);
+ set_fmp_image_info(caller);
break;
case KERNEL_STARTED_EVENT:
ioctl_id = IOCTL_CORSTONE1000_FWU_HOST_ACK;
/*openamp call with IOCTL for kernel start*/
- handle = psa_connect(caller, TFM_SP_PLATFORM_IOCTL_SID,
- TFM_SP_PLATFORM_IOCTL_VERSION);
- if (handle <= 0) {
- EMSG("%s Invalid handle", __func__);
- rpc_status = TS_RPC_ERROR_INVALID_PARAMETER;
- return rpc_status;
- }
- psa_call(caller,handle, PSA_IPC_CALL,
+
+ psa_call(caller,TFM_PLATFORM_SERVICE_HANDLE, TFM_PLATFORM_API_ID_IOCTL,
in_vec,IOVEC_LEN(in_vec), NULL, 0);
- set_fmp_image_info(caller, handle);
+ set_fmp_image_info(caller);
break;
default:
EMSG("%s unsupported opcode", __func__);
diff --git a/components/service/capsule_update/provider/corstone1000_fmp_service.c b/components/service/capsule_update/provider/corstone1000_fmp_service.c
index 2222251a7..2ed0f33c5 100644
--- a/components/service/capsule_update/provider/corstone1000_fmp_service.c
+++ b/components/service/capsule_update/provider/corstone1000_fmp_service.c
@@ -238,8 +238,7 @@ static psa_status_t unpack_image_info(void *buffer, uint32_t size)
return PSA_SUCCESS;
}
-static psa_status_t get_image_info(struct rpc_caller_interface *caller,
- psa_handle_t platform_service_handle)
+static psa_status_t get_image_info(struct rpc_caller_interface *caller)
{
psa_status_t status;
psa_handle_t handle;
@@ -255,7 +254,7 @@ static psa_status_t get_image_info(struct rpc_caller_interface *caller,
memset(image_info_buffer, 0, IMAGE_INFO_BUFFER_SIZE);
- psa_call(caller, platform_service_handle, PSA_IPC_CALL,
+ psa_call(caller, TFM_PLATFORM_SERVICE_HANDLE, TFM_PLATFORM_API_ID_IOCTL,
in_vec, IOVEC_LEN(in_vec), out_vec, IOVEC_LEN(out_vec));
status = unpack_image_info(image_info_buffer, IMAGE_INFO_BUFFER_SIZE);
@@ -288,12 +287,11 @@ static psa_status_t set_image_info(struct rpc_caller_interface *caller)
return PSA_SUCCESS;
}
-void set_fmp_image_info(struct rpc_caller_interface *caller,
- psa_handle_t platform_service_handle)
+void set_fmp_image_info(struct rpc_caller_interface *caller)
{
psa_status_t status;
- status = get_image_info(caller, platform_service_handle);
+ status = get_image_info(caller);
if (status != PSA_SUCCESS) {
return;
}
diff --git a/components/service/capsule_update/provider/corstone1000_fmp_service.h b/components/service/capsule_update/provider/corstone1000_fmp_service.h
index d0023dc07..486fa10b4 100644
--- a/components/service/capsule_update/provider/corstone1000_fmp_service.h
+++ b/components/service/capsule_update/provider/corstone1000_fmp_service.h
@@ -16,8 +16,7 @@ extern "C" {
void provision_fmp_variables_metadata(struct rpc_caller_interface *caller);
-void set_fmp_image_info(struct rpc_caller_interface *caller,
- psa_handle_t platform_service_handle);
+void set_fmp_image_info(struct rpc_caller_interface *caller);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/components/service/common/include/psa/sid.h b/components/service/common/include/psa/sid.h
index 5aaa659d4..fc3a4fb06 100644
--- a/components/service/common/include/psa/sid.h
+++ b/components/service/common/include/psa/sid.h
@@ -40,6 +40,13 @@ extern "C" {
#define TFM_CRYPTO_VERSION (1U)
#define TFM_CRYPTO_HANDLE (0x40000100U)
+/******** TFM_PLATFORM_SERVICE *******/
+#define TFM_PLATFORM_API_ID_IOCTL (1013)
+#define TFM_PLATFORM_SERVICE_HANDLE (0x40000105U)
+
+/**
+ * \brief Define a progressive numerical value for each SID which can be used
+ * when dispatching the requests to the service
/******** TFM_SP_PLATFORM ********/
#define TFM_SP_PLATFORM_SYSTEM_RESET_SID (0x00000040U)
#define TFM_SP_PLATFORM_SYSTEM_RESET_VERSION (1U)
--
2.25.1
@@ -1,106 +0,0 @@
From 8a6542231613d5f1b60bc209a7ad8f8cf72bc95a Mon Sep 17 00:00:00 2001
From: Bence Balogh <bence.balogh@arm.com>
Date: Wed, 29 Nov 2023 15:40:21 +0100
Subject: [PATCH 06/12] plat: corstone1000: Initialize capsule update provider
Initializes the capsule update service provider in se-proxy-sp.c deployment
for corstone1000.
Signed-off-by: Emekcan Aras <emekcan.aras@arm.com>
Upstream-Status: Inappropriate [Design is to revisted]
---
.../se-proxy/env/commonsp/se_proxy_sp.c | 14 +++++++++-
.../corstone1000/service_proxy_factory.c | 28 +++++++++++++++++++
.../se-proxy/infra/service_proxy_factory.h | 1 +
3 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/deployments/se-proxy/env/commonsp/se_proxy_sp.c b/deployments/se-proxy/env/commonsp/se_proxy_sp.c
index 485d76493..88e4cf17e 100644
--- a/deployments/se-proxy/env/commonsp/se_proxy_sp.c
+++ b/deployments/se-proxy/env/commonsp/se_proxy_sp.c
@@ -39,7 +39,7 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
goto fatal_error;
}
- rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 5, 16);
+ rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 6, 16);
if (rpc_status != RPC_SUCCESS) {
EMSG("Failed to initialize RPC endpoint: %d", rpc_status);
goto fatal_error;
@@ -94,6 +94,18 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
goto fatal_error;
}
+ rpc_iface = capsule_update_proxy_create();
+ if (!rpc_iface) {
+ EMSG("Failed to create Capsule Update proxy");
+ goto fatal_error;
+ }
+
+ rpc_status = ts_rpc_endpoint_sp_add_service(&rpc_endpoint, rpc_iface);
+ if (rpc_status != RPC_SUCCESS) {
+ EMSG("Failed to add service to RPC endpoint: %d", rpc_status);
+ goto fatal_error;
+ }
+
rpc_iface = fwu_proxy_create();
if (!rpc_iface) {
EMSG("Failed to create FWU proxy");
diff --git a/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c b/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c
index 759983b46..185a6cd97 100644
--- a/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c
+++ b/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c
@@ -11,6 +11,7 @@
#include <rpc/rse_comms/caller/sp/rse_comms_caller.h>
#include <service/attestation/provider/attest_provider.h>
#include <service/attestation/provider/serializer/packed-c/packedc_attest_provider_serializer.h>
+#include <service/capsule_update/provider/capsule_update_provider.h>
#include <service/crypto/factory/crypto_provider_factory.h>
#include "service/fwu/psa_fwu_m/agent/psa_fwu_m_update_agent.h"
#include "service/fwu/provider/fwu_provider.h"
@@ -141,3 +142,30 @@ struct rpc_service_interface *fwu_proxy_create(void)
return fwu_provider_init(&fwu_provider, agent);
}
+
+struct rpc_service_interface *capsule_update_proxy_create(void)
+{
+ static struct capsule_update_provider capsule_update_provider;
+ static struct secure_storage_ipc capsule_update_backend;
+ rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
+
+ /* Static objects for proxy instance */
+ static struct rpc_caller_interface rse_comms = { 0 };
+ static struct rpc_caller_session rpc_session = { 0 };
+
+ rpc_status = rse_comms_caller_init(&rse_comms);
+ if (rpc_status != RPC_SUCCESS)
+ return NULL;
+
+ rpc_status = rpc_caller_session_open(&rpc_session, &rse_comms, &dummy_uuid, 0, 0);
+ if (rpc_status != RPC_SUCCESS)
+ return NULL;
+
+
+ capsule_update_provider.client.session = &rpc_session;
+ capsule_update_provider.client.rpc_status = RPC_SUCCESS;
+ capsule_update_provider.client.service_info.supported_encodings = 0;
+ capsule_update_provider.client.service_info.max_payload = 4096;
+
+ return capsule_update_provider_init(&capsule_update_provider);
+}
diff --git a/deployments/se-proxy/infra/service_proxy_factory.h b/deployments/se-proxy/infra/service_proxy_factory.h
index be83319b8..88b377063 100644
--- a/deployments/se-proxy/infra/service_proxy_factory.h
+++ b/deployments/se-proxy/infra/service_proxy_factory.h
@@ -18,6 +18,7 @@ struct rpc_service_interface *crypto_proxy_create(void);
struct rpc_service_interface *ps_proxy_create(void);
struct rpc_service_interface *its_proxy_create(void);
struct rpc_service_interface *fwu_proxy_create(void);
+struct rpc_service_interface *capsule_update_proxy_create(void);
#ifdef __cplusplus
}
--
2.25.1
@@ -1,28 +1,29 @@
From c490956e50e721c8f2db5934ae5af365ba92e55a Mon Sep 17 00:00:00 2001
From a986e751f6d4ef34bdc3847cfb02e6f24fbb0702 Mon Sep 17 00:00:00 2001
From: Bence Balogh <bence.balogh@arm.com>
Date: Mon, 25 Nov 2024 22:13:15 +0100
Subject: [PATCH 2/3] Revert "Load and store UEFI variable index in chunks"
Subject: [PATCH 01/12] Revert "Load and store UEFI variable index in chunks"
This reverts commit a0a08571084238af2a24d4e6e580308f86ab59a2.
The PSA IPC backend for the Protected Storage doesn't support the optional
create() and set_extended() APIs. This feature has to be reverted because
create() and set_extended() APIs. This feature has to be reverted because
of this.
Keep this inappropriate patch until the usage of create() and set_extended()
Keep this inappropriate patch until the usage of create() and set_extended()
APIs are not optional in the SMM-Gateway.
Upstream-Status: Inappropriate [To be redesigned]
Signed-off-by: Bence Balogh <bence.balogh@arm.com>
Signed-off-by: Harsimran Singh Tungal <harsimransingh.tungal@arm.com>
---
.../backend/test/variable_store_tests.cpp | 100 +-----------------
.../backend/uefi_variable_store.c | 84 +++------------
.../backend/test/variable_store_tests.cpp | 100 +--------------
.../backend/uefi_variable_store.c | 115 ++++--------------
deployments/smm-gateway/common/smm_gateway.c | 4 +
3 files changed, 22 insertions(+), 166 deletions(-)
3 files changed, 28 insertions(+), 191 deletions(-)
diff --git a/components/service/uefi/smm_variable/backend/test/variable_store_tests.cpp b/components/service/uefi/smm_variable/backend/test/variable_store_tests.cpp
index e0f21f77a..2a8c8eb94 100644
index 0f962f20..7c7435fb 100644
--- a/components/service/uefi/smm_variable/backend/test/variable_store_tests.cpp
+++ b/components/service/uefi/smm_variable/backend/test/variable_store_tests.cpp
@@ -56,12 +56,6 @@ TEST_GROUP(UefiVariableStoreTests)
@@ -57,12 +57,6 @@ TEST_GROUP(UefiVariableStoreTests)
return var_name;
}
@@ -35,7 +36,7 @@ index e0f21f77a..2a8c8eb94 100644
size_t string_get_size_in_bytes(const std::u16string &string)
{
return string.size() * sizeof(uint16_t);
@@ -266,9 +260,9 @@ TEST_GROUP(UefiVariableStoreTests)
@@ -267,9 +261,9 @@ TEST_GROUP(UefiVariableStoreTests)
MAX_VARIABLE_SIZE);
}
@@ -44,14 +45,13 @@ index e0f21f77a..2a8c8eb94 100644
static const size_t MAX_VARIABLE_SIZE = 3000;
- static const size_t STORE_CAPACITY = MAX_VARIABLES * MAX_VARIABLE_SIZE;
+ static const size_t STORE_CAPACITY = 10000;
static const uint32_t OWNER_ID = 100;
/*
@@ -773,93 +767,3 @@ TEST(UefiVariableStoreTests, noRemoveCheck)
EFI_VARIABLE_NON_VOLATILE);
static const size_t VARIABLE_INDEX_MAX_SIZE =
sizeof(uint32_t) +
MAX_VARIABLES * (sizeof(struct variable_metadata) +
@@ -784,96 +778,6 @@ TEST(UefiVariableStoreTests, noRemoveCheck)
UNSIGNED_LONGLONGS_EQUAL(EFI_INVALID_PARAMETER, status);
}
-
-TEST(UefiVariableStoreTests, fillStore)
-{
- efi_status_t status = EFI_SUCCESS;
@@ -141,50 +141,77 @@ index e0f21f77a..2a8c8eb94 100644
- LONGS_EQUAL(0, input_data.compare(output_data));
- }
-}
-
TEST(UefiVariableStoreTests, variableIndexCounterOverflow)
{
efi_status_t efi_status = EFI_SUCCESS;
diff --git a/components/service/uefi/smm_variable/backend/uefi_variable_store.c b/components/service/uefi/smm_variable/backend/uefi_variable_store.c
index 459ca4566..e5fc32864 100644
index 48b81ff3..e90ed172 100644
--- a/components/service/uefi/smm_variable/backend/uefi_variable_store.c
+++ b/components/service/uefi/smm_variable/backend/uefi_variable_store.c
@@ -615,41 +615,26 @@ static efi_status_t load_variable_index(struct uefi_variable_store *context)
@@ -716,59 +716,29 @@ static psa_status_t get_active_variable_uid(struct uefi_variable_store *context,
static efi_status_t load_variable_index(struct uefi_variable_store *context)
{
struct storage_backend *persistent_store = context->persistent_store.storage_backend;
- psa_status_t psa_status = PSA_SUCCESS;
if (persistent_store) {
size_t data_len = 0;
- size_t data_offset = 0;
- struct psa_storage_info_t variable_index_info = { 0 };
-
- psa_status = get_active_variable_uid(context, &context->active_variable_index_uid,
- &context->variable_index.counter);
- switch (psa_status) {
- case PSA_SUCCESS:
- break;
- do {
- psa_status_t psa_status = persistent_store->interface->get(
- persistent_store->context, context->owner_id,
- SMM_VARIABLE_INDEX_STORAGE_UID, data_offset,
- RPC_CALLER_SESSION_SHARED_MEMORY_SIZE,
- context->index_sync_buffer + data_offset, &data_len);
- case PSA_ERROR_DOES_NOT_EXIST:
- IMSG("Variable index does not exist in NV store, continuing with empty index");
- return EFI_SUCCESS;
+ psa_status_t psa_status = persistent_store->interface->get(
+ persistent_store->context, context->owner_id,
+ SMM_VARIABLE_INDEX_STORAGE_UID, 0, context->index_sync_buffer_size,
+ context->index_sync_buffer, &data_len);
- switch (psa_status) {
- default:
- EMSG("Loading variable index failed: %d", psa_status);
- return EFI_LOAD_ERROR;
- }
-
- /* Make sure the variable index fits the buffer */
- persistent_store->interface->get_info(persistent_store->context, context->owner_id,
- context->active_variable_index_uid,
- &variable_index_info);
-
- if (variable_index_info.size > context->index_sync_buffer_size) {
- EMSG("Variable index cannot fit the sync buffer");
- return EFI_LOAD_ERROR;
- }
+ switch(psa_status) {
case PSA_SUCCESS:
- data_offset += data_len;
-
- if (data_offset > context->index_sync_buffer_size) {
- EMSG("Variable index cannot fit the sync buffer");
- return EFI_LOAD_ERROR;
- }
-
+ case PSA_SUCCESS:
+ (void) variable_index_restore(&context->variable_index, data_len,
+ context->index_sync_buffer);
break;
case PSA_ERROR_DOES_NOT_EXIST:
IMSG("Index variable does not exist in NV store, continuing with empty index");
- return EFI_SUCCESS;
+ break;
default:
- do {
- psa_status = persistent_store->interface->get(
- persistent_store->context, context->owner_id,
- context->active_variable_index_uid, data_offset,
- RPC_CALLER_SESSION_SHARED_MEMORY_SIZE,
- context->index_sync_buffer + data_offset, &data_len);
+ case PSA_ERROR_DOES_NOT_EXIST:
+ IMSG("Index variable does not exist in NV store, continuing with empty index");
+ break;
- if (psa_status != PSA_SUCCESS) {
+ default:
EMSG("Loading variable index failed: %d", psa_status);
return EFI_LOAD_ERROR;
- }
-
- data_offset += data_len;
-
- } while (data_len == RPC_CALLER_SESSION_SHARED_MEMORY_SIZE);
-
- variable_index_restore(&context->variable_index, data_offset,
@@ -196,8 +223,8 @@ index 459ca4566..e5fc32864 100644
}
return EFI_SUCCESS;
@@ -658,14 +643,13 @@ static efi_status_t load_variable_index(struct uefi_variable_store *context)
static efi_status_t sync_variable_index(const struct uefi_variable_store *context)
@@ -777,14 +747,13 @@ static efi_status_t load_variable_index(struct uefi_variable_store *context)
static efi_status_t sync_variable_index(struct uefi_variable_store *context)
{
efi_status_t status = EFI_SUCCESS;
- psa_status_t psa_status = PSA_SUCCESS;
@@ -213,27 +240,29 @@ index 459ca4566..e5fc32864 100644
if (status != EFI_SUCCESS)
return status;
@@ -674,52 +658,16 @@ static efi_status_t sync_variable_index(const struct uefi_variable_store *contex
@@ -793,56 +762,16 @@ static efi_status_t sync_variable_index(struct uefi_variable_store *context)
context->persistent_store.storage_backend;
if (persistent_store) {
- size_t data_offset = 0;
- uint64_t next_index_uid = 0;
-
- /* Write the older one */
- next_index_uid = (context->active_variable_index_uid ==
- SMM_VARIABLE_INDEX_STORAGE_A_UID ?
- SMM_VARIABLE_INDEX_STORAGE_B_UID :
- SMM_VARIABLE_INDEX_STORAGE_A_UID);
-
- psa_status = persistent_store->interface->remove(
+ psa_status_t psa_status = persistent_store->interface->set(
persistent_store->context, context->owner_id,
- SMM_VARIABLE_INDEX_STORAGE_UID);
- persistent_store->context, context->owner_id, next_index_uid);
-
- if (psa_status != PSA_SUCCESS && psa_status != PSA_ERROR_DOES_NOT_EXIST)
- goto end;
+ SMM_VARIABLE_INDEX_STORAGE_UID, data_len,
+ context->index_sync_buffer, PSA_STORAGE_FLAG_NONE);
-
- /* Check if the index exists and create if not yet */
- psa_status = persistent_store->interface->create(
- persistent_store->context, context->owner_id,
- SMM_VARIABLE_INDEX_STORAGE_UID, remaining_data_len,
- PSA_STORAGE_FLAG_NONE);
- persistent_store->context, context->owner_id, next_index_uid,
- remaining_data_len, PSA_STORAGE_FLAG_NONE);
-
- if (psa_status != PSA_SUCCESS)
- goto end;
@@ -244,8 +273,7 @@ index 459ca4566..e5fc32864 100644
-
- psa_status = persistent_store->interface->set_extended(
- persistent_store->context, context->owner_id,
- SMM_VARIABLE_INDEX_STORAGE_UID, data_offset,
- data_of_this_iteration,
- next_index_uid, data_offset, data_of_this_iteration,
- context->index_sync_buffer + data_offset);
-
- if (psa_status != PSA_SUCCESS)
@@ -255,7 +283,11 @@ index 459ca4566..e5fc32864 100644
- remaining_data_len -= data_of_this_iteration;
-
- } while (remaining_data_len);
-
+ psa_status_t psa_status = persistent_store->interface->set(
+ persistent_store->context, context->owner_id,
+ SMM_VARIABLE_INDEX_STORAGE_UID, data_len,
+ context->index_sync_buffer, PSA_STORAGE_FLAG_NONE);
- variable_index_confirm_write(&context->variable_index);
- context->active_variable_index_uid = next_index_uid;
- } else {
@@ -272,7 +304,7 @@ index 459ca4566..e5fc32864 100644
/* Check attribute usage rules */
diff --git a/deployments/smm-gateway/common/smm_gateway.c b/deployments/smm-gateway/common/smm_gateway.c
index 3ab45ccf5..eaa861370 100644
index 3ab45ccf..eaa86137 100644
--- a/deployments/smm-gateway/common/smm_gateway.c
+++ b/deployments/smm-gateway/common/smm_gateway.c
@@ -40,6 +40,10 @@
@@ -287,5 +319,5 @@ index 3ab45ccf5..eaa861370 100644
* The SP heap must be large enough for storing the UEFI variable index, the RPC shared memory and
* ~16kB of miscellaneous data.
--
2.25.1
2.34.1
@@ -1,49 +0,0 @@
From eddadb001463495307fb33f99e8cb41b9722ace1 Mon Sep 17 00:00:00 2001
From: Bence Balogh <bence.balogh@arm.com>
Date: Fri, 5 Apr 2024 17:31:03 +0200
Subject: [PATCH 07/12] plat: corstone1000: add client_id for FMP service
Corstone1000 uses trusted-firmware-m as secure enclave software component. Due
to the changes in TF-M 2.0, psa services requires a seperate client_id now.
This commit adds smm-gateway-sp client id to the FMP services since FMP structure
accessed by u-boot via smm-gateway-sp.
Signed-off-by: emeara01 <emekcan.aras@arm.com>
Upstream-Status: Inappropriate [Design is to revisted]
---
.../capsule_update/provider/corstone1000_fmp_service.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/components/service/capsule_update/provider/corstone1000_fmp_service.c b/components/service/capsule_update/provider/corstone1000_fmp_service.c
index 2ed0f33c5..58c2cceaf 100644
--- a/components/service/capsule_update/provider/corstone1000_fmp_service.c
+++ b/components/service/capsule_update/provider/corstone1000_fmp_service.c
@@ -33,6 +33,7 @@
EFI_VARIABLE_APPEND_WRITE)
#define FMP_VARIABLES_COUNT 6
+#define SMM_GW_SP_ID 0x8003
static struct variable_metadata fmp_variables_metadata[FMP_VARIABLES_COUNT] = {
{
@@ -91,7 +92,7 @@ static psa_status_t protected_storage_set(struct rpc_caller_interface *caller,
{ .base = psa_ptr_to_u32(&create_flags), .len = sizeof(create_flags) },
};
- psa_status = psa_call(caller, TFM_PROTECTED_STORAGE_SERVICE_HANDLE, TFM_PS_ITS_SET,
+ psa_status = psa_call_client_id(caller, TFM_PROTECTED_STORAGE_SERVICE_HANDLE, SMM_GW_SP_ID,TFM_PS_ITS_SET,
in_vec, IOVEC_LEN(in_vec), NULL, 0);
if (psa_status < 0)
EMSG("ipc_set: psa_call failed: %d", psa_status);
@@ -114,7 +115,7 @@ static psa_status_t protected_storage_get(struct rpc_caller_interface *caller,
{ .base = psa_ptr_to_u32(p_data), .len = data_size },
};
- psa_status = psa_call(caller, TFM_PROTECTED_STORAGE_SERVICE_HANDLE,
+ psa_status = psa_call_client_id(caller, TFM_PROTECTED_STORAGE_SERVICE_HANDLE, SMM_GW_SP_ID,
TFM_PS_ITS_GET, in_vec, IOVEC_LEN(in_vec),
out_vec, IOVEC_LEN(out_vec));
--
2.25.1
@@ -0,0 +1,71 @@
From 77dbb98428b0661f0ceee54208d226fc7fb27130 Mon Sep 17 00:00:00 2001
From: Harsimran Singh Tungal <harsimransingh.tungal@arm.com>
Date: Sun, 1 Jun 2025 11:06:00 +0000
Subject: [PATCH 02/11] se proxy protobuf change
Upstream-Status: Pending (not yet submitted to upstream)
Signed-off-by: Emekcan Aras <emekcan.aras@arm.com>
Signed-off-by: Harsimran Singh Tungal <harsimransingh.tungal@arm.com>
---
.../se-proxy/env/commonsp/se_proxy_sp.c | 24 ++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/deployments/se-proxy/env/commonsp/se_proxy_sp.c b/deployments/se-proxy/env/commonsp/se_proxy_sp.c
index 485d7649..9f94092b 100644
--- a/deployments/se-proxy/env/commonsp/se_proxy_sp.c
+++ b/deployments/se-proxy/env/commonsp/se_proxy_sp.c
@@ -13,6 +13,7 @@
#include "trace.h"
#include "deployments/se-proxy/infra/service_proxy_factory.h"
#include "deployments/se-proxy/se_proxy_interfaces.h"
+#include <service/crypto/factory/crypto_provider_factory.h>
static bool sp_init(uint16_t *own_sp_id);
@@ -25,6 +26,8 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
uint16_t own_id = 0;
sp_result result = SP_RESULT_INTERNAL_ERROR;
rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
+ struct rpc_service_interface *crypto_iface_protobuf = NULL;
+ struct crypto_provider *crypto_protobuf_provider = NULL;
/* Boot phase */
if (!sp_init(&own_id)) {
@@ -39,7 +42,7 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
goto fatal_error;
}
- rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 5, 16);
+ rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 6, 16);
if (rpc_status != RPC_SUCCESS) {
EMSG("Failed to initialize RPC endpoint: %d", rpc_status);
goto fatal_error;
@@ -106,6 +109,25 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
goto fatal_error;
}
+ crypto_protobuf_provider = crypto_protobuf_provider_factory_create();
+ if (!crypto_protobuf_provider) {
+ EMSG("Failed to create crypto protobuf provider factory");
+ goto fatal_error;
+ }
+
+ crypto_iface_protobuf = service_provider_get_rpc_interface(
+ &crypto_protobuf_provider->base_provider);
+ if (!crypto_iface_protobuf) {
+ EMSG("Failed to create service provider RPC interface");
+ goto fatal_error;
+ }
+
+ rpc_status = ts_rpc_endpoint_sp_add_service(&rpc_endpoint, crypto_iface_protobuf);
+ if (rpc_status != RPC_SUCCESS) {
+ EMSG("Failed to add service to RPC endpoint: %d", rpc_status);
+ goto fatal_error;
+ }
+
/* End of boot phase */
result = sp_msg_wait(&req_msg);
if (result != SP_RESULT_OK) {
--
2.34.1
@@ -1,7 +1,7 @@
From fcc7701baf4246e5ceebe4d50db223cb70a0c00f Mon Sep 17 00:00:00 2001
From f385ddacc8cc62842f7c9c91622d59959c41e718 Mon Sep 17 00:00:00 2001
From: Harsimran Singh Tungal <harsimransingh.tungal@arm.com>
Date: Thu, 28 Nov 2024 12:02:28 +0000
Subject: [PATCH 1/8] Integrate PSA FWU IPC framework for Corstone-1000
Subject: [PATCH 04/11] Integrate PSA FWU IPC framework for Corstone-1000
Integrate IPC framework for PSA FWU calls between Cortex-A side and Cortex-M subsystems.
@@ -26,7 +26,7 @@ Signed-off-by: Harsimran Singh Tungal <harsimransingh.tungal@arm.com>
create mode 100644 components/service/fwu/psa_fwu_m/interface/psa_ipc/psa_fwu_ipc.h
diff --git a/components/service/common/include/psa/sid.h b/components/service/common/include/psa/sid.h
index fc3a4fb0..4830f438 100644
index 5aaa659d..0235764d 100644
--- a/components/service/common/include/psa/sid.h
+++ b/components/service/common/include/psa/sid.h
@@ -1,5 +1,5 @@
@@ -36,7 +36,7 @@ index fc3a4fb0..4830f438 100644
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -65,6 +65,10 @@ extern "C" {
@@ -58,6 +58,10 @@ extern "C" {
#define TFM_ATTEST_GET_TOKEN_SIZE 1002
/******** TFM_SP_FWU ********/
@@ -381,7 +381,7 @@ index 00000000..867a1c9c
+#endif /* PSA_FWU_IPC_H */
+
diff --git a/deployments/se-proxy/infra/corstone1000/infra.cmake b/deployments/se-proxy/infra/corstone1000/infra.cmake
index 27af8a33..0b04149a 100644
index 3830f9d6..2bf6b36e 100644
--- a/deployments/se-proxy/infra/corstone1000/infra.cmake
+++ b/deployments/se-proxy/infra/corstone1000/infra.cmake
@@ -26,7 +26,7 @@ add_components(TARGET "se-proxy"
@@ -390,14 +390,14 @@ index 27af8a33..0b04149a 100644
"components/service/fwu/psa_fwu_m/agent"
- "components/service/fwu/psa_fwu_m/interface/stub"
+ "components/service/fwu/psa_fwu_m/interface/psa_ipc"
"components/service/capsule_update/provider"
"components/service/secure_storage/backend/secure_storage_ipc"
)
diff --git a/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c b/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c
index 8872abcb..ef91efe0 100644
index 759983b4..547e84bc 100644
--- a/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c
+++ b/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c
@@ -15,6 +15,7 @@
@@ -14,6 +14,7 @@
#include <service/crypto/factory/crypto_provider_factory.h>
#include "service/fwu/psa_fwu_m/agent/psa_fwu_m_update_agent.h"
#include "service/fwu/provider/fwu_provider.h"
@@ -405,7 +405,7 @@ index 8872abcb..ef91efe0 100644
#include <service/secure_storage/frontend/secure_storage_provider/secure_storage_provider.h>
#include "service/secure_storage/frontend/secure_storage_provider/secure_storage_uuid.h"
#include <trace.h>
@@ -135,10 +136,25 @@ struct rpc_service_interface *its_proxy_create(void)
@@ -134,10 +135,25 @@ struct rpc_service_interface *its_proxy_create(void)
struct rpc_service_interface *fwu_proxy_create(void)
{
@@ -432,5 +432,5 @@ index 8872abcb..ef91efe0 100644
return fwu_provider_init(&fwu_provider, agent);
}
--
2.25.1
2.34.1
@@ -1,716 +0,0 @@
From f0c1c15fc8886349f7aeb04e1328472894b674d7 Mon Sep 17 00:00:00 2001
From: Bence Balogh <bence.balogh@arm.com>
Date: Mon, 25 Nov 2024 22:11:33 +0100
Subject: [PATCH 1/3] Revert "Make variable index usage robust with redundancy"
This reverts commit 8e394bbfae1dccf86a6a5428471e1b10fdaa74ec.
This revert is needed because the FMP support added for Corstone-1000 only
works if the SMM_VARIABLE_INDEX_STORAGE_UID is 0x787. See the implementation
in the 0003-FMP-Support-in-Corstone1000.patch file.
The 0003-FMP-Support-in-Corstone1000.patch is also inappropriate and will be
redesigned. Instead of fixing that patch, revert this redundancy feature until
the FMP support is redesigned.
Upstream-Status: Inappropriate [To be removed after new FWU design]
Signed-off-by: Bence Balogh <bence.balogh@arm.com>
---
.../backend/test/variable_index_tests.cpp | 50 ++---
.../backend/test/variable_store_tests.cpp | 166 ----------------
.../backend/uefi_variable_store.c | 181 +++---------------
.../backend/uefi_variable_store.h | 1 -
.../smm_variable/backend/variable_index.c | 29 +--
.../smm_variable/backend/variable_index.h | 3 +-
6 files changed, 46 insertions(+), 384 deletions(-)
diff --git a/components/service/uefi/smm_variable/backend/test/variable_index_tests.cpp b/components/service/uefi/smm_variable/backend/test/variable_index_tests.cpp
index cf0f6a12e..a52cfbf76 100644
--- a/components/service/uefi/smm_variable/backend/test/variable_index_tests.cpp
+++ b/components/service/uefi/smm_variable/backend/test/variable_index_tests.cpp
@@ -208,8 +208,7 @@ TEST(UefiVariableIndexTests, enumerateStore)
TEST(UefiVariableIndexTests, dumpLoadRoadtrip)
{
- uint8_t buffer[sizeof(uint32_t) +
- MAX_VARIABLES * (sizeof(struct variable_metadata) + sizeof(bool))];
+ uint8_t buffer[MAX_VARIABLES * sizeof(struct variable_metadata)];
create_variables();
@@ -223,13 +222,7 @@ TEST(UefiVariableIndexTests, dumpLoadRoadtrip)
CHECK_TRUE(is_dirty);
UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
- /*
- * Variable index counter is at the beginning, which is followed by metadata and
- * constraint status byte of both NV variables
- */
- UNSIGNED_LONGS_EQUAL(sizeof(uint32_t) +
- ((sizeof(struct variable_metadata) + sizeof(bool)) * 2),
- dump_len);
+ UNSIGNED_LONGS_EQUAL(((sizeof(struct variable_metadata) + sizeof(bool)) * 2), dump_len);
/* Expect no records to be dirty when the dump is repeated */
dump_len = 0;
@@ -238,9 +231,7 @@ TEST(UefiVariableIndexTests, dumpLoadRoadtrip)
UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
CHECK_FALSE(is_dirty);
- UNSIGNED_LONGS_EQUAL(sizeof(uint32_t) +
- ((sizeof(struct variable_metadata) + sizeof(bool)) * 2),
- dump_len);
+ UNSIGNED_LONGS_EQUAL(((sizeof(struct variable_metadata) + sizeof(bool)) * 2), dump_len);
/* Tear down and reinitialize to simulate a reboot */
variable_index_deinit(&m_variable_index);
@@ -279,8 +270,7 @@ TEST(UefiVariableIndexTests, dumpLoadRoadtrip)
TEST(UefiVariableIndexTests, dumpLoadConstrainedVariable)
{
- uint8_t buffer[sizeof(uint32_t) +
- MAX_VARIABLES * (sizeof(struct variable_metadata) + sizeof(bool))];
+ uint8_t buffer[MAX_VARIABLES * sizeof(struct variable_metadata)];
create_variables();
@@ -314,13 +304,8 @@ TEST(UefiVariableIndexTests, dumpLoadConstrainedVariable)
UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
CHECK_TRUE(is_dirty);
- /*
- * Variable index counter is at the beginning, which is followed by metadata and
- * constraint status byte of both NV variables, but only one of them has
- * constraints
- */
- UNSIGNED_LONGS_EQUAL(sizeof(uint32_t) +
- (sizeof(struct variable_metadata) + sizeof(bool)) * 2 +
+ /* metadata and constraint status byte are stored for both NV variables, but only one of them has constraints */
+ UNSIGNED_LONGS_EQUAL((sizeof(struct variable_metadata) + sizeof(bool)) * 2 +
sizeof(struct variable_constraints),
dump_len);
@@ -331,11 +316,7 @@ TEST(UefiVariableIndexTests, dumpLoadConstrainedVariable)
TEST(UefiVariableIndexTests, dumpBufferTooSmall)
{
- /*
- * Enough to fit the variable index counter and the metadata and constraint
- * status of a single variable
- */
- uint8_t buffer[sizeof(uint32_t) + sizeof(struct variable_metadata) + sizeof(bool)];
+ uint8_t buffer[1 * sizeof(struct variable_metadata) + 1];
create_variables();
@@ -357,8 +338,7 @@ TEST(UefiVariableIndexTests, dumpBufferTooSmall)
TEST(UefiVariableIndexTests, removeVariable)
{
- uint8_t buffer[sizeof(uint32_t) +
- MAX_VARIABLES * (sizeof(struct variable_metadata) + sizeof(bool))];
+ uint8_t buffer[MAX_VARIABLES * sizeof(struct variable_metadata)];
struct variable_info *info = NULL;
create_variables();
@@ -378,12 +358,7 @@ TEST(UefiVariableIndexTests, removeVariable)
CHECK_TRUE(is_dirty);
UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
- /*
- * Dump to now contains the variable index counter and metadata,
- * constraint status data of a variable
- */
- UNSIGNED_LONGS_EQUAL(sizeof(uint32_t) + sizeof(struct variable_metadata) + sizeof(bool),
- dump_len);
+ UNSIGNED_LONGS_EQUAL(sizeof(struct variable_metadata) + sizeof(bool), dump_len);
/* Remove the volatile variable */
info = variable_index_find(&m_variable_index, &guid_1, string_get_size_in_bytes(name_1),
@@ -398,8 +373,7 @@ TEST(UefiVariableIndexTests, removeVariable)
CHECK_FALSE(is_dirty);
UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
- UNSIGNED_LONGS_EQUAL(sizeof(uint32_t) + sizeof(struct variable_metadata) + sizeof(bool),
- dump_len);
+ UNSIGNED_LONGS_EQUAL(sizeof(struct variable_metadata) + sizeof(bool), dump_len);
/* Remove the remaining NV variable */
info = variable_index_find(&m_variable_index, &guid_1, string_get_size_in_bytes(name_3),
@@ -407,14 +381,14 @@ TEST(UefiVariableIndexTests, removeVariable)
variable_index_clear_variable(&m_variable_index, info);
- /* Expect index to be dirty and dump to now contains only the variable index counter */
+ /* Expect index to be dirty and dump to now be empty */
dump_len = 0;
status = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len,
&is_dirty);
CHECK_TRUE(is_dirty);
UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
- UNSIGNED_LONGS_EQUAL(sizeof(uint32_t), dump_len);
+ UNSIGNED_LONGS_EQUAL(0, dump_len);
/* Enumerate and now expect an empty index */
info = NULL;
diff --git a/components/service/uefi/smm_variable/backend/test/variable_store_tests.cpp b/components/service/uefi/smm_variable/backend/test/variable_store_tests.cpp
index 0f962f206..e0f21f77a 100644
--- a/components/service/uefi/smm_variable/backend/test/variable_store_tests.cpp
+++ b/components/service/uefi/smm_variable/backend/test/variable_store_tests.cpp
@@ -5,7 +5,6 @@
*/
#include <CppUTest/TestHarness.h>
-#include <limits>
#include <service/secure_storage/backend/mock_store/mock_store.h>
#include <service/uefi/smm_variable/backend/uefi_variable_store.h>
#include <string.h>
@@ -270,17 +269,8 @@ TEST_GROUP(UefiVariableStoreTests)
static const size_t MAX_VARIABLES = 5;
static const size_t MAX_VARIABLE_SIZE = 3000;
static const size_t STORE_CAPACITY = MAX_VARIABLES * MAX_VARIABLE_SIZE;
- static const size_t VARIABLE_INDEX_MAX_SIZE =
- sizeof(uint32_t) +
- MAX_VARIABLES * (sizeof(struct variable_metadata) +
- sizeof(struct variable_constraints) + sizeof(bool));
static const uint32_t OWNER_ID = 100;
-
- /* Synchronize these with the variables with the store */
- uint64_t DEFAULT_VARIABLE_INDEX_STORAGE_A_UID = 0x8000000000000001;
- uint64_t DEFAULT_VARIABLE_INDEX_STORAGE_B_UID = 0x8000000000000002;
-
/*
* Make sure the variable buffer in the test is way above the limit
* so the buffer problems will be handled by the component
@@ -873,159 +863,3 @@ TEST(UefiVariableStoreTests, fillIndex)
LONGS_EQUAL(0, input_data.compare(output_data));
}
}
-
-TEST(UefiVariableStoreTests, variableIndexCounterOverflow)
-{
- efi_status_t efi_status = EFI_SUCCESS;
- psa_status_t psa_status = PSA_SUCCESS;
- std::u16string var_name = u"var";
- std::string input_data = "a";
- uint32_t attributes = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS |
- EFI_VARIABLE_RUNTIME_ACCESS;
- /* There are no variables set in the index, only the counter is there */
- uint8_t buffer[sizeof(uint32_t)] = { 0 };
-
- mock_store_reset(&m_persistent_store);
-
- /* Counter of index A is 0 */
- psa_status = m_persistent_store.backend.interface->set(
- m_persistent_store.backend.context, OWNER_ID, DEFAULT_VARIABLE_INDEX_STORAGE_A_UID,
- sizeof(buffer), &buffer, PSA_STORAGE_FLAG_NONE);
- UNSIGNED_LONGLONGS_EQUAL(PSA_SUCCESS, psa_status);
-
- /* Set max counter value */
- buffer[0] = 0xFF;
- buffer[1] = 0xFF;
- buffer[2] = 0xFF;
- buffer[3] = 0xFF;
-
- /* Counter of index B is max value */
- psa_status = m_persistent_store.backend.interface->set(
- m_persistent_store.backend.context, OWNER_ID, DEFAULT_VARIABLE_INDEX_STORAGE_B_UID,
- sizeof(buffer), &buffer, PSA_STORAGE_FLAG_NONE);
- UNSIGNED_LONGLONGS_EQUAL(PSA_SUCCESS, psa_status);
-
- /* At next initialization of the store index A should be the latest index with counter value 0 */
- uefi_variable_store_deinit(&m_uefi_variable_store);
-
- efi_status = uefi_variable_store_init(&m_uefi_variable_store, OWNER_ID, MAX_VARIABLES,
- m_persistent_backend, m_volatile_backend);
- UNSIGNED_LONGLONGS_EQUAL(EFI_SUCCESS, efi_status);
-
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.active_variable_index_uid,
- DEFAULT_VARIABLE_INDEX_STORAGE_A_UID);
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.variable_index.counter, 0);
-
- /* After setting a variable to trigger sync and rebooting index B should be the latest index with counter value 1*/
- efi_status = set_variable(var_name, input_data, attributes);
- UNSIGNED_LONGLONGS_EQUAL(EFI_SUCCESS, efi_status);
-
- power_cycle();
-
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.active_variable_index_uid,
- DEFAULT_VARIABLE_INDEX_STORAGE_B_UID);
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.variable_index.counter, 1);
-}
-
-TEST(UefiVariableStoreTests, oneEmptyVariableIndexExists)
-{
- psa_status_t status = PSA_SUCCESS;
-
- /* Only, variable index A exists, but it is empty */
- mock_store_reset(&m_persistent_store);
-
- status = m_persistent_store.backend.interface->create(m_persistent_store.backend.context,
- OWNER_ID,
- DEFAULT_VARIABLE_INDEX_STORAGE_A_UID,
- 100, PSA_STORAGE_FLAG_NONE);
- UNSIGNED_LONGLONGS_EQUAL(PSA_SUCCESS, status);
-
- power_cycle();
-
- /* Empty index is considered non-existing so default index (A) is selected */
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.active_variable_index_uid,
- DEFAULT_VARIABLE_INDEX_STORAGE_A_UID);
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.variable_index.counter, 0);
-
- /* Only, variable index B exists, but it is empty*/
- mock_store_reset(&m_persistent_store);
-
- status = m_persistent_store.backend.interface->create(m_persistent_store.backend.context,
- OWNER_ID,
- DEFAULT_VARIABLE_INDEX_STORAGE_B_UID,
- 100, PSA_STORAGE_FLAG_NONE);
- UNSIGNED_LONGLONGS_EQUAL(PSA_SUCCESS, status);
-
- power_cycle();
-
- /* Empty index is considered non-existing so default index (A) is selected */
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.active_variable_index_uid,
- DEFAULT_VARIABLE_INDEX_STORAGE_A_UID);
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.variable_index.counter, 0);
-}
-
-TEST(UefiVariableStoreTests, oneVariableIndexAlreadySet)
-{
- efi_status_t status = EFI_SUCCESS;
- /* Empty variable index with zero counter value */
- uint8_t buffer[VARIABLE_INDEX_MAX_SIZE] = { 0 };
-
- /* Set index A in the store with some data, so it will be found as the currently active index */
- mock_store_reset(&m_persistent_store);
-
- status = m_persistent_store.backend.interface->set(
- m_persistent_store.backend.context, OWNER_ID, DEFAULT_VARIABLE_INDEX_STORAGE_A_UID,
- sizeof(buffer), &buffer, PSA_STORAGE_FLAG_NONE);
- UNSIGNED_LONGLONGS_EQUAL(PSA_SUCCESS, status);
-
- power_cycle();
-
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.active_variable_index_uid,
- DEFAULT_VARIABLE_INDEX_STORAGE_A_UID);
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.variable_index.counter, 0);
-
- /* Set index B in the store with some data, so it will be found as the currently active index */
- mock_store_reset(&m_persistent_store);
-
- status = m_persistent_store.backend.interface->set(
- m_persistent_store.backend.context, OWNER_ID, DEFAULT_VARIABLE_INDEX_STORAGE_B_UID,
- sizeof(buffer), &buffer, PSA_STORAGE_FLAG_NONE);
- UNSIGNED_LONGLONGS_EQUAL(PSA_SUCCESS, status);
-
- power_cycle();
-
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.active_variable_index_uid,
- DEFAULT_VARIABLE_INDEX_STORAGE_B_UID);
- UNSIGNED_LONGLONGS_EQUAL(m_uefi_variable_store.variable_index.counter, 0);
-}
-
-TEST(UefiVariableStoreTests, variableIndexesWithSameData)
-{
- psa_status_t psa_status = PSA_SUCCESS;
- efi_status_t efi_status = EFI_SUCCESS;
- /* Empty variable index with zero counter value */
- uint8_t buffer[VARIABLE_INDEX_MAX_SIZE] = { 0 };
-
- /* Set both indexes to the same data and counter value */
- mock_store_reset(&m_persistent_store);
-
- psa_status = m_persistent_store.backend.interface->set(
- m_persistent_store.backend.context, OWNER_ID, DEFAULT_VARIABLE_INDEX_STORAGE_A_UID,
- sizeof(buffer), &buffer, PSA_STORAGE_FLAG_NONE);
- UNSIGNED_LONGLONGS_EQUAL(PSA_SUCCESS, psa_status);
-
- psa_status = m_persistent_store.backend.interface->set(
- m_persistent_store.backend.context, OWNER_ID, DEFAULT_VARIABLE_INDEX_STORAGE_B_UID,
- sizeof(buffer), &buffer, PSA_STORAGE_FLAG_NONE);
- UNSIGNED_LONGLONGS_EQUAL(PSA_SUCCESS, psa_status);
-
- /*
- * Initializing the store should fail, because if there are two indexes with the same counter it cannot be decided
- * which has the valid data.
- */
- uefi_variable_store_deinit(&m_uefi_variable_store);
-
- efi_status = uefi_variable_store_init(&m_uefi_variable_store, OWNER_ID, MAX_VARIABLES,
- m_persistent_backend, m_volatile_backend);
- UNSIGNED_LONGLONGS_EQUAL(EFI_LOAD_ERROR, efi_status);
-}
diff --git a/components/service/uefi/smm_variable/backend/uefi_variable_store.c b/components/service/uefi/smm_variable/backend/uefi_variable_store.c
index 48b81ff37..459ca4566 100644
--- a/components/service/uefi/smm_variable/backend/uefi_variable_store.c
+++ b/components/service/uefi/smm_variable/backend/uefi_variable_store.c
@@ -28,12 +28,9 @@
#include "service/crypto/client/psa/crypto_client.h"
#endif
-static psa_status_t get_active_variable_uid(struct uefi_variable_store *context,
- uint64_t *active_index_uid, uint32_t *counter);
-
static efi_status_t load_variable_index(struct uefi_variable_store *context);
-static efi_status_t sync_variable_index(struct uefi_variable_store *context);
+static efi_status_t sync_variable_index(const struct uefi_variable_store *context);
static efi_status_t check_capabilities(const SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE *var);
@@ -138,14 +135,6 @@ static bool compare_name_to_key_store_name(const int16_t *name1, size_t size1,
const uint16_t *name2, size_t size2);
#endif
-/* Private UID for storing the variable index */
-#define SMM_VARIABLE_INDEX_STORAGE_A_UID UINT64_C(0x8000000000000001)
-#define SMM_VARIABLE_INDEX_STORAGE_B_UID UINT64_C(0x8000000000000002)
-
-_Static_assert(SMM_VARIABLE_INDEX_STORAGE_A_UID != SMM_VARIABLE_INDEX_STORAGE_B_UID,
- "SMM_VARIABLE_INDEX_STORAGE_A_UID must not be the same value as "
- "SMM_VARIABLE_INDEX_STORAGE_B_UID");
-
/* Default maximum variable size -
* may be overridden using uefi_variable_store_set_storage_limits()
*/
@@ -398,7 +387,7 @@ efi_status_t uefi_variable_store_set_variable(const struct uefi_variable_store *
* index entry.
*/
if (should_sync_index)
- status = sync_variable_index((struct uefi_variable_store *)context);
+ status = sync_variable_index(context);
/* Store any variable data to the storage backend with the updated metadata */
if (info->is_variable_set && (status == EFI_SUCCESS)) {
@@ -620,148 +609,40 @@ efi_status_t uefi_variable_store_get_var_check_property(
return status;
}
-/* Checks which index contains the latest data, which shall be loaded */
-static psa_status_t get_active_variable_uid(struct uefi_variable_store *context,
- uint64_t *active_index_uid, uint32_t *counter)
-{
- uint32_t counter_A = 0;
- uint32_t counter_B = 0;
- size_t data_len = 0;
- psa_status_t psa_status_A = PSA_SUCCESS;
- psa_status_t psa_status_B = PSA_SUCCESS;
- struct storage_backend *persistent_store = context->persistent_store.storage_backend;
-
- /* Set default value for the case when the index does not exist yet */
- *active_index_uid = SMM_VARIABLE_INDEX_STORAGE_A_UID;
- *counter = 0;
-
- if (persistent_store) {
- psa_status_A = persistent_store->interface->get(persistent_store->context,
- context->owner_id,
- SMM_VARIABLE_INDEX_STORAGE_A_UID, 0,
- sizeof(counter_A), &counter_A,
- &data_len);
-
- if (psa_status_A == PSA_SUCCESS && data_len == 0) {
- psa_status_A = persistent_store->interface->remove(
- persistent_store->context, context->owner_id,
- SMM_VARIABLE_INDEX_STORAGE_A_UID);
-
- if (psa_status_A == PSA_SUCCESS)
- psa_status_A = PSA_ERROR_DOES_NOT_EXIST;
- else {
- EMSG("Erronous state of variable index");
- return PSA_ERROR_STORAGE_FAILURE;
- }
- }
-
- psa_status_B = persistent_store->interface->get(persistent_store->context,
- context->owner_id,
- SMM_VARIABLE_INDEX_STORAGE_B_UID, 0,
- sizeof(counter_B), &counter_B,
- &data_len);
-
- if (psa_status_B == PSA_SUCCESS && data_len == 0) {
- psa_status_B = persistent_store->interface->remove(
- persistent_store->context, context->owner_id,
- SMM_VARIABLE_INDEX_STORAGE_B_UID);
-
- if (psa_status_B == PSA_SUCCESS)
- psa_status_B = PSA_ERROR_DOES_NOT_EXIST;
- else {
- EMSG("Erronous state of variable index");
- return PSA_ERROR_STORAGE_FAILURE;
- }
- }
-
- if ((psa_status_A != PSA_SUCCESS && psa_status_A != PSA_ERROR_DOES_NOT_EXIST) ||
- (psa_status_B != PSA_SUCCESS && psa_status_B != PSA_ERROR_DOES_NOT_EXIST))
- return PSA_ERROR_STORAGE_FAILURE;
-
- if (psa_status_A == PSA_ERROR_DOES_NOT_EXIST) {
- if (psa_status_B == PSA_ERROR_DOES_NOT_EXIST)
- return PSA_ERROR_DOES_NOT_EXIST;
-
- *active_index_uid = SMM_VARIABLE_INDEX_STORAGE_B_UID;
- *counter = counter_B;
-
- return PSA_SUCCESS;
- } else if (psa_status_B == PSA_ERROR_DOES_NOT_EXIST) {
- *active_index_uid = SMM_VARIABLE_INDEX_STORAGE_A_UID;
- *counter = counter_A;
-
- return PSA_SUCCESS;
- }
-
- if (counter_A + 1 == counter_B) {
- *active_index_uid = SMM_VARIABLE_INDEX_STORAGE_B_UID;
- *counter = counter_B;
- return PSA_SUCCESS;
- } else if (counter_B + 1 == counter_A) {
- *active_index_uid = SMM_VARIABLE_INDEX_STORAGE_A_UID;
- *counter = counter_A;
- return PSA_SUCCESS;
- } else {
- EMSG("UEFI metadata variable index is invalid.");
- return PSA_ERROR_STORAGE_FAILURE;
- }
- } else {
- EMSG("Store backend is not accessible");
- return PSA_ERROR_STORAGE_FAILURE;
- }
-
- return PSA_ERROR_STORAGE_FAILURE;
-}
-
static efi_status_t load_variable_index(struct uefi_variable_store *context)
{
struct storage_backend *persistent_store = context->persistent_store.storage_backend;
- psa_status_t psa_status = PSA_SUCCESS;
if (persistent_store) {
size_t data_len = 0;
size_t data_offset = 0;
- struct psa_storage_info_t variable_index_info = { 0 };
-
- psa_status = get_active_variable_uid(context, &context->active_variable_index_uid,
- &context->variable_index.counter);
- switch (psa_status) {
- case PSA_SUCCESS:
- break;
-
- case PSA_ERROR_DOES_NOT_EXIST:
- IMSG("Variable index does not exist in NV store, continuing with empty index");
- return EFI_SUCCESS;
-
- default:
- EMSG("Loading variable index failed: %d", psa_status);
- return EFI_LOAD_ERROR;
- }
-
- /* Make sure the variable index fits the buffer */
- persistent_store->interface->get_info(persistent_store->context, context->owner_id,
- context->active_variable_index_uid,
- &variable_index_info);
-
- if (variable_index_info.size > context->index_sync_buffer_size) {
- EMSG("Variable index cannot fit the sync buffer");
- return EFI_LOAD_ERROR;
- }
do {
- psa_status = persistent_store->interface->get(
+ psa_status_t psa_status = persistent_store->interface->get(
persistent_store->context, context->owner_id,
- context->active_variable_index_uid, data_offset,
+ SMM_VARIABLE_INDEX_STORAGE_UID, data_offset,
RPC_CALLER_SESSION_SHARED_MEMORY_SIZE,
context->index_sync_buffer + data_offset, &data_len);
- if (psa_status != PSA_SUCCESS) {
+ switch (psa_status) {
+ case PSA_SUCCESS:
+ data_offset += data_len;
+
+ if (data_offset > context->index_sync_buffer_size) {
+ EMSG("Variable index cannot fit the sync buffer");
+ return EFI_LOAD_ERROR;
+ }
+
+ break;
+
+ case PSA_ERROR_DOES_NOT_EXIST:
+ IMSG("Index variable does not exist in NV store, continuing with empty index");
+ return EFI_SUCCESS;
+
+ default:
EMSG("Loading variable index failed: %d", psa_status);
return EFI_LOAD_ERROR;
}
-
- data_offset += data_len;
-
} while (data_len == RPC_CALLER_SESSION_SHARED_MEMORY_SIZE);
variable_index_restore(&context->variable_index, data_offset,
@@ -774,7 +655,7 @@ static efi_status_t load_variable_index(struct uefi_variable_store *context)
return EFI_SUCCESS;
}
-static efi_status_t sync_variable_index(struct uefi_variable_store *context)
+static efi_status_t sync_variable_index(const struct uefi_variable_store *context)
{
efi_status_t status = EFI_SUCCESS;
psa_status_t psa_status = PSA_SUCCESS;
@@ -794,24 +675,19 @@ static efi_status_t sync_variable_index(struct uefi_variable_store *context)
if (persistent_store) {
size_t data_offset = 0;
- uint64_t next_index_uid = 0;
-
- /* Write the older one */
- next_index_uid = (context->active_variable_index_uid ==
- SMM_VARIABLE_INDEX_STORAGE_A_UID ?
- SMM_VARIABLE_INDEX_STORAGE_B_UID :
- SMM_VARIABLE_INDEX_STORAGE_A_UID);
psa_status = persistent_store->interface->remove(
- persistent_store->context, context->owner_id, next_index_uid);
+ persistent_store->context, context->owner_id,
+ SMM_VARIABLE_INDEX_STORAGE_UID);
if (psa_status != PSA_SUCCESS && psa_status != PSA_ERROR_DOES_NOT_EXIST)
goto end;
/* Check if the index exists and create if not yet */
psa_status = persistent_store->interface->create(
- persistent_store->context, context->owner_id, next_index_uid,
- remaining_data_len, PSA_STORAGE_FLAG_NONE);
+ persistent_store->context, context->owner_id,
+ SMM_VARIABLE_INDEX_STORAGE_UID, remaining_data_len,
+ PSA_STORAGE_FLAG_NONE);
if (psa_status != PSA_SUCCESS)
goto end;
@@ -822,7 +698,8 @@ static efi_status_t sync_variable_index(struct uefi_variable_store *context)
psa_status = persistent_store->interface->set_extended(
persistent_store->context, context->owner_id,
- next_index_uid, data_offset, data_of_this_iteration,
+ SMM_VARIABLE_INDEX_STORAGE_UID, data_offset,
+ data_of_this_iteration,
context->index_sync_buffer + data_offset);
if (psa_status != PSA_SUCCESS)
@@ -1827,7 +1704,7 @@ static void purge_orphan_index_entries(const struct uefi_variable_store *context
}
if (any_orphans)
- sync_variable_index((struct uefi_variable_store *)context);
+ sync_variable_index(context);
}
static struct delegate_variable_store *
diff --git a/components/service/uefi/smm_variable/backend/uefi_variable_store.h b/components/service/uefi/smm_variable/backend/uefi_variable_store.h
index 9f2c4a00c..2493ff6b4 100644
--- a/components/service/uefi/smm_variable/backend/uefi_variable_store.h
+++ b/components/service/uefi/smm_variable/backend/uefi_variable_store.h
@@ -52,7 +52,6 @@ struct uefi_variable_store {
uint32_t owner_id;
uint8_t *index_sync_buffer;
size_t index_sync_buffer_size;
- uint64_t active_variable_index_uid;
struct variable_index variable_index;
struct delegate_variable_store persistent_store;
struct delegate_variable_store volatile_store;
diff --git a/components/service/uefi/smm_variable/backend/variable_index.c b/components/service/uefi/smm_variable/backend/variable_index.c
index 90230426f..5fb6d08c5 100644
--- a/components/service/uefi/smm_variable/backend/variable_index.c
+++ b/components/service/uefi/smm_variable/backend/variable_index.c
@@ -91,7 +91,6 @@ static struct variable_entry *containing_entry(const struct variable_info *info)
efi_status_t variable_index_init(struct variable_index *context, size_t max_variables)
{
context->max_variables = max_variables;
- context->counter = 0;
context->entries =
(struct variable_entry *)malloc(sizeof(struct variable_entry) * max_variables);
@@ -109,9 +108,9 @@ void variable_index_deinit(struct variable_index *context)
size_t variable_index_max_dump_size(struct variable_index *context)
{
- return sizeof(context->counter) + (sizeof(struct variable_metadata) + sizeof(bool) +
- sizeof(struct variable_constraints)) *
- context->max_variables;
+ return (sizeof(struct variable_metadata) + sizeof(bool) +
+ sizeof(struct variable_constraints)) *
+ context->max_variables;
}
struct variable_info *variable_index_find(const struct variable_index *context,
@@ -288,16 +287,6 @@ efi_status_t variable_index_dump(const struct variable_index *context, size_t bu
*data_len = 0;
*any_dirty = false;
- /*
- * Intentionally letting the counter overflow.
- * The buffer (index_sync_buffer) is provided by malloc, which allocates memory to a boundary
- * suitable for any default data type of the system (e.g uint32_t)
- */
- *((uint32_t *)dump_pos) = context->counter + 1;
- bytes_dumped += sizeof(context->counter);
- dump_pos += sizeof(context->counter);
-
- /* Store variables */
for (size_t pos = 0; pos < context->max_variables; pos++) {
struct variable_entry *entry = &context->entries[pos];
struct variable_metadata *metadata = &entry->info.metadata;
@@ -344,24 +333,14 @@ efi_status_t variable_index_dump(const struct variable_index *context, size_t bu
return EFI_SUCCESS;
}
-void variable_index_confirm_write(struct variable_index *context)
-{
- context->counter++;
-}
-size_t variable_index_restore(struct variable_index *context, size_t data_len,
+size_t variable_index_restore(const struct variable_index *context, size_t data_len,
const uint8_t *buffer)
{
size_t bytes_loaded = 0;
const uint8_t *load_pos = buffer;
int pos = 0;
- if (data_len >= sizeof(context->counter)) {
- context->counter = *((uint32_t *)load_pos);
- bytes_loaded += sizeof(context->counter);
- load_pos += sizeof(context->counter);
- }
-
while (bytes_loaded < data_len) {
struct variable_entry *entry = &context->entries[pos];
diff --git a/components/service/uefi/smm_variable/backend/variable_index.h b/components/service/uefi/smm_variable/backend/variable_index.h
index 592dddc83..0151d636a 100644
--- a/components/service/uefi/smm_variable/backend/variable_index.h
+++ b/components/service/uefi/smm_variable/backend/variable_index.h
@@ -75,7 +75,6 @@ struct variable_entry {
*/
struct variable_index {
size_t max_variables;
- uint32_t counter;
struct variable_entry *entries;
};
@@ -229,7 +228,7 @@ void variable_index_confirm_write(struct variable_index *context);
*
* @return Number of bytes loaded
*/
-size_t variable_index_restore(struct variable_index *context, size_t data_len,
+size_t variable_index_restore(const struct variable_index *context, size_t data_len,
const uint8_t *buffer);
#ifdef __cplusplus
--
2.25.1
@@ -1,387 +0,0 @@
From c0ffa57e7628f23747d7ee947358f8a538fa5d4c Mon Sep 17 00:00:00 2001
From: Bence Balogh <bence.balogh@arm.com>
Date: Mon, 25 Nov 2024 22:17:51 +0100
Subject: [PATCH 3/3] Revert "Make constraints of NV UEFI variables persistent"
This reverts commit 64bbde5d9950413cf724ffb792d4d1637892fa8b.
The FMP support didn't work with this commit. See the implementation in the
0003-FMP-Support-in-Corstone1000.patch file. The
0003-FMP-Support-in-Corstone1000.patch will be redesigned but until that, this
commit has to be reverted.
Upstream-Status: Inappropriate [To be removed after new FWU design]
Signed-off-by: Bence Balogh <bence.balogh@arm.com>
---
.../backend/test/variable_index_tests.cpp | 93 +++----------------
.../backend/uefi_variable_store.c | 12 +--
.../smm_variable/backend/variable_index.c | 90 +++---------------
.../smm_variable/backend/variable_index.h | 7 +-
4 files changed, 36 insertions(+), 166 deletions(-)
diff --git a/components/service/uefi/smm_variable/backend/test/variable_index_tests.cpp b/components/service/uefi/smm_variable/backend/test/variable_index_tests.cpp
index a52cfbf76..1b7a6b879 100644
--- a/components/service/uefi/smm_variable/backend/test/variable_index_tests.cpp
+++ b/components/service/uefi/smm_variable/backend/test/variable_index_tests.cpp
@@ -214,28 +214,21 @@ TEST(UefiVariableIndexTests, dumpLoadRoadtrip)
/* Expect the info for two NV variables to have been dumped */
size_t dump_len = 0;
- bool is_dirty = false;
- efi_status_t status = EFI_SUCCESS;
-
- status = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len,
- &is_dirty);
+ bool is_dirty = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len);
CHECK_TRUE(is_dirty);
- UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
- UNSIGNED_LONGS_EQUAL(((sizeof(struct variable_metadata) + sizeof(bool)) * 2), dump_len);
+ UNSIGNED_LONGS_EQUAL((sizeof(struct variable_metadata) * 2), dump_len);
/* Expect no records to be dirty when the dump is repeated */
dump_len = 0;
- status = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len,
- &is_dirty);
+ is_dirty = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len);
- UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
CHECK_FALSE(is_dirty);
- UNSIGNED_LONGS_EQUAL(((sizeof(struct variable_metadata) + sizeof(bool)) * 2), dump_len);
+ UNSIGNED_LONGS_EQUAL((sizeof(struct variable_metadata) * 2), dump_len);
/* Tear down and reinitialize to simulate a reboot */
variable_index_deinit(&m_variable_index);
- status = variable_index_init(&m_variable_index, MAX_VARIABLES);
+ efi_status_t status = variable_index_init(&m_variable_index, MAX_VARIABLES);
UNSIGNED_LONGLONGS_EQUAL(EFI_SUCCESS, status);
/* Load the dumped contents */
@@ -268,52 +261,6 @@ TEST(UefiVariableIndexTests, dumpLoadRoadtrip)
UNSIGNED_LONGLONGS_EQUAL(EFI_NOT_FOUND, status);
}
-TEST(UefiVariableIndexTests, dumpLoadConstrainedVariable)
-{
- uint8_t buffer[MAX_VARIABLES * sizeof(struct variable_metadata)];
-
- create_variables();
-
- struct variable_constraints constraints;
- constraints.revision = 10;
- constraints.property = VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY;
- constraints.attributes = 0;
- constraints.min_size = 1;
- constraints.max_size = 100;
-
- /* Set check constraints on one of the variables */
- struct variable_info *info = variable_index_find(&m_variable_index, &guid_2,
- string_get_size_in_bytes(name_2),
- (const int16_t *)name_2.data());
-
- CHECK_TRUE(info);
- CHECK_TRUE(info->is_variable_set);
- CHECK_FALSE(info->is_constraints_set);
-
- variable_index_set_constraints(info, &constraints);
-
- CHECK_TRUE(info->is_constraints_set);
- CHECK_TRUE(info->is_variable_set);
-
- size_t dump_len = 0;
- bool is_dirty = false;
- efi_status_t status = EFI_SUCCESS;
- status = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len,
- &is_dirty);
-
- UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
- CHECK_TRUE(is_dirty);
-
- /* metadata and constraint status byte are stored for both NV variables, but only one of them has constraints */
- UNSIGNED_LONGS_EQUAL((sizeof(struct variable_metadata) + sizeof(bool)) * 2 +
- sizeof(struct variable_constraints),
- dump_len);
-
- /* Load the dumped contents */
- size_t load_len = variable_index_restore(&m_variable_index, dump_len, buffer);
- UNSIGNED_LONGS_EQUAL(dump_len, load_len);
-}
-
TEST(UefiVariableIndexTests, dumpBufferTooSmall)
{
uint8_t buffer[1 * sizeof(struct variable_metadata) + 1];
@@ -325,15 +272,10 @@ TEST(UefiVariableIndexTests, dumpBufferTooSmall)
* exceed the length of the buffer.
*/
size_t dump_len = 0;
- bool is_dirty = false;
- efi_status_t status = EFI_SUCCESS;
-
- status = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len,
- &is_dirty);
+ bool is_dirty = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len);
CHECK_TRUE(is_dirty);
- UNSIGNED_LONGS_EQUAL(EFI_BUFFER_TOO_SMALL, status);
- UNSIGNED_LONGS_EQUAL(0, dump_len);
+ UNSIGNED_LONGS_EQUAL(sizeof(struct variable_metadata) * 1, dump_len);
}
TEST(UefiVariableIndexTests, removeVariable)
@@ -351,14 +293,10 @@ TEST(UefiVariableIndexTests, removeVariable)
/* Expect index to be dirty and for only one NV variable to be left */
size_t dump_len = 0;
- bool is_dirty = false;
- efi_status_t status = EFI_SUCCESS;
- status = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len,
- &is_dirty);
+ bool is_dirty = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len);
CHECK_TRUE(is_dirty);
- UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
- UNSIGNED_LONGS_EQUAL(sizeof(struct variable_metadata) + sizeof(bool), dump_len);
+ UNSIGNED_LONGS_EQUAL((sizeof(struct variable_metadata) * 1), dump_len);
/* Remove the volatile variable */
info = variable_index_find(&m_variable_index, &guid_1, string_get_size_in_bytes(name_1),
@@ -368,12 +306,10 @@ TEST(UefiVariableIndexTests, removeVariable)
/* Expect index not to be dirty because there was no change to any NV variable */
dump_len = 0;
- status = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len,
- &is_dirty);
+ is_dirty = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len);
CHECK_FALSE(is_dirty);
- UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
- UNSIGNED_LONGS_EQUAL(sizeof(struct variable_metadata) + sizeof(bool), dump_len);
+ UNSIGNED_LONGS_EQUAL((sizeof(struct variable_metadata) * 1), dump_len);
/* Remove the remaining NV variable */
info = variable_index_find(&m_variable_index, &guid_1, string_get_size_in_bytes(name_3),
@@ -383,15 +319,14 @@ TEST(UefiVariableIndexTests, removeVariable)
/* Expect index to be dirty and dump to now be empty */
dump_len = 0;
- status = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len,
- &is_dirty);
+ is_dirty = variable_index_dump(&m_variable_index, sizeof(buffer), buffer, &dump_len);
CHECK_TRUE(is_dirty);
- UNSIGNED_LONGS_EQUAL(EFI_SUCCESS, status);
- UNSIGNED_LONGS_EQUAL(0, dump_len);
+ UNSIGNED_LONGS_EQUAL((sizeof(struct variable_metadata) * 0), dump_len);
/* Enumerate and now expect an empty index */
info = NULL;
+ efi_status_t status = EFI_SUCCESS;
info = variable_index_find_next(&m_variable_index, &guid_1,
string_get_size_in_bytes(null_name), (const int16_t *) null_name.data(),
diff --git a/components/service/uefi/smm_variable/backend/uefi_variable_store.c b/components/service/uefi/smm_variable/backend/uefi_variable_store.c
index e5fc32864..7da2d1e71 100644
--- a/components/service/uefi/smm_variable/backend/uefi_variable_store.c
+++ b/components/service/uefi/smm_variable/backend/uefi_variable_store.c
@@ -575,10 +575,8 @@ efi_status_t uefi_variable_store_set_var_check_property(
status = variable_checker_set_constraints(&constraints, info->is_constraints_set,
&property->VariableProperty);
- if (status == EFI_SUCCESS) {
+ if (status == EFI_SUCCESS)
variable_index_set_constraints(info, &constraints);
- status = sync_variable_index(context);
- }
variable_index_remove_unused_entry(&context->variable_index, info);
@@ -643,15 +641,13 @@ static efi_status_t load_variable_index(struct uefi_variable_store *context)
static efi_status_t sync_variable_index(const struct uefi_variable_store *context)
{
efi_status_t status = EFI_SUCCESS;
- bool is_dirty = false;
/* Sync the variable index to storage if anything is dirty */
size_t data_len = 0;
- status = variable_index_dump(&context->variable_index, context->index_sync_buffer_size,
- context->index_sync_buffer, &data_len, &is_dirty);
- if (status != EFI_SUCCESS)
- return status;
+ bool is_dirty = variable_index_dump(&context->variable_index,
+ context->index_sync_buffer_size,
+ context->index_sync_buffer, &data_len);
if (is_dirty) {
struct storage_backend *persistent_store =
diff --git a/components/service/uefi/smm_variable/backend/variable_index.c b/components/service/uefi/smm_variable/backend/variable_index.c
index 5fb6d08c5..c39f7394b 100644
--- a/components/service/uefi/smm_variable/backend/variable_index.c
+++ b/components/service/uefi/smm_variable/backend/variable_index.c
@@ -108,9 +108,7 @@ void variable_index_deinit(struct variable_index *context)
size_t variable_index_max_dump_size(struct variable_index *context)
{
- return (sizeof(struct variable_metadata) + sizeof(bool) +
- sizeof(struct variable_constraints)) *
- context->max_variables;
+ return sizeof(struct variable_metadata) * context->max_variables;
}
struct variable_info *variable_index_find(const struct variable_index *context,
@@ -269,68 +267,37 @@ void variable_index_set_constraints(struct variable_info *info,
const struct variable_constraints *constraints)
{
if (info) {
- struct variable_entry *entry = containing_entry(info);
-
info->check_constraints = *constraints;
info->is_constraints_set = true;
-
- mark_dirty(entry);
}
}
-efi_status_t variable_index_dump(const struct variable_index *context, size_t buffer_size,
- uint8_t *buffer, size_t *data_len, bool *any_dirty)
+bool variable_index_dump(const struct variable_index *context, size_t buffer_size, uint8_t *buffer,
+ size_t *data_len)
{
+ bool any_dirty = false;
uint8_t *dump_pos = buffer;
size_t bytes_dumped = 0;
- *data_len = 0;
- *any_dirty = false;
-
for (size_t pos = 0; pos < context->max_variables; pos++) {
struct variable_entry *entry = &context->entries[pos];
struct variable_metadata *metadata = &entry->info.metadata;
- struct variable_constraints *constraints = &entry->info.check_constraints;
if (entry->in_use && entry->info.is_variable_set &&
- (metadata->attributes & EFI_VARIABLE_NON_VOLATILE)) {
- /* Store metadata */
- if (bytes_dumped + sizeof(struct variable_metadata) > buffer_size)
- return EFI_BUFFER_TOO_SMALL;
-
+ (metadata->attributes & EFI_VARIABLE_NON_VOLATILE) &&
+ ((bytes_dumped + sizeof(struct variable_metadata)) <= buffer_size)) {
memcpy(dump_pos, metadata, sizeof(struct variable_metadata));
bytes_dumped += sizeof(struct variable_metadata);
dump_pos += sizeof(struct variable_metadata);
-
- /* Store constraints' status */
- if (bytes_dumped + sizeof(entry->info.is_constraints_set) > buffer_size)
- return EFI_BUFFER_TOO_SMALL;
-
- memcpy(dump_pos, &entry->info.is_constraints_set,
- sizeof(entry->info.is_constraints_set));
- bytes_dumped += sizeof(entry->info.is_constraints_set);
- dump_pos += sizeof(entry->info.is_constraints_set);
-
- /* Store constraints, if they are set */
- if (entry->info.is_constraints_set) {
- if (bytes_dumped + sizeof(entry->info.check_constraints) >
- buffer_size)
- return EFI_BUFFER_TOO_SMALL;
-
- memcpy(dump_pos, constraints,
- sizeof(entry->info.check_constraints));
- bytes_dumped += sizeof(entry->info.check_constraints);
- dump_pos += sizeof(entry->info.check_constraints);
- }
}
- *any_dirty |= entry->dirty;
+ any_dirty |= entry->dirty;
entry->dirty = false;
}
*data_len = bytes_dumped;
- return EFI_SUCCESS;
+ return any_dirty;
}
@@ -342,50 +309,23 @@ size_t variable_index_restore(const struct variable_index *context, size_t data_
int pos = 0;
while (bytes_loaded < data_len) {
- struct variable_entry *entry = &context->entries[pos];
-
if ((data_len - bytes_loaded) >= sizeof(struct variable_metadata)) {
+ struct variable_entry *entry = &context->entries[pos];
struct variable_metadata *metadata = &entry->info.metadata;
- /* Load metadata */
memcpy(metadata, load_pos, sizeof(struct variable_metadata));
+
+ entry->info.is_variable_set = true;
+ entry->in_use = true;
+
bytes_loaded += sizeof(struct variable_metadata);
load_pos += sizeof(struct variable_metadata);
- } else {
- /* Not a whole number of variable_metadata structs! */
- break;
- }
- if ((data_len - bytes_loaded) >= sizeof(entry->info.is_constraints_set)) {
- /* Load constraints' status */
- memcpy(&entry->info.is_constraints_set, load_pos,
- sizeof(entry->info.is_constraints_set));
- bytes_loaded += sizeof(entry->info.is_constraints_set);
- load_pos += sizeof(entry->info.is_constraints_set);
+ ++pos;
} else {
- /* Not enough space for constraints' status! */
+ /* Not a whole number of variable_metadata structs! */
break;
}
-
- if (entry->info.is_constraints_set) {
- if ((data_len - bytes_loaded) >= sizeof(struct variable_constraints)) {
- struct variable_constraints *constraints =
- &entry->info.check_constraints;
-
- /* Load constraints if they are set */
- memcpy(constraints, load_pos, sizeof(struct variable_constraints));
- bytes_loaded += sizeof(struct variable_constraints);
- load_pos += sizeof(struct variable_constraints);
- } else {
- /* Not a whole number of variable_constraints structs! */
- break;
- }
- }
-
- entry->info.is_variable_set = true;
- entry->in_use = true;
-
- ++pos;
}
return bytes_loaded;
diff --git a/components/service/uefi/smm_variable/backend/variable_index.h b/components/service/uefi/smm_variable/backend/variable_index.h
index 0151d636a..da6ed2476 100644
--- a/components/service/uefi/smm_variable/backend/variable_index.h
+++ b/components/service/uefi/smm_variable/backend/variable_index.h
@@ -201,12 +201,11 @@ void variable_index_set_constraints(struct variable_info *info,
* @param[in] buffer_size Size of destination buffer
* @param[in] buffer Dump to this buffer
* @param[out] data_len Length of serialized data
- * @param[out] any_dirty True if there is unsaved data
*
- * @return EFI_SUCCESS if all the changes are dumped successfully
+ * @return True if there is unsaved data
*/
-efi_status_t variable_index_dump(const struct variable_index *context, size_t buffer_size,
- uint8_t *buffer, size_t *data_len, bool *any_dirty);
+bool variable_index_dump(const struct variable_index *context, size_t buffer_size, uint8_t *buffer,
+ size_t *data_len);
/**
* @brief Confirms the successful write of the variable index into the storage
--
2.25.1
@@ -1,64 +0,0 @@
From dd9a51bde0608989e01de5369eaa0eef2bab7c43 Mon Sep 17 00:00:00 2001
From: Emekcan Aras <emekcan.aras@arm.com>
Date: Wed, 22 Jan 2025 00:54:30 +0000
Subject: [PATCH] protobuf fix
Upstream-Status: Pending (not yet submitted to upstream)
Signed-off-by: Emekcan Aras <emekcan.aras@arm.com>
---
.../se-proxy/env/commonsp/se_proxy_sp.c | 25 ++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/deployments/se-proxy/env/commonsp/se_proxy_sp.c b/deployments/se-proxy/env/commonsp/se_proxy_sp.c
index 88e4cf17e..7da489ca8 100644
--- a/deployments/se-proxy/env/commonsp/se_proxy_sp.c
+++ b/deployments/se-proxy/env/commonsp/se_proxy_sp.c
@@ -13,6 +13,7 @@
#include "trace.h"
#include "deployments/se-proxy/infra/service_proxy_factory.h"
#include "deployments/se-proxy/se_proxy_interfaces.h"
+#include <service/crypto/factory/crypto_provider_factory.h>
static bool sp_init(uint16_t *own_sp_id);
@@ -39,7 +40,7 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
goto fatal_error;
}
- rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 6, 16);
+ rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 7, 16);
if (rpc_status != RPC_SUCCESS) {
EMSG("Failed to initialize RPC endpoint: %d", rpc_status);
goto fatal_error;
@@ -118,6 +119,28 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
goto fatal_error;
}
+ struct rpc_service_interface *crypto_iface_protobuf = NULL;
+ struct crypto_provider *crypto_protobuf_provider = NULL;
+
+ crypto_protobuf_provider = crypto_protobuf_provider_factory_create();
+ if (!crypto_protobuf_provider) {
+ EMSG("Failed to create crypto protobuf provider factory");
+ goto fatal_error;
+ }
+
+ crypto_iface_protobuf = service_provider_get_rpc_interface(
+ &crypto_protobuf_provider->base_provider);
+ if (!crypto_iface_protobuf) {
+ EMSG("Failed to create service provider RPC interface");
+ goto fatal_error;
+ }
+
+ rpc_status = ts_rpc_endpoint_sp_add_service(&rpc_endpoint, crypto_iface_protobuf);
+ if (rpc_status != RPC_SUCCESS) {
+ EMSG("Failed to add service to RPC endpoint: %d", rpc_status);
+ goto fatal_error;
+ }
+
/* End of boot phase */
result = sp_msg_wait(&req_msg);
if (result != SP_RESULT_OK) {
--
2.43.0
@@ -1,7 +1,7 @@
From dde0ca3260ae3b7e7c3390ef03f9f484e9189626 Mon Sep 17 00:00:00 2001
From 7953806fd3fdb743c40b76e363b917fac786c636 Mon Sep 17 00:00:00 2001
From: Harsimran Singh Tungal <harsimransingh.tungal@arm.com>
Date: Tue, 11 Mar 2025 13:33:36 +0000
Subject: [PATCH 7/8] platform: corstone1000: Add event provider proxy
Subject: [PATCH 10/11] platform: corstone1000: Add event provider proxy
Normal world needs to send boot confirmation event
to Secure Enclave and Trusted-Services is responsible
@@ -14,17 +14,38 @@ This change is introduced for Corstone-1000
Upstream-Status: Pending
Signed-off-by: Harsimran Singh Tungal <harsimransingh.tungal@arm.com>
---
components/service/common/include/psa/sid.h | 9 ++
.../se-proxy/env/commonsp/se_proxy_sp.c | 16 +++-
.../corstone1000_event_handling.c | 91 +++++++++++++++++++
.../corstone1000_event_handling.h | 42 +++++++++
.../se-proxy/infra/corstone1000/infra.cmake | 1 +
.../corstone1000/service_proxy_factory.c | 27 ++++++
5 files changed, 175 insertions(+), 2 deletions(-)
6 files changed, 184 insertions(+), 2 deletions(-)
create mode 100644 deployments/se-proxy/infra/corstone1000/corstone1000_event_handling.c
create mode 100644 deployments/se-proxy/infra/corstone1000/corstone1000_event_handling.h
diff --git a/components/service/common/include/psa/sid.h b/components/service/common/include/psa/sid.h
index 0235764d..9f5ea05e 100644
--- a/components/service/common/include/psa/sid.h
+++ b/components/service/common/include/psa/sid.h
@@ -40,6 +40,15 @@ extern "C" {
#define TFM_CRYPTO_VERSION (1U)
#define TFM_CRYPTO_HANDLE (0x40000100U)
+/******** TFM_PLATFORM_SERVICE *******/
+#define TFM_PLATFORM_API_ID_IOCTL (1013)
+#define TFM_PLATFORM_SERVICE_HANDLE (0x40000105U)
+
+/**
+ * \brief Define a progressive numerical value for each SID which can be used
+ * when dispatching the requests to the service
+*/
+
/******** TFM_SP_PLATFORM ********/
#define TFM_SP_PLATFORM_SYSTEM_RESET_SID (0x00000040U)
#define TFM_SP_PLATFORM_SYSTEM_RESET_VERSION (1U)
diff --git a/deployments/se-proxy/env/commonsp/se_proxy_sp.c b/deployments/se-proxy/env/commonsp/se_proxy_sp.c
index 7da489ca..7d2ade5e 100644
index 9f94092b..ce1410b2 100644
--- a/deployments/se-proxy/env/commonsp/se_proxy_sp.c
+++ b/deployments/se-proxy/env/commonsp/se_proxy_sp.c
@@ -1,6 +1,6 @@
@@ -35,16 +56,16 @@ index 7da489ca..7d2ade5e 100644
*/
#include "components/rpc/common/endpoint/rpc_service_interface.h"
@@ -40,7 +40,7 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
@@ -42,7 +42,7 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
goto fatal_error;
}
- rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 7, 16);
+ rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 8, 16);
- rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 6, 16);
+ rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 7, 16);
if (rpc_status != RPC_SUCCESS) {
EMSG("Failed to initialize RPC endpoint: %d", rpc_status);
goto fatal_error;
@@ -95,6 +95,18 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
@@ -97,6 +97,18 @@ void __noreturn sp_main(union ffa_boot_info *boot_info)
goto fatal_error;
}
@@ -60,9 +81,9 @@ index 7da489ca..7d2ade5e 100644
+ goto fatal_error;
+ }
+
rpc_iface = capsule_update_proxy_create();
rpc_iface = fwu_proxy_create();
if (!rpc_iface) {
EMSG("Failed to create Capsule Update proxy");
EMSG("Failed to create FWU proxy");
diff --git a/deployments/se-proxy/infra/corstone1000/corstone1000_event_handling.c b/deployments/se-proxy/infra/corstone1000/corstone1000_event_handling.c
new file mode 100644
index 00000000..faf450f2
@@ -209,20 +230,20 @@ index 00000000..e8e60dae
+
+#endif /* CORSTONE1000_EVENT_HANDLING_H */
diff --git a/deployments/se-proxy/infra/corstone1000/infra.cmake b/deployments/se-proxy/infra/corstone1000/infra.cmake
index 0b04149a..b95801de 100644
index 2bf6b36e..1ec43700 100644
--- a/deployments/se-proxy/infra/corstone1000/infra.cmake
+++ b/deployments/se-proxy/infra/corstone1000/infra.cmake
@@ -34,4 +34,5 @@ add_components(TARGET "se-proxy"
@@ -33,4 +33,5 @@ add_components(TARGET "se-proxy"
target_sources(se-proxy PRIVATE
${CMAKE_CURRENT_LIST_DIR}/service_proxy_factory.c
+ ${CMAKE_CURRENT_LIST_DIR}/corstone1000_event_handling.c
)
diff --git a/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c b/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c
index f0a4853e..ed42e2cb 100644
index a754ace7..6d8c3855 100644
--- a/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c
+++ b/deployments/se-proxy/infra/corstone1000/service_proxy_factory.c
@@ -21,6 +21,7 @@
@@ -20,6 +20,7 @@
#include <protocols/service/fwu/fwu_proto.h>
#include <trace.h>
#include "corstone1000_config.h"
@@ -230,7 +251,7 @@ index f0a4853e..ed42e2cb 100644
/* backends */
#include <service/crypto/backend/psa_ipc/crypto_ipc_backend.h>
@@ -165,6 +166,32 @@ struct rpc_service_interface *its_proxy_create(void)
@@ -164,6 +165,32 @@ struct rpc_service_interface *its_proxy_create(void)
return secure_storage_provider_init(&its_provider, backend, &its_uuid);
}
@@ -264,5 +285,5 @@ index f0a4853e..ed42e2cb 100644
{
rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
--
2.25.1
2.34.1
@@ -1,38 +1,31 @@
From 0423349ec142bd1c4a6cc452eed9a0f5e43c8539 Mon Sep 17 00:00:00 2001
From: Michael Safwat <michael.safwat@arm.com>
Date: Mon, 23 Jun 2025 13:06:10 +0000
From 2eef8097c6411fb54b2d0203159e120d192315c7 Mon Sep 17 00:00:00 2001
From: Harsimran Singh Tungal <harsimransingh.tungal@arm.com>
Date: Thu, 24 Jul 2025 10:33:41 +0000
Subject: [PATCH] Plat: Corstone-1000: Add MM communication buffer configs to
CMake
Upstream-Status: Submitted [https://review.trustedfirmware.org/c/TS/trusted-services/+/40893]
Two variables are added into the Corstone-1000 platform
CMake file so the MM communication buffer address and
the page count can be configured.
Upstream-Status: Submitted [https://review.trustedfirmware.org/c/TS/trusted-services/+/40893]
Change-Id: I6bbdc90231b0417d4318d6709568113ab1f2c8ce
Signed-off-by: Michael Safwat <michael.safwat@arm.com>
Signed-off-by: Harsimran Singh Tungal <harsimransingh.tungal@arm.com>
---
platform/providers/arm/corstone1000/platform.cmake | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
platform/providers/arm/corstone1000/platform.cmake | 2 ++
1 file changed, 2 insertions(+)
diff --git a/platform/providers/arm/corstone1000/platform.cmake b/platform/providers/arm/corstone1000/platform.cmake
index 2afcdea8..37c6accf 100644
index db1e9743..88113c9d 100644
--- a/platform/providers/arm/corstone1000/platform.cmake
+++ b/platform/providers/arm/corstone1000/platform.cmake
@@ -1,5 +1,5 @@
#-------------------------------------------------------------------------------
-# Copyright (c) 2021-2024, Arm Limited and Contributors. All rights reserved.
+# Copyright (c) 2021-2025, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
@@ -11,6 +11,9 @@ set(SMM_RPC_CALLER_SESSION_SHARED_MEMORY_SIZE 4*4096 CACHE STRING "RPC caller bu
set(SMM_SP_HEAP_SIZE 80*1024 CACHE STRING "SMM gateway SP heap size")
@@ -18,6 +18,8 @@ set(SMM_SP_HEAP_SIZE 80*1024 CACHE STRING "SMM gateway SP heap size")
set(PLAT_RSE_COMMS_PAYLOAD_MAX_SIZE 0x43C0 CACHE STRING "Size of the RSE_COMMS_PAYLOAD buffer")
set(COMMS_MHU_MSG_SIZE 0x4500 CACHE STRING "Max message size that can be transfered via MHU")
set(TFM_FWU_MAX_DIGEST_SIZE ${TOTAL_ESRT_SIZE} CACHE STRING "Maximum size of ESRT entries of all the images in a bank")
+set(MM_COMM_BUFFER_ADDRESS "0x00000000 0x81FFF000" CACHE STRING "MM Communication buffer start address")
+set(MM_COMM_BUFFER_PAGE_COUNT 0x1 CACHE STRING "MM Communication buffer page count")
+
target_compile_definitions(${TGT} PRIVATE
SMM_VARIABLE_INDEX_STORAGE_UID=0x787
@@ -2,32 +2,25 @@ FILESEXTRAPATHS:prepend:corstone1000 := "${THISDIR}/corstone1000:"
COMPATIBLE_MACHINE:corstone1000 = "corstone1000"
SRC_URI:append:corstone1000 = " \
file://0001-Add-stub-capsule-update-service-components.patch \
file://0002-Fix-in-AEAD-for-psa-arch-test-254.patch \
file://0003-FMP-Support-in-Corstone1000.patch \
file://0004-Fix-psa-api-crypto-test-no-243.patch \
file://0005-plat-corstone1000-Use-the-stateless-platform-service.patch \
file://0006-plat-corstone1000-Initialize-capsule-update-provider.patch \
file://0007-plat-corstone1000-add-client_id-for-FMP-service.patch \
file://0008-Remove-Werror-flag.patch \
file://0009-Remove-PLATFORM_HAS_ATTEST_PK-define-from-IAT-test.patch \
file://0010-Make-RSS-and-MHU-sizes-compile-time-definitions-user.patch \
file://0011-Align-PSA-Crypto-with-TF-Mv2.1.patch \
file://0012-Revert-Make-variable-index-usage-robust-with-redunda.patch \
file://0013-Revert-Load-and-store-UEFI-variable-index-in-chunks.patch \
file://0014-Revert-Make-constraints-of-NV-UEFI-variables-persist.patch \
file://0015-se-proxy-protobuf-change.patch \
file://0001-Fix-in-AEAD-for-psa-arch-test-254.patch \
file://0002-Fix-psa-api-crypto-test-no-243.patch \
file://0003-Remove-Werror-flag.patch \
file://0004-Remove-PLATFORM_HAS_ATTEST_PK-define-from-IAT-test.patch \
file://0005-Make-RSS-and-MHU-sizes-compile-time-definitions-user.patch \
file://0006-Align-PSA-Crypto-with-TF-Mv2.1.patch \
file://0007-Revert-Load-and-store-UEFI-variable-index-in-chunks.patch \
file://0008-se-proxy-protobuf-change.patch \
file://0009-Platform-Corstone1000-Add-PLATFORM_IS_FVP-toggle-for.patch \
file://0010-Integrate-PSA-FWU-IPC-framework-for-Corstone-1000.patch \
file://0011-Load-initial-image-state-in-PSA-FWU-M-update-agent.patch \
file://0012-Corstone1000-Define-PSA-FWU-image-mapping-structure.patch \
file://0013-Fix-PSA-FWU-IPC-psa_fwu_install-return-value-check.patch \
file://0014-fwu-Add-EFI-ESRT-v1-support.patch \
file://0015-platform-corstone1000-Enable-ESRT-support.patch \
file://0016-platform-corstone1000-Add-event-provider-proxy.patch \
file://0017-platform-corstone1000-Define-GUID-for-each-payloads.patch \
file://0018-Add-the-com-buffer-address-and-page-count.patch \
file://0021-Align-PSA-Crypto-structs-with-TF-Mv2.1.1.patch \
file://0016-Add-the-com-buffer-address-and-page-count.patch \
file://0017-Platform-Corstone1000-Add-PLATFORM_IS_FVP-toggle-for.patch \
file://0018-Integrate-PSA-FWU-IPC-framework-for-Corstone-1000.patch \
file://0019-Load-initial-image-state-in-PSA-FWU-M-update-agent.patch \
file://0020-Corstone1000-Define-PSA-FWU-image-mapping-structure.patch \
file://0021-Fix-PSA-FWU-IPC-psa_fwu_install-return-value-check.patch \
file://0022-fwu-Add-EFI-ESRT-v1-support.patch \
file://0023-platform-corstone1000-Enable-ESRT-support.patch \
file://0024-platform-corstone1000-Add-event-provider-proxy.patch \
file://0025-platform-corstone1000-Define-GUID-for-each-payloads.patch \
"
# The patches above introduce errors with GCC 14.1, silence them for now
CFLAGS:append:corstone1000 = " -Wno-int-conversion -Wno-implicit-function-declaration"