blob: cf50389d539e703b2bbd08e470df6dfba4ad68a1 [file] [log] [blame]
From b592a22dbce521522931f8e3d79d6e16f2d334fa Mon Sep 17 00:00:00 2001
From: Imre Kis <imre.kis@arm.com>
Date: Fri, 17 Jun 2022 14:42:04 +0200
Subject: [PATCH 19/24] Add mock for libsp/sp_memory_management
Add mock_sp_memory_management for mocking sp_memory_management part of
libsp.
Signed-off-by: Imre Kis <imre.kis@arm.com>
Change-Id: I9f74142bc3568dfc59f820ec2c2af81deba0d0da
Upstream-Status: Pending [In review]
Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
---
.../ffa/libsp/include/sp_memory_management.h | 2 +-
.../messaging/ffa/libsp/mock/component.cmake | 1 +
.../libsp/mock/mock_sp_memory_management.cpp | 523 ++++++++++++++++++
.../libsp/mock/mock_sp_memory_management.h | 98 ++++
.../test/test_mock_sp_memory_management.cpp | 260 +++++++++
components/messaging/ffa/libsp/tests.cmake | 13 +
6 files changed, 896 insertions(+), 1 deletion(-)
create mode 100644 components/messaging/ffa/libsp/mock/mock_sp_memory_management.cpp
create mode 100644 components/messaging/ffa/libsp/mock/mock_sp_memory_management.h
create mode 100644 components/messaging/ffa/libsp/test/test_mock_sp_memory_management.cpp
diff --git a/components/messaging/ffa/libsp/include/sp_memory_management.h b/components/messaging/ffa/libsp/include/sp_memory_management.h
index 58a6cc1..ec76a3d 100644
--- a/components/messaging/ffa/libsp/include/sp_memory_management.h
+++ b/components/messaging/ffa/libsp/include/sp_memory_management.h
@@ -381,7 +381,7 @@ sp_result sp_memory_share_dynamic_is_supported(bool *supported);
*
* @param[in] descriptor The memory descriptor
* @param[in,out] acc_desc Access descriptor
- * @param[in,out regions Memory region array
+ * @param[in,out] regions Memory region array
* @param[in] in_region_count Count of the specified regions, can be 0
* @param[in,out] out_region_count Count of the reserved space of in the
* regions buffer for retrieved regions. After
diff --git a/components/messaging/ffa/libsp/mock/component.cmake b/components/messaging/ffa/libsp/mock/component.cmake
index 15db85a..eb0d28c 100644
--- a/components/messaging/ffa/libsp/mock/component.cmake
+++ b/components/messaging/ffa/libsp/mock/component.cmake
@@ -13,6 +13,7 @@ target_sources(${TGT} PRIVATE
"${CMAKE_CURRENT_LIST_DIR}/mock_ffa_api.cpp"
"${CMAKE_CURRENT_LIST_DIR}/mock_ffa_internal_api.cpp"
"${CMAKE_CURRENT_LIST_DIR}/mock_sp_discovery.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/mock_sp_memory_management.cpp"
"${CMAKE_CURRENT_LIST_DIR}/mock_sp_rxtx.cpp"
)
diff --git a/components/messaging/ffa/libsp/mock/mock_sp_memory_management.cpp b/components/messaging/ffa/libsp/mock/mock_sp_memory_management.cpp
new file mode 100644
index 0000000..9eb0aaa
--- /dev/null
+++ b/components/messaging/ffa/libsp/mock/mock_sp_memory_management.cpp
@@ -0,0 +1,523 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2022, Arm Limited. All rights reserved.
+ */
+
+#include <CppUTestExt/MockSupport.h>
+#include "mock_sp_memory_management.h"
+
+void expect_sp_memory_donate(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor *acc_desc,
+ const struct sp_memory_region regions[],
+ uint32_t region_count, const uint64_t *handle,
+ sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_donate")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc))
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameterReturning("handle", handle, sizeof(*handle))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_donate(struct sp_memory_descriptor *descriptor,
+ struct sp_memory_access_descriptor *acc_desc,
+ struct sp_memory_region regions[],
+ uint32_t region_count, uint64_t *handle)
+{
+ return mock()
+ .actualCall("sp_memory_donate")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc))
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameter("handle", handle)
+ .returnIntValue();
+}
+
+void expect_sp_memory_donate_dynamic(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor *acc_desc,
+ const struct sp_memory_region regions[],
+ uint32_t region_count, const uint64_t *handle,
+ sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_donate_dynamic")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc))
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameterReturning("handle", handle, sizeof(*handle))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_donate_dynamic(struct sp_memory_descriptor *descriptor,
+ struct sp_memory_access_descriptor *acc_desc,
+ struct sp_memory_region regions[],
+ uint32_t region_count, uint64_t *handle,
+ struct ffa_mem_transaction_buffer *buffer)
+{
+ if (buffer == NULL) { // LCOV_EXCL_BR_LINE
+ FAIL("ffa_mem_transaction_buffer is NULL"); // LCOV_EXCL_LINE
+ }
+
+ return mock()
+ .actualCall("sp_memory_donate_dynamic")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc))
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameter("handle", handle)
+ .returnIntValue();
+}
+
+void expect_sp_memory_donate_dynamic_is_supported(const bool *supported, sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_lend_dynamic_is_supported")
+ .withOutputParameterReturning("supported", supported, sizeof(*supported))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_donate_dynamic_is_supported(bool *supported)
+{
+ return mock()
+ .actualCall("sp_memory_lend_dynamic_is_supported")
+ .withOutputParameter("supported", supported)
+ .returnIntValue();
+}
+
+void expect_sp_memory_lend(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ const struct sp_memory_region regions[],
+ uint32_t region_count, const uint64_t *handle,
+ sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_lend")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc) * acc_desc_count)
+ .withUnsignedIntParameter("acc_desc_count", acc_desc_count)
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameterReturning("handle", handle, sizeof(*handle))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_lend(struct sp_memory_descriptor *descriptor,
+ struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ struct sp_memory_region regions[],
+ uint32_t region_count, uint64_t *handle)
+{
+ return mock()
+ .actualCall("sp_memory_lend")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc) * acc_desc_count)
+ .withUnsignedIntParameter("acc_desc_count", acc_desc_count)
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameter("handle", handle)
+ .returnIntValue();
+}
+
+void expect_sp_memory_lend_dynamic(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ const struct sp_memory_region regions[],
+ const uint32_t region_count, const uint64_t *handle,
+ sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_lend")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc) * acc_desc_count)
+ .withUnsignedIntParameter("acc_desc_count", acc_desc_count)
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameterReturning("handle", handle, sizeof(*handle))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_lend_dynamic(struct sp_memory_descriptor *descriptor,
+ struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ struct sp_memory_region regions[],
+ uint32_t region_count, uint64_t *handle,
+ struct ffa_mem_transaction_buffer *buffer)
+{
+ if (buffer == NULL) { // LCOV_EXCL_BR_LINE
+ FAIL("ffa_mem_transaction_buffer is NULL"); // LCOV_EXCL_LINE
+ }
+
+ return mock()
+ .actualCall("sp_memory_lend")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc) * acc_desc_count)
+ .withUnsignedIntParameter("acc_desc_count", acc_desc_count)
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameter("handle", handle)
+ .returnIntValue();
+}
+
+void expect_sp_memory_lend_dynamic_is_supported(const bool *supported, sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_lend_dynamic_is_supported")
+ .withOutputParameterReturning("supported", supported, sizeof(*supported))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_lend_dynamic_is_supported(bool *supported)
+{
+ return mock()
+ .actualCall("sp_memory_lend_dynamic_is_supported")
+ .withOutputParameter("supported", supported)
+ .returnIntValue();
+}
+
+void expect_sp_memory_share(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ const struct sp_memory_region regions[],
+ uint32_t region_count, const uint64_t *handle,
+ sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_share")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc) * acc_desc_count)
+ .withUnsignedIntParameter("acc_desc_count", acc_desc_count)
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameterReturning("handle", handle, sizeof(*handle))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_share(struct sp_memory_descriptor *descriptor,
+ struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ struct sp_memory_region regions[],
+ uint32_t region_count, uint64_t *handle)
+{
+ return mock()
+ .actualCall("sp_memory_share")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc) * acc_desc_count)
+ .withUnsignedIntParameter("acc_desc_count", acc_desc_count)
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameter("handle", handle)
+ .returnIntValue();
+}
+
+void expect_sp_memory_share_dynamic(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ const struct sp_memory_region regions[],
+ uint32_t region_count, const uint64_t *handle,
+ sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_share_dynamic")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc) * acc_desc_count)
+ .withUnsignedIntParameter("acc_desc_count", acc_desc_count)
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameterReturning("handle", handle, sizeof(*handle))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_share_dynamic(struct sp_memory_descriptor *descriptor,
+ struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ struct sp_memory_region regions[],
+ uint32_t region_count, uint64_t *handle,
+ struct ffa_mem_transaction_buffer *buffer)
+{
+ if (buffer == NULL) { // LCOV_EXCL_BR_LINE
+ FAIL("ffa_mem_transaction_buffer is NULL"); // LCOV_EXCL_LINE
+ }
+
+ return mock()
+ .actualCall("sp_memory_share_dynamic")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(*descriptor))
+ .withMemoryBufferParameter("acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc) * acc_desc_count)
+ .withUnsignedIntParameter("acc_desc_count", acc_desc_count)
+ .withMemoryBufferParameter("regions", (const unsigned char *)regions,
+ sizeof(*regions) * region_count)
+ .withUnsignedIntParameter("region_count", region_count)
+ .withOutputParameter("handle", handle)
+ .returnIntValue();
+}
+
+void expect_sp_memory_share_dynamic_is_supported(const bool *supported, sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_share_dynamic_is_supported")
+ .withOutputParameterReturning("supported", supported, sizeof(*supported))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_share_dynamic_is_supported(bool *supported)
+{
+ return mock()
+ .actualCall("sp_memory_share_dynamic_is_supported")
+ .withOutputParameter("supported", supported)
+ .returnIntValue();
+}
+
+void expect_sp_memory_retrieve(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor *req_acc_desc,
+ const struct sp_memory_access_descriptor *resp_acc_desc,
+ const struct sp_memory_region in_regions[],
+ const struct sp_memory_region out_regions[],
+ uint32_t in_region_count,
+ const uint32_t *out_region_count, uint64_t handle,
+ sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_retrieve")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(descriptor))
+ .withMemoryBufferParameter("req_acc_desc", (const unsigned char *)req_acc_desc,
+ sizeof(*req_acc_desc))
+ .withOutputParameterReturning("resp_acc_desc",
+ (const unsigned char *)resp_acc_desc,
+ sizeof(*resp_acc_desc))
+ .withMemoryBufferParameter("in_regions", (const unsigned char *)in_regions,
+ sizeof(*in_regions) * in_region_count)
+ .withOutputParameterReturning("out_regions", out_regions,
+ sizeof(*out_regions) * *out_region_count)
+ .withUnsignedIntParameter("in_region_count", in_region_count)
+ .withOutputParameterReturning("out_region_count", out_region_count,
+ sizeof(*out_region_count))
+ .withUnsignedLongIntParameter("handle", handle)
+ .andReturnValue(result);
+
+}
+
+sp_result sp_memory_retrieve(struct sp_memory_descriptor *descriptor,
+ struct sp_memory_access_descriptor *acc_desc,
+ struct sp_memory_region regions[],
+ uint32_t in_region_count,
+ uint32_t *out_region_count, uint64_t handle)
+{
+ return mock()
+ .actualCall("sp_memory_retrieve")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(descriptor))
+ .withMemoryBufferParameter("req_acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc))
+ .withOutputParameter("resp_acc_desc", acc_desc)
+ .withMemoryBufferParameter("in_regions", (const unsigned char *)regions,
+ sizeof(*regions) * in_region_count)
+ .withOutputParameter("out_regions", regions)
+ .withUnsignedIntParameter("in_region_count", in_region_count)
+ .withOutputParameter("out_region_count", out_region_count)
+ .withUnsignedLongIntParameter("handle", handle)
+ .returnIntValue();
+}
+
+void expect_sp_memory_retrieve_dynamic(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor *req_acc_desc,
+ const struct sp_memory_access_descriptor *resp_acc_desc,
+ const struct sp_memory_region in_regions[],
+ const struct sp_memory_region out_regions[],
+ uint32_t in_region_count,
+ const uint32_t *out_region_count, uint64_t handle,
+ sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_retrieve")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(descriptor))
+ .withMemoryBufferParameter("req_acc_desc", (const unsigned char *)req_acc_desc,
+ sizeof(*req_acc_desc))
+ .withOutputParameterReturning("resp_acc_desc",
+ (const unsigned char *)resp_acc_desc,
+ sizeof(*resp_acc_desc))
+ .withMemoryBufferParameter("in_regions", (const unsigned char *)in_regions,
+ sizeof(*in_regions) * in_region_count)
+ .withOutputParameterReturning("out_regions", out_regions,
+ sizeof(*out_regions) * *out_region_count)
+ .withUnsignedIntParameter("in_region_count", in_region_count)
+ .withOutputParameterReturning("out_region_count", out_region_count,
+ sizeof(*out_region_count))
+ .withUnsignedLongIntParameter("handle", handle)
+ .andReturnValue(result);
+}
+
+sp_result
+sp_memory_retrieve_dynamic(struct sp_memory_descriptor *descriptor,
+ struct sp_memory_access_descriptor *acc_desc,
+ struct sp_memory_region regions[],
+ uint32_t in_region_count, uint32_t *out_region_count,
+ uint64_t handle,
+ struct ffa_mem_transaction_buffer *buffer)
+{
+ if (buffer == NULL) { // LCOV_EXCL_BR_LINE
+ FAIL("ffa_mem_transaction_buffer is NULL"); // LCOV_EXCL_LINE
+ }
+
+ return mock()
+ .actualCall("sp_memory_retrieve")
+ .withMemoryBufferParameter("descriptor", (const unsigned char *)descriptor,
+ sizeof(descriptor))
+ .withMemoryBufferParameter("req_acc_desc", (const unsigned char *)acc_desc,
+ sizeof(*acc_desc))
+ .withOutputParameter("resp_acc_desc", acc_desc)
+ .withMemoryBufferParameter("in_regions", (const unsigned char *)regions,
+ sizeof(*regions) * in_region_count)
+ .withOutputParameter("out_regions", regions)
+ .withUnsignedIntParameter("in_region_count", in_region_count)
+ .withOutputParameter("out_region_count", out_region_count)
+ .withUnsignedLongIntParameter("handle", handle)
+ .returnIntValue();
+}
+
+void expect_sp_memory_retrieve_dynamic_is_supported(const bool *supported, sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_retrieve_dynamic_is_supported")
+ .withOutputParameterReturning("supported", supported, sizeof(*supported))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_retrieve_dynamic_is_supported(bool *supported)
+{
+ return mock()
+ .actualCall("sp_memory_retrieve_dynamic_is_supported")
+ .withOutputParameter("supported", supported)
+ .returnIntValue();
+}
+
+void expect_sp_memory_relinquish(uint64_t handle, const uint16_t endpoints[],
+ uint32_t endpoint_count,
+ const struct sp_memory_transaction_flags *flags,
+ sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_relinquish")
+ .withUnsignedLongIntParameter("handle", handle)
+ .withMemoryBufferParameter("endpoints", (const unsigned char *)endpoints,
+ sizeof(*endpoints) * endpoint_count)
+ .withMemoryBufferParameter("flags", (const unsigned char *)flags, sizeof(*flags))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_relinquish(uint64_t handle, const uint16_t endpoints[],
+ uint32_t endpoint_count,
+ struct sp_memory_transaction_flags *flags)
+{
+ return mock()
+ .actualCall("sp_memory_relinquish")
+ .withUnsignedLongIntParameter("handle", handle)
+ .withMemoryBufferParameter("endpoints", (const unsigned char *)endpoints,
+ sizeof(*endpoints) * endpoint_count)
+ .withMemoryBufferParameter("flags", (const unsigned char *)flags, sizeof(*flags))
+ .returnIntValue();
+}
+
+void expect_sp_memory_reclaim(uint64_t handle, uint32_t flags, sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_reclaim")
+ .withUnsignedLongIntParameter("handle", handle)
+ .withUnsignedIntParameter("flags", flags)
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_reclaim(uint64_t handle, uint32_t flags)
+{
+ return mock()
+ .actualCall("sp_memory_reclaim")
+ .withUnsignedLongIntParameter("handle", handle)
+ .withUnsignedIntParameter("flags", flags)
+ .returnIntValue();
+}
+
+void expect_sp_memory_permission_get(const void *base_address, const struct sp_mem_perm *mem_perm,
+ sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_permission_set")
+ .withConstPointerParameter("base_address", base_address)
+ .withOutputParameterReturning("mem_perm", mem_perm,
+ sizeof(*mem_perm))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_permission_get(const void *base_address,
+ struct sp_mem_perm *mem_perm)
+{
+ return mock()
+ .actualCall("sp_memory_permission_set")
+ .withConstPointerParameter("base_address", base_address)
+ .withOutputParameter("mem_perm", mem_perm)
+ .returnIntValue();
+}
+
+void expect_sp_memory_permission_set(const void *base_address, size_t region_size,
+ const struct sp_mem_perm *mem_perm, sp_result result)
+{
+ mock()
+ .expectOneCall("sp_memory_permission_set")
+ .withConstPointerParameter("base_address", base_address)
+ .withUnsignedLongIntParameter("region_size", region_size)
+ .withMemoryBufferParameter("mem_perm", (const unsigned char *)mem_perm,
+ sizeof(*mem_perm))
+ .andReturnValue(result);
+}
+
+sp_result sp_memory_permission_set(const void *base_address, size_t region_size,
+ const struct sp_mem_perm *mem_perm)
+{
+ return mock()
+ .actualCall("sp_memory_permission_set")
+ .withConstPointerParameter("base_address", base_address)
+ .withUnsignedLongIntParameter("region_size", region_size)
+ .withMemoryBufferParameter("mem_perm", (const unsigned char *)mem_perm,
+ sizeof(*mem_perm))
+ .returnIntValue();
+}
diff --git a/components/messaging/ffa/libsp/mock/mock_sp_memory_management.h b/components/messaging/ffa/libsp/mock/mock_sp_memory_management.h
new file mode 100644
index 0000000..458d2af
--- /dev/null
+++ b/components/messaging/ffa/libsp/mock/mock_sp_memory_management.h
@@ -0,0 +1,98 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
+ */
+
+#ifndef LIBSP_MOCK_MOCK_SP_MEMORY_MANAGEMENT_H_
+#define LIBSP_MOCK_MOCK_SP_MEMORY_MANAGEMENT_H_
+
+#include "../include/sp_memory_management.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void expect_sp_memory_donate(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor *acc_desc,
+ const struct sp_memory_region regions[],
+ uint32_t region_count, const uint64_t *handle,
+ sp_result result);
+
+void expect_sp_memory_donate_dynamic(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor *acc_desc,
+ const struct sp_memory_region regions[],
+ uint32_t region_count, const uint64_t *handle,
+ sp_result result);
+
+void expect_sp_memory_donate_dynamic_is_supported(const bool *supported, sp_result result);
+
+void expect_sp_memory_lend(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ const struct sp_memory_region regions[],
+ uint32_t region_count, const uint64_t *handle,
+ sp_result result);
+
+void expect_sp_memory_lend_dynamic(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ const struct sp_memory_region regions[],
+ const uint32_t region_count, const uint64_t *handle,
+ sp_result result);
+
+void expect_sp_memory_lend_dynamic_is_supported(const bool *supported, sp_result result);
+
+void expect_sp_memory_share(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ const struct sp_memory_region regions[],
+ uint32_t region_count, const uint64_t *handle,
+ sp_result result);
+
+void expect_sp_memory_share_dynamic(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor acc_desc[],
+ uint32_t acc_desc_count,
+ const struct sp_memory_region regions[],
+ uint32_t region_count, const uint64_t *handle,
+ sp_result result);
+
+void expect_sp_memory_share_dynamic_is_supported(const bool *supported, sp_result result);
+
+void expect_sp_memory_retrieve(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor *req_acc_desc,
+ const struct sp_memory_access_descriptor *resp_acc_desc,
+ const struct sp_memory_region in_regions[],
+ const struct sp_memory_region out_regions[],
+ uint32_t in_region_count,
+ const uint32_t *out_region_count, uint64_t handle,
+ sp_result result);
+
+void expect_sp_memory_retrieve_dynamic(const struct sp_memory_descriptor *descriptor,
+ const struct sp_memory_access_descriptor *req_acc_desc,
+ const struct sp_memory_access_descriptor *resp_acc_desc,
+ const struct sp_memory_region in_regions[],
+ const struct sp_memory_region out_regions[],
+ uint32_t in_region_count,
+ const uint32_t *out_region_count, uint64_t handle,
+ sp_result result);
+
+void expect_sp_memory_retrieve_dynamic_is_supported(const bool *supported, sp_result result);
+
+void expect_sp_memory_relinquish(uint64_t handle, const uint16_t endpoints[],
+ uint32_t endpoint_count,
+ const struct sp_memory_transaction_flags *flags,
+ sp_result result);
+
+void expect_sp_memory_reclaim(uint64_t handle, uint32_t flags, sp_result result);
+
+void expect_sp_memory_permission_get(const void *base_address, const struct sp_mem_perm *mem_perm,
+ sp_result result);
+
+void expect_sp_memory_permission_set(const void *base_address, size_t region_size,
+ const struct sp_mem_perm *mem_perm, sp_result result);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBSP_MOCK_MOCK_SP_MEMORY_MANAGEMENT_H_ */
diff --git a/components/messaging/ffa/libsp/test/test_mock_sp_memory_management.cpp b/components/messaging/ffa/libsp/test/test_mock_sp_memory_management.cpp
new file mode 100644
index 0000000..387b50f
--- /dev/null
+++ b/components/messaging/ffa/libsp/test/test_mock_sp_memory_management.cpp
@@ -0,0 +1,260 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2022, Arm Limited. All rights reserved.
+ */
+
+#include <CppUTestExt/MockSupport.h>
+#include <CppUTest/TestHarness.h>
+#include "mock_sp_memory_management.h"
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+static const struct sp_memory_descriptor expected_descriptor = {
+ .sender_id = 0xfedc,
+ .memory_type = sp_memory_type_normal_memory,
+ .mem_region_attr = {.normal_memory = {
+ .cacheability = sp_cacheability_write_back,
+ .shareability = sp_shareability_inner_shareable
+ }},
+ .flags = {
+ .zero_memory = true,
+ .operation_time_slicing = true,
+ .zero_memory_after_relinquish = true,
+ .transaction_type = sp_memory_transaction_type_relayer_specified,
+ .alignment_hint = 0x2000
+ },
+ .tag = 0x0123456789abcdefULL
+};
+static const struct sp_memory_access_descriptor expected_acc_desc[] = {
+ {
+ .receiver_id = 0xfafa,
+ .instruction_access = sp_instruction_access_executable,
+ .data_access = sp_data_access_read_only
+ }, {
+ .receiver_id = 0xc1ca,
+ .instruction_access = sp_instruction_access_not_executable,
+ .data_access = sp_data_access_read_write
+ }
+};
+static const struct sp_memory_region expected_regions[2] = {
+ {.address = (void *)0x01234567, .page_count = 0x89abcdef},
+ {.address = (void *)0x12345670, .page_count = 0x9abcdef8},
+};
+static const uint64_t expected_handle = 0xabcdef0123456789ULL;
+static const void *expected_address = (const void *)0x234567879;
+static const struct sp_mem_perm expected_mem_perm = {
+ .data_access = sp_mem_perm_data_perm_read_write,
+ .instruction_access = sp_mem_perm_instruction_perm_non_executable,
+};
+
+TEST_GROUP(mock_sp_memory_management)
+{
+ TEST_SETUP()
+ {
+ memset(&descriptor, 0x00, sizeof(descriptor));
+ memset(&acc_desc, 0x00, sizeof(acc_desc));
+ memset(&regions, 0x00, sizeof(regions));
+ handle = 0;
+ supported = false;
+ }
+
+ TEST_TEARDOWN()
+ {
+ mock().checkExpectations();
+ mock().clear();
+ }
+
+ struct sp_memory_descriptor descriptor;
+ struct sp_memory_access_descriptor acc_desc[2];
+ struct sp_memory_region regions[2];
+ uint64_t handle;
+ bool supported;
+ struct ffa_mem_transaction_buffer tr_buffer;
+
+ static const sp_result result = -1;
+};
+
+TEST(mock_sp_memory_management, sp_memory_donate)
+{
+ descriptor = expected_descriptor;
+ acc_desc[0] = expected_acc_desc[0];
+ memcpy(regions, expected_regions, sizeof(regions));
+
+ expect_sp_memory_donate(&expected_descriptor, expected_acc_desc, expected_regions, 2,
+ &expected_handle, result);
+ LONGS_EQUAL(result, sp_memory_donate(&descriptor, acc_desc, regions, 2, &handle));
+
+ UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
+}
+
+TEST(mock_sp_memory_management, sp_memory_donate_dynamic)
+{
+ descriptor = expected_descriptor;
+ acc_desc[0] = expected_acc_desc[0];
+ memcpy(regions, expected_regions, sizeof(regions));
+
+ expect_sp_memory_donate_dynamic(&expected_descriptor, expected_acc_desc, expected_regions,
+ 2, &expected_handle, result);
+ LONGS_EQUAL(result, sp_memory_donate_dynamic(&descriptor, acc_desc, regions, 2, &handle,
+ &tr_buffer));
+
+ UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
+}
+
+TEST(mock_sp_memory_management, sp_memory_donate_dynamic_is_supported)
+{
+ const bool expected_supported = true;
+ expect_sp_memory_donate_dynamic_is_supported(&expected_supported, result);
+ LONGS_EQUAL(result, sp_memory_donate_dynamic_is_supported(&supported));
+ CHECK_TRUE(supported);
+}
+
+TEST(mock_sp_memory_management, sp_memory_lend)
+{
+ descriptor = expected_descriptor;
+ memcpy(acc_desc, expected_acc_desc, sizeof(acc_desc));
+ memcpy(regions, expected_regions, sizeof(regions));
+
+ expect_sp_memory_lend(&descriptor, acc_desc, 2, regions, 2, &expected_handle, result);
+ LONGS_EQUAL(result, sp_memory_lend(&descriptor, acc_desc, 2, regions, 2, &handle));
+ UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
+}
+
+TEST(mock_sp_memory_management, sp_memory_lend_dynamic)
+{
+ descriptor = expected_descriptor;
+ memcpy(acc_desc, expected_acc_desc, sizeof(acc_desc));
+ memcpy(regions, expected_regions, sizeof(regions));
+
+ expect_sp_memory_lend_dynamic(&descriptor, acc_desc, 2, regions, 2, &expected_handle,
+ result);
+ LONGS_EQUAL(result, sp_memory_lend_dynamic(&descriptor, acc_desc, 2, regions, 2, &handle,
+ &tr_buffer));
+ UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
+}
+
+TEST(mock_sp_memory_management, sp_memory_lend_dynamic_is_supported)
+{
+ const bool expected_supported = true;
+ expect_sp_memory_lend_dynamic_is_supported(&expected_supported, result);
+ LONGS_EQUAL(result, sp_memory_lend_dynamic_is_supported(&supported));
+ CHECK_TRUE(supported);
+}
+
+TEST(mock_sp_memory_management, sp_memory_share)
+{
+ descriptor = expected_descriptor;
+ memcpy(acc_desc, expected_acc_desc, sizeof(acc_desc));
+ memcpy(regions, expected_regions, sizeof(regions));
+
+ expect_sp_memory_share(&descriptor, acc_desc, 2, regions, 2, &expected_handle, result);
+ LONGS_EQUAL(result, sp_memory_share(&descriptor, acc_desc, 2, regions, 2, &handle));
+ UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
+}
+
+TEST(mock_sp_memory_management, sp_memory_share_dynamic)
+{
+ descriptor = expected_descriptor;
+ memcpy(acc_desc, expected_acc_desc, sizeof(acc_desc));
+ memcpy(regions, expected_regions, sizeof(regions));
+
+ expect_sp_memory_share_dynamic(&descriptor, acc_desc, 2, regions, 2, &expected_handle,
+ result);
+ LONGS_EQUAL(result, sp_memory_share_dynamic(&descriptor, acc_desc, 2, regions, 2, &handle,
+ &tr_buffer));
+ UNSIGNED_LONGLONGS_EQUAL(expected_handle, handle);
+}
+
+TEST(mock_sp_memory_management, sp_memory_share_dynamic_is_supported)
+{
+ const bool expected_supported = true;
+ expect_sp_memory_share_dynamic_is_supported(&expected_supported, result);
+ LONGS_EQUAL(result, sp_memory_share_dynamic_is_supported(&supported));
+ CHECK_TRUE(supported);
+}
+
+TEST(mock_sp_memory_management, sp_memory_retrieve)
+{
+ const uint32_t expected_region_count = 1;
+ struct sp_memory_access_descriptor acc_desc = expected_acc_desc[0];
+ struct sp_memory_region region = expected_regions[0];
+ uint32_t out_region_count = 0;
+
+ descriptor = expected_descriptor;
+
+ expect_sp_memory_retrieve(&expected_descriptor, &expected_acc_desc[0],
+ &expected_acc_desc[1], &expected_regions[0],
+ &expected_regions[1], 1, &expected_region_count, expected_handle,
+ result);
+ LONGS_EQUAL(result, sp_memory_retrieve(&descriptor, &acc_desc, &region, 1,
+ &out_region_count, expected_handle));
+ MEMCMP_EQUAL(&acc_desc, &expected_acc_desc[1], sizeof(acc_desc));
+ MEMCMP_EQUAL(&region, &expected_regions[1], sizeof(region));
+ UNSIGNED_LONGS_EQUAL(expected_region_count, out_region_count);
+}
+
+TEST(mock_sp_memory_management, sp_memory_retrieve_dynamic)
+{
+ const uint32_t expected_region_count = 1;
+ struct sp_memory_access_descriptor acc_desc = expected_acc_desc[0];
+ struct sp_memory_region region = expected_regions[0];
+ uint32_t out_region_count = 0;
+
+ descriptor = expected_descriptor;
+
+ expect_sp_memory_retrieve_dynamic(&expected_descriptor, &expected_acc_desc[0],
+ &expected_acc_desc[1], &expected_regions[0],
+ &expected_regions[1], 1, &expected_region_count,
+ expected_handle, result);
+ LONGS_EQUAL(result, sp_memory_retrieve_dynamic(&descriptor, &acc_desc, &region, 1,
+ &out_region_count, expected_handle,
+ &tr_buffer));
+ MEMCMP_EQUAL(&acc_desc, &expected_acc_desc[1], sizeof(acc_desc));
+ MEMCMP_EQUAL(&region, &expected_regions[1], sizeof(region));
+ UNSIGNED_LONGS_EQUAL(expected_region_count, out_region_count);
+}
+
+TEST(mock_sp_memory_management, sp_memory_retrieve_dynamic_is_supported)
+{
+ const bool expected_supported = true;
+ expect_sp_memory_retrieve_dynamic_is_supported(&expected_supported, result);
+ LONGS_EQUAL(result, sp_memory_retrieve_dynamic_is_supported(&supported));
+ CHECK_TRUE(supported);
+}
+
+TEST(mock_sp_memory_management, sp_memory_relinquish)
+{
+ uint16_t endpoints[3] = {1, 2, 3};
+ struct sp_memory_transaction_flags flags = {0}; // TODO: flags
+
+ expect_sp_memory_relinquish(expected_handle, endpoints, 3, &flags, result);
+ LONGS_EQUAL(result, sp_memory_relinquish(expected_handle, endpoints, 3, &flags));
+}
+
+TEST(mock_sp_memory_management, sp_memory_reclaim)
+{
+ uint32_t flags = 0xffffffff;
+
+ expect_sp_memory_reclaim(expected_handle, flags, result);
+ LONGS_EQUAL(result, sp_memory_reclaim(expected_handle, flags));
+}
+
+TEST(mock_sp_memory_management, sp_memory_permission_get)
+{
+ struct sp_mem_perm mem_perm;
+
+ memset(&mem_perm, 0x00, sizeof(mem_perm));
+
+ expect_sp_memory_permission_get(expected_address, &expected_mem_perm, result);
+ LONGS_EQUAL(result, sp_memory_permission_get(expected_address, &mem_perm));
+ MEMCMP_EQUAL(&expected_mem_perm, &mem_perm, sizeof(expected_mem_perm));
+}
+
+TEST(mock_sp_memory_management, sp_memory_permission_set)
+{
+ size_t size = 0x7654;
+
+ expect_sp_memory_permission_set(expected_address, size, &expected_mem_perm, result);
+ LONGS_EQUAL(result, sp_memory_permission_set(expected_address, size, &expected_mem_perm));
+}
diff --git a/components/messaging/ffa/libsp/tests.cmake b/components/messaging/ffa/libsp/tests.cmake
index 7b52248..63abb57 100644
--- a/components/messaging/ffa/libsp/tests.cmake
+++ b/components/messaging/ffa/libsp/tests.cmake
@@ -134,6 +134,19 @@ unit_test_add_suite(
-DARM64
)
+unit_test_add_suite(
+ NAME libsp_mock_sp_memory_management
+ SOURCES
+ ${CMAKE_CURRENT_LIST_DIR}/test/test_mock_sp_memory_management.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/mock/mock_sp_memory_management.cpp
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_LIST_DIR}/include/
+ ${CMAKE_CURRENT_LIST_DIR}/mock
+ ${UNIT_TEST_PROJECT_PATH}/components/common/utils/include
+ COMPILE_DEFINITIONS
+ -DARM64
+)
+
unit_test_add_suite(
NAME libsp_sp_memory_management_internals
SOURCES
--
2.17.1