RPC: Merge RPC PSA Client APIs
Originally, connection-based APIs are optional, depends on whether the
TF-M provides any.
So the RPC APIs are also separated so that they can be selected.
Later, the APIs are always provided with returning NOT SUPPORTED in case
of no connection-based APIs.
And the RPC test framework followed up by always building all the APIs.
This patch makes it further by merging all the APIs.
Change-Id: I923c24e5e83cae4e3d8f4774d776dbe8d07610c2
Signed-off-by: Kevin Peng <kevin.peng@arm.com>
diff --git a/erpc/generated_files/tfm_erpc_server.cpp b/erpc/generated_files/tfm_erpc_server.cpp
new file mode 100644
index 0000000..d2ec345
--- /dev/null
+++ b/erpc/generated_files/tfm_erpc_server.cpp
@@ -0,0 +1,479 @@
+/*
+ * Copyright (c) 2023, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+/*
+ * Generated by erpcgen 1.9.1 on Fri Jul 21 17:28:31 2023.
+ *
+ * AUTOGENERATED - DO NOT EDIT
+ */
+
+
+#include "tfm_erpc_server.h"
+#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
+#include <new>
+#include "erpc_port.h"
+#endif
+#include "erpc_manually_constructed.h"
+
+#if 10901 != ERPC_VERSION_NUMBER
+#error "The generated shim code version is different to the rest of eRPC code."
+#endif
+
+using namespace erpc;
+using namespace std;
+
+#if ERPC_NESTED_CALLS_DETECTION
+extern bool nestingDetection;
+#endif
+
+ERPC_MANUALLY_CONSTRUCTED_STATIC(psa_client_api_service, s_psa_client_api_service);
+
+
+//! @brief Function to read struct binary_t
+static void read_binary_t_struct(erpc::Codec * codec, binary_t * data);
+
+//! @brief Function to read struct list_binary_1_t
+static void read_list_binary_1_t_struct(erpc::Codec * codec, list_binary_1_t * data);
+
+
+// Read struct binary_t function implementation
+static void read_binary_t_struct(erpc::Codec * codec, binary_t * data)
+{
+ if(NULL == data)
+ {
+ return;
+ }
+
+ uint8_t * data_local;
+ codec->readBinary(&data->dataLength, &data_local);
+ data->data = (uint8_t *) erpc_malloc(data->dataLength * sizeof(uint8_t));
+ if ((data->data == NULL) && (data->dataLength > 0))
+ {
+ codec->updateStatus(kErpcStatus_MemoryError);
+ }
+ else
+ {
+ memcpy(data->data, data_local, data->dataLength);
+ }
+}
+
+// Read struct list_binary_1_t function implementation
+static void read_list_binary_1_t_struct(erpc::Codec * codec, list_binary_1_t * data)
+{
+ if(NULL == data)
+ {
+ return;
+ }
+
+ codec->startReadList(&data->elementsCount);
+ data->elements = (binary_t *) erpc_malloc(data->elementsCount * sizeof(binary_t));
+ if ((data->elements == NULL) && (data->elementsCount > 0))
+ {
+ codec->updateStatus(kErpcStatus_MemoryError);
+ }
+ for (uint32_t listCount = 0U; listCount < data->elementsCount; ++listCount)
+ {
+ read_binary_t_struct(codec, &(data->elements[listCount]));
+ }
+}
+
+
+//! @brief Function to write struct binary_t
+static void write_binary_t_struct(erpc::Codec * codec, const binary_t * data);
+
+//! @brief Function to write struct list_binary_1_t
+static void write_list_binary_1_t_struct(erpc::Codec * codec, const list_binary_1_t * data);
+
+
+// Write struct binary_t function implementation
+static void write_binary_t_struct(erpc::Codec * codec, const binary_t * data)
+{
+ if(NULL == data)
+ {
+ return;
+ }
+
+ codec->writeBinary(data->dataLength, data->data);
+}
+
+// Write struct list_binary_1_t function implementation
+static void write_list_binary_1_t_struct(erpc::Codec * codec, const list_binary_1_t * data)
+{
+ if(NULL == data)
+ {
+ return;
+ }
+
+ codec->startWriteList(data->elementsCount);
+ for (uint32_t listCount = 0U; listCount < data->elementsCount; ++listCount)
+ {
+ write_binary_t_struct(codec, &(data->elements[listCount]));
+ }
+}
+
+
+//! @brief Function to free space allocated inside struct binary_t
+static void free_binary_t_struct(binary_t * data);
+
+//! @brief Function to free space allocated inside struct list_binary_1_t
+static void free_list_binary_1_t_struct(list_binary_1_t * data);
+
+
+// Free space allocated inside struct binary_t function implementation
+static void free_binary_t_struct(binary_t * data)
+{
+ if (data->data)
+ {
+ erpc_free(data->data);
+ }
+}
+
+// Free space allocated inside struct list_binary_1_t function implementation
+static void free_list_binary_1_t_struct(list_binary_1_t * data)
+{
+ for (uint32_t listCount = 0; listCount < data->elementsCount; ++listCount)
+ {
+ free_binary_t_struct(&data->elements[listCount]);
+ }
+
+ if (data->elements)
+ {
+ erpc_free(data->elements);
+ }
+}
+
+
+
+// Call the correct server shim based on method unique ID.
+erpc_status_t psa_client_api_service::handleInvocation(uint32_t methodId, uint32_t sequence, Codec * codec, MessageBufferFactory *messageFactory)
+{
+ erpc_status_t erpcStatus;
+ switch (methodId)
+ {
+ case kpsa_client_api_psa_framework_version_id:
+ {
+ erpcStatus = psa_framework_version_shim(codec, messageFactory, sequence);
+ break;
+ }
+
+ case kpsa_client_api_psa_version_id:
+ {
+ erpcStatus = psa_version_shim(codec, messageFactory, sequence);
+ break;
+ }
+
+ case kpsa_client_api_erpc_psa_call_id:
+ {
+ erpcStatus = erpc_psa_call_shim(codec, messageFactory, sequence);
+ break;
+ }
+
+ case kpsa_client_api_psa_connect_id:
+ {
+ erpcStatus = psa_connect_shim(codec, messageFactory, sequence);
+ break;
+ }
+
+ case kpsa_client_api_psa_close_id:
+ {
+ erpcStatus = psa_close_shim(codec, messageFactory, sequence);
+ break;
+ }
+
+ default:
+ {
+ erpcStatus = kErpcStatus_InvalidArgument;
+ break;
+ }
+ }
+
+ return erpcStatus;
+}
+
+// Server shim for psa_framework_version of psa_client_api interface.
+erpc_status_t psa_client_api_service::psa_framework_version_shim(Codec * codec, MessageBufferFactory *messageFactory, uint32_t sequence)
+{
+ erpc_status_t err = kErpcStatus_Success;
+
+ uint32_t result;
+
+ // startReadMessage() was already called before this shim was invoked.
+
+ err = codec->getStatus();
+ if (err == kErpcStatus_Success)
+ {
+ // Invoke the actual served function.
+#if ERPC_NESTED_CALLS_DETECTION
+ nestingDetection = true;
+#endif
+ result = psa_framework_version();
+#if ERPC_NESTED_CALLS_DETECTION
+ nestingDetection = false;
+#endif
+
+ // preparing MessageBuffer for serializing data
+ err = messageFactory->prepareServerBufferForSend(codec->getBuffer());
+ }
+
+ if (err == kErpcStatus_Success)
+ {
+ // preparing codec for serializing data
+ codec->reset();
+
+ // Build response message.
+ codec->startWriteMessage(kReplyMessage, kpsa_client_api_service_id, kpsa_client_api_psa_framework_version_id, sequence);
+
+ codec->write(result);
+
+ err = codec->getStatus();
+ }
+
+ return err;
+}
+
+// Server shim for psa_version of psa_client_api interface.
+erpc_status_t psa_client_api_service::psa_version_shim(Codec * codec, MessageBufferFactory *messageFactory, uint32_t sequence)
+{
+ erpc_status_t err = kErpcStatus_Success;
+
+ uint32_t sid;
+ uint32_t result;
+
+ // startReadMessage() was already called before this shim was invoked.
+
+ codec->read(&sid);
+
+ err = codec->getStatus();
+ if (err == kErpcStatus_Success)
+ {
+ // Invoke the actual served function.
+#if ERPC_NESTED_CALLS_DETECTION
+ nestingDetection = true;
+#endif
+ result = psa_version(sid);
+#if ERPC_NESTED_CALLS_DETECTION
+ nestingDetection = false;
+#endif
+
+ // preparing MessageBuffer for serializing data
+ err = messageFactory->prepareServerBufferForSend(codec->getBuffer());
+ }
+
+ if (err == kErpcStatus_Success)
+ {
+ // preparing codec for serializing data
+ codec->reset();
+
+ // Build response message.
+ codec->startWriteMessage(kReplyMessage, kpsa_client_api_service_id, kpsa_client_api_psa_version_id, sequence);
+
+ codec->write(result);
+
+ err = codec->getStatus();
+ }
+
+ return err;
+}
+
+// Server shim for erpc_psa_call of psa_client_api interface.
+erpc_status_t psa_client_api_service::erpc_psa_call_shim(Codec * codec, MessageBufferFactory *messageFactory, uint32_t sequence)
+{
+ erpc_status_t err = kErpcStatus_Success;
+
+ psa_handle_t handle;
+ int32_t t;
+ list_binary_1_t *erpc_in_vec = NULL;
+ erpc_in_vec = (list_binary_1_t *) erpc_malloc(sizeof(list_binary_1_t));
+ if (erpc_in_vec == NULL)
+ {
+ codec->updateStatus(kErpcStatus_MemoryError);
+ }
+ list_binary_1_t *erpc_out_vec = NULL;
+ erpc_out_vec = (list_binary_1_t *) erpc_malloc(sizeof(list_binary_1_t));
+ if (erpc_out_vec == NULL)
+ {
+ codec->updateStatus(kErpcStatus_MemoryError);
+ }
+ psa_status_t result;
+
+ // startReadMessage() was already called before this shim was invoked.
+
+ codec->read(&handle);
+
+ codec->read(&t);
+
+ read_list_binary_1_t_struct(codec, erpc_in_vec);
+
+ read_list_binary_1_t_struct(codec, erpc_out_vec);
+
+ err = codec->getStatus();
+ if (err == kErpcStatus_Success)
+ {
+ // Invoke the actual served function.
+#if ERPC_NESTED_CALLS_DETECTION
+ nestingDetection = true;
+#endif
+ result = erpc_psa_call(handle, t, erpc_in_vec, erpc_out_vec);
+#if ERPC_NESTED_CALLS_DETECTION
+ nestingDetection = false;
+#endif
+
+ // preparing MessageBuffer for serializing data
+ err = messageFactory->prepareServerBufferForSend(codec->getBuffer());
+ }
+
+ if (err == kErpcStatus_Success)
+ {
+ // preparing codec for serializing data
+ codec->reset();
+
+ // Build response message.
+ codec->startWriteMessage(kReplyMessage, kpsa_client_api_service_id, kpsa_client_api_erpc_psa_call_id, sequence);
+
+ write_list_binary_1_t_struct(codec, erpc_out_vec);
+
+ codec->write(result);
+
+ err = codec->getStatus();
+ }
+
+ if (erpc_in_vec)
+ {
+ free_list_binary_1_t_struct(erpc_in_vec);
+ }
+ if (erpc_in_vec)
+ {
+ erpc_free(erpc_in_vec);
+ }
+
+ if (erpc_out_vec)
+ {
+ free_list_binary_1_t_struct(erpc_out_vec);
+ }
+ if (erpc_out_vec)
+ {
+ erpc_free(erpc_out_vec);
+ }
+
+ return err;
+}
+
+// Server shim for psa_connect of psa_client_api interface.
+erpc_status_t psa_client_api_service::psa_connect_shim(Codec * codec, MessageBufferFactory *messageFactory, uint32_t sequence)
+{
+ erpc_status_t err = kErpcStatus_Success;
+
+ uint32_t sid;
+ uint32_t ver;
+ psa_handle_t result;
+
+ // startReadMessage() was already called before this shim was invoked.
+
+ codec->read(&sid);
+
+ codec->read(&ver);
+
+ err = codec->getStatus();
+ if (err == kErpcStatus_Success)
+ {
+ // Invoke the actual served function.
+#if ERPC_NESTED_CALLS_DETECTION
+ nestingDetection = true;
+#endif
+ result = psa_connect(sid, ver);
+#if ERPC_NESTED_CALLS_DETECTION
+ nestingDetection = false;
+#endif
+
+ // preparing MessageBuffer for serializing data
+ err = messageFactory->prepareServerBufferForSend(codec->getBuffer());
+ }
+
+ if (err == kErpcStatus_Success)
+ {
+ // preparing codec for serializing data
+ codec->reset();
+
+ // Build response message.
+ codec->startWriteMessage(kReplyMessage, kpsa_client_api_service_id, kpsa_client_api_psa_connect_id, sequence);
+
+ codec->write(result);
+
+ err = codec->getStatus();
+ }
+
+ return err;
+}
+
+// Server shim for psa_close of psa_client_api interface.
+erpc_status_t psa_client_api_service::psa_close_shim(Codec * codec, MessageBufferFactory *messageFactory, uint32_t sequence)
+{
+ erpc_status_t err = kErpcStatus_Success;
+
+ psa_handle_t handle;
+
+ // startReadMessage() was already called before this shim was invoked.
+
+ codec->read(&handle);
+
+ err = codec->getStatus();
+ if (err == kErpcStatus_Success)
+ {
+ // Invoke the actual served function.
+#if ERPC_NESTED_CALLS_DETECTION
+ nestingDetection = true;
+#endif
+ psa_close(handle);
+#if ERPC_NESTED_CALLS_DETECTION
+ nestingDetection = false;
+#endif
+
+ // preparing MessageBuffer for serializing data
+ err = messageFactory->prepareServerBufferForSend(codec->getBuffer());
+ }
+
+ if (err == kErpcStatus_Success)
+ {
+ // preparing codec for serializing data
+ codec->reset();
+
+ // Build response message.
+ codec->startWriteMessage(kReplyMessage, kpsa_client_api_service_id, kpsa_client_api_psa_close_id, sequence);
+
+ err = codec->getStatus();
+ }
+
+ return err;
+}
+
+#if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC
+erpc_service_t create_psa_client_api_service()
+{
+ return new (nothrow) psa_client_api_service();
+}
+
+void destroy_psa_client_api_service(erpc_service_t service)
+{
+ if (service)
+ {
+ delete (psa_client_api_service *)service;
+ }
+}
+#elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC
+erpc_service_t create_psa_client_api_service()
+{
+ s_psa_client_api_service.construct();
+ return s_psa_client_api_service.get();
+}
+
+void destroy_psa_client_api_service()
+{
+ s_psa_client_api_service.destroy();
+}
+#else
+#warning "Unknown eRPC allocation policy!"
+#endif