| 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(®ions, 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, ®ion, 1, |
| + &out_region_count, expected_handle)); |
| + MEMCMP_EQUAL(&acc_desc, &expected_acc_desc[1], sizeof(acc_desc)); |
| + MEMCMP_EQUAL(®ion, &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, ®ion, 1, |
| + &out_region_count, expected_handle, |
| + &tr_buffer)); |
| + MEMCMP_EQUAL(&acc_desc, &expected_acc_desc[1], sizeof(acc_desc)); |
| + MEMCMP_EQUAL(®ion, &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 |
| |