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
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 @@
  *
  * @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 @@
 	"${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
@@ -135,6 +135,19 @@
 )
 
 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
 		${CMAKE_CURRENT_LIST_DIR}/test/test_sp_memory_management_internals.cpp