From 53dddc1c08d4918e259e090f23cd47f5826a4062 Mon Sep 17 00:00:00 2001 From: Mina Aziz Date: Mon, 14 Apr 2025 14:37:48 +0100 Subject: [PATCH 1/2] fwk: Refactor fwk_get_element_count Refactor fwk_get_element_count to return a status code and store the actual count in a pointer. This avoids returning -ve value due to any wrong configuration and use -ve values improperly. Signed-off-by: Mina Aziz --- framework/include/fwk_module.h | 10 ++- framework/src/fwk_module.c | 22 ++++-- module/pl011/src/mod_pl011.c | 27 +++++--- module/pl011/test/mod_pl011_unit_test.c | 46 +++++++++---- module/scmi_clock/src/mod_scmi_clock.c | 11 +-- module/scmi_perf/src/mod_scmi_perf.c | 16 +++-- module/scmi_perf/src/perf_plugins_handler.c | 22 +++--- .../test/module/mod_scmi_perf_unit_test.c | 7 +- .../mod_scmi_perf_ph_unit_test.c | 13 +++- .../src/mod_scmi_power_domain.c | 17 +++-- .../src/mod_scmi_reset_domain.c | 12 ++-- module/scmi_sensor/src/mod_scmi_sensor.c | 17 +++-- .../test/mod_scmi_sensor_unit_test.c | 23 ++++--- .../src/mod_scmi_system_power.c | 11 ++- .../src/mod_scmi_voltage_domain.c | 16 +++-- module/sds/src/mod_sds.c | 12 ++-- module/stdio/src/mod_stdio.c | 11 ++- .../juno/module/juno_pvt/src/mod_juno_pvt.c | 2 +- .../module/dmc_bing/src/mod_dmc_bing.c | 17 +++-- .../n1sdp_dmc620/src/mod_n1sdp_dmc620.c | 17 +++-- .../rcar/module/rcar_scif/src/mod_rcar_scif.c | 14 +++- .../module/f_uart3/src/mod_f_uart3.c | 14 +++- unit_test/unity_mocks/mocks/Mockfwk_module.c | 69 +++++++++++++++++-- unit_test/unity_mocks/mocks/Mockfwk_module.h | 14 +++- 24 files changed, 321 insertions(+), 119 deletions(-) diff --git a/framework/include/fwk_module.h b/framework/include/fwk_module.h index 3663e887a..1cd02a805 100644 --- a/framework/include/fwk_module.h +++ b/framework/include/fwk_module.h @@ -513,12 +513,16 @@ bool fwk_module_is_valid_notification_id(fwk_id_t id); /*! * \brief Get the number of elements within a module. * - * \param module_id Identifier of the module. + * \param module_id Identifier of the module. + * \param mod_elem_count Address of the variable that will store the + * module element count. * * \retval ::FWK_E_PARAM The identifier of the module is invalid. - * \return Number of module elements. + * \retval ::FWK_E_DATA The address of the module element count is invalid. + * \return The Status of the Request and Module Element count in case of + * successful Request. */ -int fwk_module_get_element_count(fwk_id_t module_id); +int fwk_module_get_element_count(fwk_id_t module_id, size_t *mod_elem_count); /*! * \brief Get the number of sub-elements within an element. diff --git a/framework/src/fwk_module.c b/framework/src/fwk_module.c index 471ab6f21..6b9e36b13 100644 --- a/framework/src/fwk_module.c +++ b/framework/src/fwk_module.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * @@ -716,13 +716,25 @@ bool fwk_module_is_valid_notification_id(fwk_id_t id) #endif } -int fwk_module_get_element_count(fwk_id_t id) +int fwk_module_get_element_count(fwk_id_t module_id, size_t *module_elem_count) { - if (fwk_module_is_valid_module_id(id)) { - return (int)fwk_module_get_ctx(id)->element_count; + int status_code = FWK_SUCCESS; + + if (module_elem_count != NULL) { + if (fwk_module_is_valid_module_id(module_id)) { + /* Return the Module Element Count*/ + *module_elem_count = fwk_module_get_ctx(module_id)->element_count; + + } else { + /*Invalid Module ID. Return Error*/ + status_code = FWK_E_PARAM; + } } else { - return FWK_E_PARAM; + /* Invalid Variable Address, Return a Different Error*/ + status_code = FWK_E_DATA; } + + return status_code; } int fwk_module_get_sub_element_count(fwk_id_t element_id) diff --git a/module/pl011/src/mod_pl011.c b/module/pl011/src/mod_pl011.c index f8857aa70..703809011 100644 --- a/module/pl011/src/mod_pl011.c +++ b/module/pl011/src/mod_pl011.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2017-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -64,35 +64,44 @@ static void mod_pl011_enable(fwk_id_t id); static int init_element_ctx_table(void) { - size_t element_count; + size_t elem_count = 0; + int status; - element_count = (size_t)fwk_module_get_element_count(fwk_module_id_pl011); - if (element_count == 0) { + status = fwk_module_get_element_count(fwk_module_id_pl011, &elem_count); + if (status != FWK_SUCCESS) { + return status; + } + + if (elem_count == 0) { return FWK_E_RANGE; } pl011_ctx.elements = - fwk_mm_alloc(element_count, sizeof(pl011_ctx.elements[0])); + fwk_mm_alloc(elem_count, sizeof(pl011_ctx.elements[0])); pl011_ctx.elements_allocated = true; - for (size_t i = 0; i < element_count; i++) { + for (size_t i = 0; i < elem_count; i++) { pl011_ctx.elements[i].stream_id = FWK_ID_NONE; /* Ensure it is set to none as soon as set up*/ } - return FWK_SUCCESS; + return status; } static int mod_pl011_init_ctx(void) { - size_t element_count; + size_t element_count = 0; struct mod_pl011_element_ctx *ctx; int status; fwk_assert(!pl011_ctx.initialized); - element_count = (size_t)fwk_module_get_element_count(fwk_module_id_pl011); + status = fwk_module_get_element_count(fwk_module_id_pl011, &element_count); + if (status != FWK_SUCCESS) { + return status; + } + if (element_count == 0) { return FWK_E_RANGE; } diff --git a/module/pl011/test/mod_pl011_unit_test.c b/module/pl011/test/mod_pl011_unit_test.c index f46549a93..c7859e330 100644 --- a/module/pl011/test/mod_pl011_unit_test.c +++ b/module/pl011/test/mod_pl011_unit_test.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2023-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2023-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -20,7 +20,6 @@ #include UNIT_TEST_SRC #include "config_pl011.h" -struct fwk_io_stream stream; struct mod_pl011_element_cfg *cfg_ut; void setUp(void) @@ -171,10 +170,13 @@ void test_mod_pl011_io_putch_fail_clocked(void) void test_mod_pl011_init_ctx(void) { - /* Clear module context to ensure it is properly initialized */ - memset(&pl011_ctx, 0, sizeof(pl011_ctx)); + size_t dummy_count = 1; + + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); + + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); - fwk_module_get_element_count_ExpectAnyArgsAndReturn(1); fwk_module_get_data_ExpectAnyArgsAndReturn(cfg_ut); fwk_id_is_equal_ExpectAnyArgsAndReturn(true); @@ -188,11 +190,13 @@ void test_mod_pl011_init_ctx(void) void test_mod_pl011_init_ctx_open_requests(void) { fwk_id_t stream_id_ut = FWK_ID_ELEMENT(FWK_MODULE_IDX_PL011, 0); + size_t dummy_count = 1; /* Clear module context to ensure it is properly initialized */ memset(&pl011_ctx, 0, sizeof(pl011_ctx)); - fwk_module_get_element_count_ExpectAnyArgsAndReturn(1); + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); pl011_ctx.elements_allocated = true; /* @@ -201,7 +205,9 @@ void test_mod_pl011_init_ctx_open_requests(void) */ init_element_ctx_table(); - fwk_module_get_element_count_ExpectAnyArgsAndReturn(1); + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); + fwk_module_get_data_ExpectAnyArgsAndReturn(cfg_ut); fwk_id_is_equal_ExpectAndReturn(stream_id_ut, FWK_ID_NONE, false); @@ -229,6 +235,7 @@ void test_mod_pl011_init(void) { int status; fwk_id_t module_id; + size_t dummy_count = 1; /* Clear module context to ensure it is properly initialized */ memset(&pl011_ctx, 0, sizeof(pl011_ctx)); @@ -236,8 +243,12 @@ void test_mod_pl011_init(void) pl011_ctx.initialized = false; /* Set up the mock calls for the context initialisation */ - fwk_module_get_element_count_ExpectAnyArgsAndReturn(1); - fwk_module_get_element_count_ExpectAnyArgsAndReturn(1); + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); + + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); + fwk_module_get_data_ExpectAnyArgsAndReturn(cfg_ut); fwk_id_is_equal_ExpectAnyArgsAndReturn(true); @@ -280,7 +291,9 @@ void test_mod_pl011_io_open_busy(void) struct fwk_io_stream stream; fwk_id_is_type_ExpectAnyArgsAndReturn(true); - fwk_module_get_element_count_ExpectAnyArgsAndReturn(1); + size_t dummy_count = 1; + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); pl011_ctx.elements_allocated = true; pl011_ctx.initialized = true; @@ -297,7 +310,10 @@ void test_mod_pl011_io_open_not_initalised(void) struct fwk_io_stream stream; fwk_id_is_type_ExpectAnyArgsAndReturn(true); - fwk_module_get_element_count_ExpectAnyArgsAndReturn(1); + + size_t dummy_count = 1; + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); pl011_ctx.initialized = false; @@ -362,7 +378,9 @@ void test_init_element_ctx_table_fail(void) { int status; - fwk_module_get_element_count_ExpectAnyArgsAndReturn(0); + size_t dummy_count = 0; + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); status = init_element_ctx_table(); TEST_ASSERT_EQUAL(status, FWK_E_RANGE); @@ -372,7 +390,9 @@ void test_init_element_ctx_table(void) { int status; - fwk_module_get_element_count_ExpectAnyArgsAndReturn(1); + size_t dummy_count = 1; + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); status = init_element_ctx_table(); TEST_ASSERT_EQUAL(status, FWK_SUCCESS); diff --git a/module/scmi_clock/src/mod_scmi_clock.c b/module/scmi_clock/src/mod_scmi_clock.c index b602ef413..d7d8a107e 100644 --- a/module/scmi_clock/src/mod_scmi_clock.c +++ b/module/scmi_clock/src/mod_scmi_clock.c @@ -1725,7 +1725,8 @@ static struct mod_scmi_to_protocol_api scmi_clock_mod_scmi_to_protocol_api = { static int scmi_clock_init(fwk_id_t module_id, unsigned int element_count, const void *data) { - int clock_devices; + size_t clock_devices; + int status; const struct mod_scmi_clock_config *config = (const struct mod_scmi_clock_config *)data; @@ -1738,12 +1739,12 @@ static int scmi_clock_init(fwk_id_t module_id, unsigned int element_count, scmi_clock_ctx.agent_table = (struct mod_scmi_clock_agent *)config->agent_table; - clock_devices = fwk_module_get_element_count(fwk_module_id_clock); - if (clock_devices == FWK_E_PARAM) { - return FWK_E_PANIC; + status = fwk_module_get_element_count(fwk_module_id_clock, &clock_devices); + if (status != FWK_SUCCESS) { + return status; } - scmi_clock_ctx.clock_devices = clock_devices; + scmi_clock_ctx.clock_devices = (int)clock_devices; /* Allocate a table of clock operations */ scmi_clock_ctx.clock_ops = diff --git a/module/scmi_perf/src/mod_scmi_perf.c b/module/scmi_perf/src/mod_scmi_perf.c index 15098ea55..a7797dfdd 100644 --- a/module/scmi_perf/src/mod_scmi_perf.c +++ b/module/scmi_perf/src/mod_scmi_perf.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * @@ -363,7 +363,8 @@ static struct mod_scmi_perf_private_api_perf_stub api_perf_stub = { static int scmi_perf_init(fwk_id_t module_id, unsigned int element_count, const void *data) { - int dvfs_doms_count; + int status_code; + size_t dvfs_doms_count; const struct mod_scmi_perf_config *config = (const struct mod_scmi_perf_config *)data; @@ -376,9 +377,14 @@ static int scmi_perf_init(fwk_id_t module_id, unsigned int element_count, return FWK_E_PARAM; } - dvfs_doms_count = - fwk_module_get_element_count(FWK_ID_MODULE(FWK_MODULE_IDX_DVFS)); - if (dvfs_doms_count <= 0) { + status_code = fwk_module_get_element_count( + FWK_ID_MODULE(FWK_MODULE_IDX_DVFS), &dvfs_doms_count); + + if (status_code != FWK_SUCCESS) { + return status_code; + } + + if (dvfs_doms_count == 0) { return FWK_E_SUPPORT; } diff --git a/module/scmi_perf/src/perf_plugins_handler.c b/module/scmi_perf/src/perf_plugins_handler.c index 4cca38f8a..31d0cb25a 100644 --- a/module/scmi_perf/src/perf_plugins_handler.c +++ b/module/scmi_perf/src/perf_plugins_handler.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2021-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2021-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * @@ -545,23 +545,29 @@ static void perf_plugins_alloc_tables( int perf_plugins_handler_init(const struct mod_scmi_perf_config *config) { const struct mod_scmi_perf_domain_config *domain; - int dvfs_doms_count; + size_t dvfs_doms_count; + int status; struct perf_plugins_dev_ctx *dev_ctx; unsigned int pgroup, ldom = 0; size_t all_doms_count; unsigned int phy_group; bool has_phy_group; - dvfs_doms_count = - fwk_module_get_element_count(FWK_ID_MODULE(FWK_MODULE_IDX_DVFS)); - if (dvfs_doms_count <= 0) { + status = fwk_module_get_element_count( + FWK_ID_MODULE(FWK_MODULE_IDX_DVFS), &dvfs_doms_count); + + if (status != FWK_SUCCESS) { + return status; + } + + if (dvfs_doms_count == 0) { return FWK_E_SUPPORT; } - perf_plugins_ctx.dvfs_doms_count = (size_t)dvfs_doms_count; + perf_plugins_ctx.dvfs_doms_count = dvfs_doms_count; - perf_plugins_ctx.dev_ctx = fwk_mm_calloc( - (size_t)dvfs_doms_count, sizeof(struct perf_plugins_dev_ctx)); + perf_plugins_ctx.dev_ctx = + fwk_mm_calloc(dvfs_doms_count, sizeof(struct perf_plugins_dev_ctx)); /* * Iterate all over the SCMI performance domain table to build the number of diff --git a/module/scmi_perf/test/module/mod_scmi_perf_unit_test.c b/module/scmi_perf/test/module/mod_scmi_perf_unit_test.c index 8c008c305..b5d18a9a9 100644 --- a/module/scmi_perf/test/module/mod_scmi_perf_unit_test.c +++ b/module/scmi_perf/test/module/mod_scmi_perf_unit_test.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2022-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2022-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -72,9 +72,10 @@ void utest_scmi_perf_init_no_dvfs_domains(void) { int status; fwk_id_t module_id; + size_t dummy_count = 0; - fwk_module_get_element_count_ExpectAndReturn( - FWK_ID_MODULE(FWK_MODULE_IDX_DVFS), 0); + fwk_module_get_element_count_ExpectAnyArgsAndReturn(0); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); module_id = FWK_ID_MODULE(FWK_MODULE_IDX_SCMI_PERF); status = scmi_perf_init(module_id, 0, &perf_config); diff --git a/module/scmi_perf/test/plugins_handler/mod_scmi_perf_ph_unit_test.c b/module/scmi_perf/test/plugins_handler/mod_scmi_perf_ph_unit_test.c index 3950c7231..51c3bb88e 100644 --- a/module/scmi_perf/test/plugins_handler/mod_scmi_perf_ph_unit_test.c +++ b/module/scmi_perf/test/plugins_handler/mod_scmi_perf_ph_unit_test.c @@ -369,7 +369,11 @@ void utest_perf_eval_performance_new_limits_level_up(void) void utest_perf_plugins_handler_init_fail_no_dvfs_doms(void) { int status; - fwk_module_get_element_count_ExpectAnyArgsAndReturn(0); + + size_t dummy_count = 0; + + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); status = perf_plugins_handler_init(config_scmi_perf.data); TEST_ASSERT_EQUAL(status, FWK_E_SUPPORT); @@ -381,9 +385,12 @@ void utest_perf_plugins_handler_init_success(void) fwk_id_t dep_id_table[SCMI_PERF_ELEMENT_IDX_COUNT]; int status; - memset(dev_ctx, 0, sizeof(*dev_ctx) * DVFS_ELEMENT_IDX_COUNT); + size_t dummy_count = DVFS_ELEMENT_IDX_COUNT; - fwk_module_get_element_count_ExpectAnyArgsAndReturn(DVFS_ELEMENT_IDX_COUNT); + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); + + memset(dev_ctx, 0, sizeof(*dev_ctx) * DVFS_ELEMENT_IDX_COUNT); fwk_mm_calloc_ExpectAndReturn( DVFS_ELEMENT_IDX_COUNT, diff --git a/module/scmi_power_domain/src/mod_scmi_power_domain.c b/module/scmi_power_domain/src/mod_scmi_power_domain.c index bf073e303..be8982e8d 100644 --- a/module/scmi_power_domain/src/mod_scmi_power_domain.c +++ b/module/scmi_power_domain/src/mod_scmi_power_domain.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * @@ -1130,6 +1130,8 @@ static struct mod_scmi_to_protocol_api scmi_pd_mod_scmi_to_protocol_api = { static int scmi_pd_init(fwk_id_t module_id, unsigned int element_count, const void *data) { + int status; + size_t domain_count; #if defined(BUILD_HAS_MOD_DEBUG) || defined(BUILD_HAS_AGENT_LOGICAL_DOMAIN) struct mod_scmi_pd_config *config = (struct mod_scmi_pd_config *)data; #endif @@ -1138,12 +1140,19 @@ static int scmi_pd_init(fwk_id_t module_id, unsigned int element_count, return FWK_E_SUPPORT; } - scmi_pd_ctx.domain_count = - (unsigned int)fwk_module_get_element_count(fwk_module_id_power_domain); - if (scmi_pd_ctx.domain_count <= 1) { + status = + fwk_module_get_element_count(fwk_module_id_power_domain, &domain_count); + + if (status != FWK_SUCCESS) { + return status; + } + + if (domain_count <= 1) { return FWK_E_SUPPORT; } + scmi_pd_ctx.domain_count = (unsigned int)domain_count; + /* Do not expose SYSTEM domain (always the last one) to agents and ... */ scmi_pd_ctx.domain_count--; /* ... and expose no more than 0xFFFF number of domains. */ diff --git a/module/scmi_reset_domain/src/mod_scmi_reset_domain.c b/module/scmi_reset_domain/src/mod_scmi_reset_domain.c index efa19572d..49795904b 100644 --- a/module/scmi_reset_domain/src/mod_scmi_reset_domain.c +++ b/module/scmi_reset_domain/src/mod_scmi_reset_domain.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2019-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2019-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * @@ -638,7 +638,7 @@ static int scmi_reset_init_notifications(void) static int scmi_reset_bind(fwk_id_t id, unsigned int round) { int status; - int rst_dom_count; + size_t rst_dom_count; if (round == 1) return FWK_SUCCESS; @@ -659,10 +659,12 @@ static int scmi_reset_bind(fwk_id_t id, unsigned int round) return status; #endif - rst_dom_count = fwk_module_get_element_count( - FWK_ID_MODULE(FWK_MODULE_IDX_RESET_DOMAIN)); + status = fwk_module_get_element_count( + FWK_ID_MODULE(FWK_MODULE_IDX_RESET_DOMAIN), &rst_dom_count); - if (rst_dom_count <= 0) { + if (status != FWK_SUCCESS) { + return status; + } else if (rst_dom_count == 0) { return FWK_E_SUPPORT; } else { scmi_rd_ctx.plat_reset_domain_count = (uint8_t)rst_dom_count; diff --git a/module/scmi_sensor/src/mod_scmi_sensor.c b/module/scmi_sensor/src/mod_scmi_sensor.c index 757e5af6e..86dacbe77 100644 --- a/module/scmi_sensor/src/mod_scmi_sensor.c +++ b/module/scmi_sensor/src/mod_scmi_sensor.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * @@ -1002,18 +1002,27 @@ static int scmi_sensor_init(fwk_id_t module_id, unsigned int element_count, const void *unused) { + int status; + size_t sensor_count; if (element_count != 0) { /* This module should not have any elements */ fwk_unexpected(); return FWK_E_SUPPORT; } - scmi_sensor_ctx.sensor_count = (unsigned int)fwk_module_get_element_count( - FWK_ID_MODULE(FWK_MODULE_IDX_SENSOR)); - if (scmi_sensor_ctx.sensor_count == 0) { + status = fwk_module_get_element_count( + FWK_ID_MODULE(FWK_MODULE_IDX_SENSOR), &sensor_count); + + if (status != FWK_SUCCESS) { + return status; + } + + if (sensor_count == 0) { return FWK_E_SUPPORT; } + scmi_sensor_ctx.sensor_count = (unsigned int)sensor_count; + scmi_sensor_ctx.sensor_values = fwk_mm_calloc( scmi_sensor_ctx.sensor_count, sizeof(struct mod_sensor_data)); diff --git a/module/scmi_sensor/test/mod_scmi_sensor_unit_test.c b/module/scmi_sensor/test/mod_scmi_sensor_unit_test.c index 11b7ba90f..71653969f 100644 --- a/module/scmi_sensor/test/mod_scmi_sensor_unit_test.c +++ b/module/scmi_sensor/test/mod_scmi_sensor_unit_test.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -96,9 +96,10 @@ void utest_scmi_sensor_init_nz_elem_cnt(void) void utest_scmi_sensor_init_zero_sensor_cnt(void) { int status; + size_t dummy_count = 0; - fwk_module_get_element_count_ExpectAndReturn( - FWK_ID_MODULE(FWK_MODULE_IDX_SENSOR), 0); + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); status = scmi_sensor_init(fwk_module_id_scmi_sensor, 0, NULL); @@ -115,12 +116,15 @@ void utest_scmi_sensor_init_success(void) fwk_id_t local_service_id = FWK_ID_NONE; - fwk_module_get_element_count_ExpectAndReturn( - FWK_ID_MODULE(FWK_MODULE_IDX_SENSOR), SCMI_SENSOR_ELEMENT_COUNT_SINGLE); + size_t dummy_count = SCMI_SENSOR_ELEMENT_COUNT_SINGLE; + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); + fwk_mm_calloc_ExpectAndReturn( SCMI_SENSOR_ELEMENT_COUNT_SINGLE, sizeof(struct mod_sensor_data), (void *)test_sensor_data); + fwk_mm_calloc_ExpectAndReturn( SCMI_SENSOR_ELEMENT_COUNT_SINGLE, sizeof(struct sensor_operations), @@ -148,13 +152,16 @@ void utest_scmi_sensor_init_success_cap_elem_count(void) fwk_id_t local_service_id = FWK_ID_NONE; - fwk_module_get_element_count_ExpectAndReturn( - FWK_ID_MODULE(FWK_MODULE_IDX_SENSOR), - SCMI_SENSOR_ELEMENT_COUNT_OVER_SIZE); + size_t dummy_count = SCMI_SENSOR_ELEMENT_COUNT_OVER_SIZE; + + fwk_module_get_element_count_ExpectAnyArgsAndReturn(FWK_SUCCESS); + fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(&dummy_count); + fwk_mm_calloc_ExpectAndReturn( SCMI_SENSOR_ELEMENT_COUNT_OVER_SIZE, sizeof(struct mod_sensor_data), (void *)test_sensor_data); + fwk_mm_calloc_ExpectAndReturn( SCMI_SENSOR_ELEMENT_COUNT_MAXIMUM, sizeof(struct sensor_operations), diff --git a/module/scmi_system_power/src/mod_scmi_system_power.c b/module/scmi_system_power/src/mod_scmi_system_power.c index 8d830d631..14ec461c8 100644 --- a/module/scmi_system_power/src/mod_scmi_system_power.c +++ b/module/scmi_system_power/src/mod_scmi_system_power.c @@ -737,7 +737,7 @@ static int scmi_sys_power_init_notifications(void) static int scmi_sys_power_bind(fwk_id_t id, unsigned int round) { int status; - int pd_count; + size_t pd_count = 0; if (round != 0) { return FWK_SUCCESS; @@ -759,8 +759,13 @@ static int scmi_sys_power_bind(fwk_id_t id, unsigned int round) return status; } - pd_count = fwk_module_get_element_count(fwk_module_id_power_domain); - if (pd_count <= 0) { + status = + fwk_module_get_element_count(fwk_module_id_power_domain, &pd_count); + if (status != FWK_SUCCESS) { + return status; + } + + if (pd_count == 0) { return FWK_E_SUPPORT; } diff --git a/module/scmi_voltage_domain/src/mod_scmi_voltage_domain.c b/module/scmi_voltage_domain/src/mod_scmi_voltage_domain.c index 22dbf683b..d0397a601 100644 --- a/module/scmi_voltage_domain/src/mod_scmi_voltage_domain.c +++ b/module/scmi_voltage_domain/src/mod_scmi_voltage_domain.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * @@ -705,7 +705,8 @@ static struct mod_scmi_to_protocol_api scmi_voltd_mod_scmi_to_protocol_api = { static int scmi_voltd_init(fwk_id_t module_id, unsigned int element_count, const void *data) { - int voltd_devices; + size_t voltd_devices; + int status; const struct mod_scmi_voltd_config *config = (const struct mod_scmi_voltd_config *)data; @@ -715,11 +716,14 @@ static int scmi_voltd_init(fwk_id_t module_id, unsigned int element_count, scmi_voltd_ctx.config = config; scmi_voltd_ctx.agent_table = config->agent_table; - voltd_devices = fwk_module_get_element_count(fwk_module_id_voltage_domain); - if (voltd_devices == FWK_E_PARAM) - return FWK_E_PANIC; + status = fwk_module_get_element_count( + fwk_module_id_voltage_domain, &voltd_devices); + + if (status != FWK_SUCCESS) { + return status; + } - scmi_voltd_ctx.voltd_devices = voltd_devices; + scmi_voltd_ctx.voltd_devices = (int)voltd_devices; scmi_voltd_ctx.voltd_ops = fwk_mm_calloc((unsigned int)voltd_devices, sizeof(struct voltd_operations)); diff --git a/module/sds/src/mod_sds.c b/module/sds/src/mod_sds.c index c7331bb1e..7996b3796 100644 --- a/module/sds/src/mod_sds.c +++ b/module/sds/src/mod_sds.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2017-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -506,7 +506,7 @@ static int init_sds(void) const struct mod_sds_config *config; int status; int element_idx; - int element_count; + size_t element_count; const struct mod_sds_structure_desc *struct_desc; unsigned int region_idx; const struct mod_sds_region_desc *region_config; @@ -533,8 +533,12 @@ static int init_sds(void) } } - element_count = fwk_module_get_element_count(fwk_module_id_sds); - for (element_idx = 0; element_idx < element_count; ++element_idx) { + status = fwk_module_get_element_count(fwk_module_id_sds, &element_count); + if (status != FWK_SUCCESS) { + return status; + } + + for (element_idx = 0; element_idx < (int)element_count; ++element_idx) { struct_desc = fwk_module_get_data(fwk_id_build_element_id( fwk_module_id_sds, (unsigned int)element_idx)); diff --git a/module/stdio/src/mod_stdio.c b/module/stdio/src/mod_stdio.c index 3e142faca..7baa8b3cb 100644 --- a/module/stdio/src/mod_stdio.c +++ b/module/stdio/src/mod_stdio.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2017-2021, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -29,7 +29,14 @@ static struct { static int mod_stdio_init_ctx(void) { - size_t element_count = fwk_module_get_element_count(fwk_module_id_stdio); + int status; + size_t element_count; + + status = fwk_module_get_element_count(fwk_module_id_stdio, &element_count); + + if (status != FWK_SUCCESS) { + return status; + } mod_stdio_ctx.elements = fwk_mm_calloc(element_count, sizeof(*mod_stdio_ctx.elements)); diff --git a/product/juno/module/juno_pvt/src/mod_juno_pvt.c b/product/juno/module/juno_pvt/src/mod_juno_pvt.c index fb9e855d8..8a77f13b8 100644 --- a/product/juno/module/juno_pvt/src/mod_juno_pvt.c +++ b/product/juno/module/juno_pvt/src/mod_juno_pvt.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2020-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * diff --git a/product/morello/module/dmc_bing/src/mod_dmc_bing.c b/product/morello/module/dmc_bing/src/mod_dmc_bing.c index d2882e9c3..467dafeb5 100644 --- a/product/morello/module/dmc_bing/src/mod_dmc_bing.c +++ b/product/morello/module/dmc_bing/src/mod_dmc_bing.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2018-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2018-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * @@ -959,12 +959,17 @@ static int dmc_bing_post_init(void) int status; int i; int j; - int count; + size_t count; fwk_id_t id; - count = - fwk_module_get_element_count(FWK_ID_MODULE(FWK_MODULE_IDX_DMC_BING)); - for (i = 0; i < count; i++) { + status = fwk_module_get_element_count( + FWK_ID_MODULE(FWK_MODULE_IDX_DMC_BING), &count); + + if (status != FWK_SUCCESS) { + return status; + } + + for (i = 0; i < (int)count; i++) { id = FWK_ID_ELEMENT(FWK_MODULE_IDX_DMC_BING, i); FWK_LOG_INFO("[DDR] Verifying PHY status for DMC %d...", i); @@ -975,7 +980,7 @@ static int dmc_bing_post_init(void) FWK_LOG_INFO("[DDR] Done"); } - for (i = 0; i < count; i++) { + for (i = 0; i < (int)count; i++) { id = FWK_ID_ELEMENT(FWK_MODULE_IDX_DMC_BING, i); for (j = 1; j <= ddr_info.number_of_ranks; j++) { morello_phy_obs_regs(id, j, &ddr_info); diff --git a/product/n1sdp/module/n1sdp_dmc620/src/mod_n1sdp_dmc620.c b/product/n1sdp/module/n1sdp_dmc620/src/mod_n1sdp_dmc620.c index 2d719d293..f0e3cdc26 100644 --- a/product/n1sdp/module/n1sdp_dmc620/src/mod_n1sdp_dmc620.c +++ b/product/n1sdp/module/n1sdp_dmc620/src/mod_n1sdp_dmc620.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2019-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2019-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * @@ -871,13 +871,18 @@ static int dmc620_post_init(void) int status; int i; int j; - int count; + size_t count; fwk_id_t id; const struct mod_dmc620_element_config *element_config; - count = fwk_module_get_element_count( - FWK_ID_MODULE(FWK_MODULE_IDX_N1SDP_DMC620)); - for (i = 0; i < count; i++) { + status = fwk_module_get_element_count( + FWK_ID_MODULE(FWK_MODULE_IDX_N1SDP_DMC620), &count); + + if (status != FWK_SUCCESS) { + return status; + } + + for (i = 0; i < (int)count; i++) { id = FWK_ID_ELEMENT(FWK_MODULE_IDX_N1SDP_DMC620, i); element_config = fwk_module_get_data(id); @@ -889,7 +894,7 @@ static int dmc620_post_init(void) FWK_LOG_INFO("[DDR] Done"); } - for (i = 0; i < count; i++) { + for (i = 0; i < (int)count; i++) { id = FWK_ID_ELEMENT(FWK_MODULE_IDX_N1SDP_DMC620, i); element_config = fwk_module_get_data(id); for (j = 1; j <= ddr_info.number_of_ranks; j++) { diff --git a/product/rcar/module/rcar_scif/src/mod_rcar_scif.c b/product/rcar/module/rcar_scif/src/mod_rcar_scif.c index d6809f03e..ecc2eac9c 100644 --- a/product/rcar/module/rcar_scif/src/mod_rcar_scif.c +++ b/product/rcar/module/rcar_scif/src/mod_rcar_scif.c @@ -1,6 +1,6 @@ /* * Renesas SCP/MCP Software - * Copyright (c) 2020-2024, Renesas Electronics Corporation. All rights + * Copyright (c) 2020-2025, Renesas Electronics Corporation. All rights * reserved. * * SPDX-License-Identifier: BSD-3-Clause @@ -39,13 +39,21 @@ static const struct mod_rcar_scif_element_cfg *current_cfg; static int mod_rcar_scif_init_ctx(struct mod_rcar_scif_ctx *ctx) { + int status; size_t element_count; fwk_assert(!mod_rcar_scif_ctx.initialized); - element_count = fwk_module_get_element_count(fwk_module_id_rcar_scif); - if (element_count == 0) + status = + fwk_module_get_element_count(fwk_module_id_rcar_scif, &element_count); + + if (status != FWK_SUCCESS) { + return status; + } + + if (element_count == 0) { return FWK_SUCCESS; + } ctx->elements = fwk_mm_alloc(element_count, sizeof(ctx->elements[0])); if (!fwk_expect(ctx->elements != NULL)) diff --git a/product/synquacer/module/f_uart3/src/mod_f_uart3.c b/product/synquacer/module/f_uart3/src/mod_f_uart3.c index 102183deb..66c513620 100644 --- a/product/synquacer/module/f_uart3/src/mod_f_uart3.c +++ b/product/synquacer/module/f_uart3/src/mod_f_uart3.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2018-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2018-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -68,13 +68,21 @@ static const struct { static int mod_f_uart3_init_ctx(struct mod_f_uart3_ctx *ctx) { + int status; size_t element_count; fwk_assert(!mod_f_uart3_ctx.initialized); - element_count = fwk_module_get_element_count(fwk_module_id_f_uart3); - if (element_count == 0) + status = + fwk_module_get_element_count(fwk_module_id_f_uart3, &element_count); + + if (status != FWK_SUCCESS) { + return status; + } + + if (element_count == 0) { return FWK_SUCCESS; + } ctx->elements = fwk_mm_alloc(element_count, sizeof(ctx->elements[0])); if (!fwk_expect(ctx->elements != NULL)) diff --git a/unit_test/unity_mocks/mocks/Mockfwk_module.c b/unit_test/unity_mocks/mocks/Mockfwk_module.c index 8af1de9d7..9cc1d73bd 100644 --- a/unit_test/unity_mocks/mocks/Mockfwk_module.c +++ b/unit_test/unity_mocks/mocks/Mockfwk_module.c @@ -24,6 +24,7 @@ static const char* CMockString_fwk_module_is_valid_module_id = "fwk_module_is_va static const char* CMockString_fwk_module_is_valid_notification_id = "fwk_module_is_valid_notification_id"; static const char* CMockString_fwk_module_is_valid_sub_element_id = "fwk_module_is_valid_sub_element_id"; static const char* CMockString_id = "id"; +static const char* CMockString_mod_elem_count = "mod_elem_count"; static const char* CMockString_module_id = "module_id"; static const char* CMockString_target_id = "target_id"; @@ -103,7 +104,13 @@ typedef struct _CMOCK_fwk_module_get_element_count_CALL_INSTANCE char ExpectAnyArgsBool; int ReturnVal; fwk_id_t Expected_module_id; + size_t* Expected_mod_elem_count; + int Expected_mod_elem_count_Depth; + char ReturnThruPtr_mod_elem_count_Used; + size_t* ReturnThruPtr_mod_elem_count_Val; + size_t ReturnThruPtr_mod_elem_count_Size; char IgnoreArg_module_id; + char IgnoreArg_mod_elem_count; } CMOCK_fwk_module_get_element_count_CALL_INSTANCE; @@ -1289,7 +1296,7 @@ void fwk_module_is_valid_notification_id_CMockIgnoreArg_id(UNITY_LINE_TYPE cmock cmock_call_instance->IgnoreArg_id = 1; } -int fwk_module_get_element_count(fwk_id_t module_id) +int fwk_module_get_element_count(fwk_id_t module_id, size_t* mod_elem_count) { UNITY_LINE_TYPE cmock_line = TEST_LINE_NUM; CMOCK_fwk_module_get_element_count_CALL_INSTANCE* cmock_call_instance; @@ -1307,7 +1314,7 @@ int fwk_module_get_element_count(fwk_id_t module_id) if (!Mock.fwk_module_get_element_count_CallbackBool && Mock.fwk_module_get_element_count_CallbackFunctionPointer != NULL) { - int cmock_cb_ret = Mock.fwk_module_get_element_count_CallbackFunctionPointer(module_id, Mock.fwk_module_get_element_count_CallbackCalls++); + int cmock_cb_ret = Mock.fwk_module_get_element_count_CallbackFunctionPointer(module_id, mod_elem_count, Mock.fwk_module_get_element_count_CallbackCalls++); UNITY_CLR_DETAILS(); return cmock_cb_ret; } @@ -1320,21 +1327,39 @@ int fwk_module_get_element_count(fwk_id_t module_id) UNITY_SET_DETAILS(CMockString_fwk_module_get_element_count,CMockString_module_id); UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(&cmock_call_instance->Expected_module_id), (void*)(&module_id), sizeof(fwk_id_t), cmock_line, CMockStringMismatch); } + if (!cmock_call_instance->IgnoreArg_mod_elem_count) + { + UNITY_SET_DETAILS(CMockString_fwk_module_get_element_count,CMockString_mod_elem_count); + if (cmock_call_instance->Expected_mod_elem_count == NULL) + { UNITY_TEST_ASSERT_NULL(mod_elem_count, cmock_line, CMockStringExpNULL); } + else + { UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(cmock_call_instance->Expected_mod_elem_count), (void*)(mod_elem_count), sizeof(size_t), cmock_call_instance->Expected_mod_elem_count_Depth, cmock_line, CMockStringMismatch); } + } } if (Mock.fwk_module_get_element_count_CallbackFunctionPointer != NULL) { - cmock_call_instance->ReturnVal = Mock.fwk_module_get_element_count_CallbackFunctionPointer(module_id, Mock.fwk_module_get_element_count_CallbackCalls++); + cmock_call_instance->ReturnVal = Mock.fwk_module_get_element_count_CallbackFunctionPointer(module_id, mod_elem_count, Mock.fwk_module_get_element_count_CallbackCalls++); + } + if (cmock_call_instance->ReturnThruPtr_mod_elem_count_Used) + { + UNITY_TEST_ASSERT_NOT_NULL(mod_elem_count, cmock_line, CMockStringPtrIsNULL); + memcpy((void*)mod_elem_count, (void*)cmock_call_instance->ReturnThruPtr_mod_elem_count_Val, + cmock_call_instance->ReturnThruPtr_mod_elem_count_Size); } UNITY_CLR_DETAILS(); return cmock_call_instance->ReturnVal; } -void CMockExpectParameters_fwk_module_get_element_count(CMOCK_fwk_module_get_element_count_CALL_INSTANCE* cmock_call_instance, fwk_id_t module_id); -void CMockExpectParameters_fwk_module_get_element_count(CMOCK_fwk_module_get_element_count_CALL_INSTANCE* cmock_call_instance, fwk_id_t module_id) +void CMockExpectParameters_fwk_module_get_element_count(CMOCK_fwk_module_get_element_count_CALL_INSTANCE* cmock_call_instance, fwk_id_t module_id, size_t* mod_elem_count, int mod_elem_count_Depth); +void CMockExpectParameters_fwk_module_get_element_count(CMOCK_fwk_module_get_element_count_CALL_INSTANCE* cmock_call_instance, fwk_id_t module_id, size_t* mod_elem_count, int mod_elem_count_Depth) { memcpy((void*)(&cmock_call_instance->Expected_module_id), (void*)(&module_id), sizeof(fwk_id_t[sizeof(module_id) == sizeof(fwk_id_t) ? 1 : -1])); /* add fwk_id_t to :treat_as_array if this causes an error */ cmock_call_instance->IgnoreArg_module_id = 0; + cmock_call_instance->Expected_mod_elem_count = mod_elem_count; + cmock_call_instance->Expected_mod_elem_count_Depth = mod_elem_count_Depth; + cmock_call_instance->IgnoreArg_mod_elem_count = 0; + cmock_call_instance->ReturnThruPtr_mod_elem_count_Used = 0; } void fwk_module_get_element_count_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, int cmock_to_return) @@ -1372,7 +1397,7 @@ void fwk_module_get_element_count_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cm cmock_call_instance->ExpectAnyArgsBool = (char)1; } -void fwk_module_get_element_count_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t module_id, int cmock_to_return) +void fwk_module_get_element_count_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t module_id, size_t* mod_elem_count, int cmock_to_return) { CMOCK_MEM_INDEX_TYPE cmock_guts_index = CMock_Guts_MemNew(sizeof(CMOCK_fwk_module_get_element_count_CALL_INSTANCE)); CMOCK_fwk_module_get_element_count_CALL_INSTANCE* cmock_call_instance = (CMOCK_fwk_module_get_element_count_CALL_INSTANCE*)CMock_Guts_GetAddressFor(cmock_guts_index); @@ -1382,7 +1407,7 @@ void fwk_module_get_element_count_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_lin Mock.fwk_module_get_element_count_IgnoreBool = (char)0; cmock_call_instance->LineNumber = cmock_line; cmock_call_instance->ExpectAnyArgsBool = (char)0; - CMockExpectParameters_fwk_module_get_element_count(cmock_call_instance, module_id); + CMockExpectParameters_fwk_module_get_element_count(cmock_call_instance, module_id, mod_elem_count, 1); cmock_call_instance->ReturnVal = cmock_to_return; } @@ -1400,6 +1425,29 @@ void fwk_module_get_element_count_Stub(CMOCK_fwk_module_get_element_count_CALLBA Mock.fwk_module_get_element_count_CallbackFunctionPointer = Callback; } +void fwk_module_get_element_count_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t module_id, size_t* mod_elem_count, int mod_elem_count_Depth, int cmock_to_return) +{ + CMOCK_MEM_INDEX_TYPE cmock_guts_index = CMock_Guts_MemNew(sizeof(CMOCK_fwk_module_get_element_count_CALL_INSTANCE)); + CMOCK_fwk_module_get_element_count_CALL_INSTANCE* cmock_call_instance = (CMOCK_fwk_module_get_element_count_CALL_INSTANCE*)CMock_Guts_GetAddressFor(cmock_guts_index); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringOutOfMemory); + memset(cmock_call_instance, 0, sizeof(*cmock_call_instance)); + Mock.fwk_module_get_element_count_CallInstance = CMock_Guts_MemChain(Mock.fwk_module_get_element_count_CallInstance, cmock_guts_index); + Mock.fwk_module_get_element_count_IgnoreBool = (char)0; + cmock_call_instance->LineNumber = cmock_line; + cmock_call_instance->ExpectAnyArgsBool = (char)0; + CMockExpectParameters_fwk_module_get_element_count(cmock_call_instance, module_id, mod_elem_count, mod_elem_count_Depth); + cmock_call_instance->ReturnVal = cmock_to_return; +} + +void fwk_module_get_element_count_CMockReturnMemThruPtr_mod_elem_count(UNITY_LINE_TYPE cmock_line, size_t* mod_elem_count, size_t cmock_size) +{ + CMOCK_fwk_module_get_element_count_CALL_INSTANCE* cmock_call_instance = (CMOCK_fwk_module_get_element_count_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.fwk_module_get_element_count_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringPtrPreExp); + cmock_call_instance->ReturnThruPtr_mod_elem_count_Used = 1; + cmock_call_instance->ReturnThruPtr_mod_elem_count_Val = mod_elem_count; + cmock_call_instance->ReturnThruPtr_mod_elem_count_Size = cmock_size; +} + void fwk_module_get_element_count_CMockIgnoreArg_module_id(UNITY_LINE_TYPE cmock_line) { CMOCK_fwk_module_get_element_count_CALL_INSTANCE* cmock_call_instance = (CMOCK_fwk_module_get_element_count_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.fwk_module_get_element_count_CallInstance)); @@ -1407,6 +1455,13 @@ void fwk_module_get_element_count_CMockIgnoreArg_module_id(UNITY_LINE_TYPE cmock cmock_call_instance->IgnoreArg_module_id = 1; } +void fwk_module_get_element_count_CMockIgnoreArg_mod_elem_count(UNITY_LINE_TYPE cmock_line) +{ + CMOCK_fwk_module_get_element_count_CALL_INSTANCE* cmock_call_instance = (CMOCK_fwk_module_get_element_count_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.fwk_module_get_element_count_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); + cmock_call_instance->IgnoreArg_mod_elem_count = 1; +} + int fwk_module_get_sub_element_count(fwk_id_t element_id) { UNITY_LINE_TYPE cmock_line = TEST_LINE_NUM; diff --git a/unit_test/unity_mocks/mocks/Mockfwk_module.h b/unit_test/unity_mocks/mocks/Mockfwk_module.h index be295292e..dd6e1ec44 100644 --- a/unit_test/unity_mocks/mocks/Mockfwk_module.h +++ b/unit_test/unity_mocks/mocks/Mockfwk_module.h @@ -128,14 +128,22 @@ void fwk_module_get_element_count_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_lin void fwk_module_get_element_count_CMockStopIgnore(void); #define fwk_module_get_element_count_ExpectAnyArgsAndReturn(cmock_retval) fwk_module_get_element_count_CMockExpectAnyArgsAndReturn(__LINE__, cmock_retval) void fwk_module_get_element_count_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, int cmock_to_return); -#define fwk_module_get_element_count_ExpectAndReturn(module_id, cmock_retval) fwk_module_get_element_count_CMockExpectAndReturn(__LINE__, module_id, cmock_retval) -void fwk_module_get_element_count_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t module_id, int cmock_to_return); -typedef int (* CMOCK_fwk_module_get_element_count_CALLBACK)(fwk_id_t module_id, int cmock_num_calls); +#define fwk_module_get_element_count_ExpectAndReturn(module_id, mod_elem_count, cmock_retval) fwk_module_get_element_count_CMockExpectAndReturn(__LINE__, module_id, mod_elem_count, cmock_retval) +void fwk_module_get_element_count_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t module_id, size_t* mod_elem_count, int cmock_to_return); +typedef int (* CMOCK_fwk_module_get_element_count_CALLBACK)(fwk_id_t module_id, size_t* mod_elem_count, int cmock_num_calls); void fwk_module_get_element_count_AddCallback(CMOCK_fwk_module_get_element_count_CALLBACK Callback); void fwk_module_get_element_count_Stub(CMOCK_fwk_module_get_element_count_CALLBACK Callback); #define fwk_module_get_element_count_StubWithCallback fwk_module_get_element_count_Stub +#define fwk_module_get_element_count_ExpectWithArrayAndReturn(module_id, mod_elem_count, mod_elem_count_Depth, cmock_retval) fwk_module_get_element_count_CMockExpectWithArrayAndReturn(__LINE__, module_id, mod_elem_count, mod_elem_count_Depth, cmock_retval) +void fwk_module_get_element_count_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t module_id, size_t* mod_elem_count, int mod_elem_count_Depth, int cmock_to_return); +#define fwk_module_get_element_count_ReturnThruPtr_mod_elem_count(mod_elem_count) fwk_module_get_element_count_CMockReturnMemThruPtr_mod_elem_count(__LINE__, mod_elem_count, sizeof(size_t)) +#define fwk_module_get_element_count_ReturnArrayThruPtr_mod_elem_count(mod_elem_count, cmock_len) fwk_module_get_element_count_CMockReturnMemThruPtr_mod_elem_count(__LINE__, mod_elem_count, cmock_len * sizeof(*mod_elem_count)) +#define fwk_module_get_element_count_ReturnMemThruPtr_mod_elem_count(mod_elem_count, cmock_size) fwk_module_get_element_count_CMockReturnMemThruPtr_mod_elem_count(__LINE__, mod_elem_count, cmock_size) +void fwk_module_get_element_count_CMockReturnMemThruPtr_mod_elem_count(UNITY_LINE_TYPE cmock_line, size_t* mod_elem_count, size_t cmock_size); #define fwk_module_get_element_count_IgnoreArg_module_id() fwk_module_get_element_count_CMockIgnoreArg_module_id(__LINE__) void fwk_module_get_element_count_CMockIgnoreArg_module_id(UNITY_LINE_TYPE cmock_line); +#define fwk_module_get_element_count_IgnoreArg_mod_elem_count() fwk_module_get_element_count_CMockIgnoreArg_mod_elem_count(__LINE__) +void fwk_module_get_element_count_CMockIgnoreArg_mod_elem_count(UNITY_LINE_TYPE cmock_line); #define fwk_module_get_sub_element_count_IgnoreAndReturn(cmock_retval) fwk_module_get_sub_element_count_CMockIgnoreAndReturn(__LINE__, cmock_retval) void fwk_module_get_sub_element_count_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, int cmock_to_return); #define fwk_module_get_sub_element_count_StopIgnore() fwk_module_get_sub_element_count_CMockStopIgnore() -- GitLab From c914b3f0c75611154affc6375f09d66ee9baf437 Mon Sep 17 00:00:00 2001 From: Mina Aziz Date: Tue, 13 May 2025 15:31:41 +0100 Subject: [PATCH 2/2] fwk: Refactor fwk_module_get_sub_element_count Refactor fwk_get_element_sub_element_count to return a status code and store the actual count in a pointer. This avoids returning -ve value due to any wrong configuration and use -ve values improperly. Signed-off-by: Mina Aziz --- framework/include/fwk_module.h | 12 ++- framework/src/fwk_module.c | 22 ++++- .../juno/module/juno_pvt/src/mod_juno_pvt.c | 18 ++-- product/synquacer/module/nor/src/mod_nor.c | 13 +-- unit_test/unity_mocks/mocks/Mockfwk_module.c | 91 +++++++++++++++---- unit_test/unity_mocks/mocks/Mockfwk_module.h | 18 +++- 6 files changed, 130 insertions(+), 44 deletions(-) diff --git a/framework/include/fwk_module.h b/framework/include/fwk_module.h index 1cd02a805..90334ee43 100644 --- a/framework/include/fwk_module.h +++ b/framework/include/fwk_module.h @@ -527,12 +527,18 @@ int fwk_module_get_element_count(fwk_id_t module_id, size_t *mod_elem_count); /*! * \brief Get the number of sub-elements within an element. * - * \param element_id Identifier of the element. + * \param element_id Identifier of the element. + * \param mod_sub_elem_cnt Address of the variable that will store the + * module element count. * * \retval ::FWK_E_PARAM The identifier of the element is invalid. - * \return Number of sub-elements. + * \retval ::FWK_E_DATA The address of the module sub element count is invalid. + * \return The Status of the Request and Module Sub Element count in case of + * successful Request. */ -int fwk_module_get_sub_element_count(fwk_id_t element_id); +int fwk_module_get_sub_element_count( + fwk_id_t element_id, + size_t *mod_sub_elem_cnt); /*! * \brief Get the name of a element. diff --git a/framework/src/fwk_module.c b/framework/src/fwk_module.c index 6b9e36b13..eecd33d07 100644 --- a/framework/src/fwk_module.c +++ b/framework/src/fwk_module.c @@ -737,13 +737,27 @@ int fwk_module_get_element_count(fwk_id_t module_id, size_t *module_elem_count) return status_code; } -int fwk_module_get_sub_element_count(fwk_id_t element_id) +int fwk_module_get_sub_element_count( + fwk_id_t element_id, + size_t *mod_sub_elem_cnt) { - if (fwk_module_is_valid_element_id(element_id)) { - return (int)fwk_module_get_element_ctx(element_id)->sub_element_count; + int status_code = FWK_SUCCESS; + + if (mod_sub_elem_cnt != NULL) { + if (fwk_module_is_valid_element_id(element_id)) { + /* Return the Module Sub Element Count*/ + *mod_sub_elem_cnt = + fwk_module_get_element_ctx(element_id)->sub_element_count; + + } else { + status_code = FWK_E_PARAM; + } } else { - return FWK_E_PARAM; + /* Invalid Variable Address, Return a Different Error*/ + status_code = FWK_E_DATA; } + + return status_code; } const char *fwk_module_get_element_name(fwk_id_t id) diff --git a/product/juno/module/juno_pvt/src/mod_juno_pvt.c b/product/juno/module/juno_pvt/src/mod_juno_pvt.c index 8a77f13b8..fdd3f1b9e 100644 --- a/product/juno/module/juno_pvt/src/mod_juno_pvt.c +++ b/product/juno/module/juno_pvt/src/mod_juno_pvt.c @@ -496,7 +496,7 @@ static int juno_pvt_element_init(fwk_id_t element_id, static int juno_pvt_bind(fwk_id_t id, unsigned int round) { int status; - int sub_element_count; + size_t sub_element_count; struct pvt_dev_ctx *group_ctx; struct pvt_sub_dev_ctx *sensor_ctx; @@ -508,9 +508,10 @@ static int juno_pvt_bind(fwk_id_t id, unsigned int round) group_ctx = &dev_ctx[fwk_id_get_element_idx(id)]; - sub_element_count = fwk_module_get_sub_element_count(id); - if (sub_element_count < 0) { - return FWK_E_DATA; + status = fwk_module_get_sub_element_count(id, &sub_element_count); + + if (status != FWK_SUCCESS) { + return status; } /* @@ -570,7 +571,7 @@ static int pvt_start(fwk_id_t id) { int status; struct mod_juno_pvt_dev_config *sensor_cfg; - int sub_element_count; + size_t sub_element_count; struct pvt_dev_ctx *group_ctx; struct pvt_sub_dev_ctx *sensor_ctx; uint16_t calibration_a; @@ -605,9 +606,10 @@ static int pvt_start(fwk_id_t id) group_ctx = &dev_ctx[fwk_id_get_element_idx(id)]; - sub_element_count = fwk_module_get_sub_element_count(id); - if (sub_element_count < 0) { - return FWK_E_DATA; + status = fwk_module_get_sub_element_count(id, &sub_element_count); + + if (status != FWK_SUCCESS) { + return status; } /* diff --git a/product/synquacer/module/nor/src/mod_nor.c b/product/synquacer/module/nor/src/mod_nor.c index 0ca6765be..0c1756da4 100644 --- a/product/synquacer/module/nor/src/mod_nor.c +++ b/product/synquacer/module/nor/src/mod_nor.c @@ -1,6 +1,6 @@ /* * Arm SCP/MCP Software - * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -803,7 +803,8 @@ static int nor_element_init( const void *data) { struct nor_dev_ctx *ctx; - int driver_sub_element_count; + size_t driver_sub_element_count; + int status; if (data == NULL) { return FWK_E_PANIC; @@ -821,10 +822,10 @@ static int nor_element_init( } /* get number of slave from driver module */ - driver_sub_element_count = - fwk_module_get_sub_element_count(ctx->config->driver_id); - if (driver_sub_element_count == FWK_E_PARAM) { - return FWK_E_PARAM; + status = fwk_module_get_sub_element_count( + ctx->config->driver_id, &driver_sub_element_count); + if (status != FWK_SUCCESS) { + return status; } ctx->slave_num = (uint8_t)driver_sub_element_count; diff --git a/unit_test/unity_mocks/mocks/Mockfwk_module.c b/unit_test/unity_mocks/mocks/Mockfwk_module.c index 9cc1d73bd..d5f6c22e1 100644 --- a/unit_test/unity_mocks/mocks/Mockfwk_module.c +++ b/unit_test/unity_mocks/mocks/Mockfwk_module.c @@ -8,7 +8,6 @@ static const char* CMockString_adapter = "adapter"; static const char* CMockString_api = "api"; static const char* CMockString_api_id = "api_id"; -static const char* CMockString_element_id = "element_id"; static const char* CMockString_fwk_module_adapter = "fwk_module_adapter"; static const char* CMockString_fwk_module_bind = "fwk_module_bind"; static const char* CMockString_fwk_module_get_data = "fwk_module_get_data"; @@ -25,6 +24,8 @@ static const char* CMockString_fwk_module_is_valid_notification_id = "fwk_module static const char* CMockString_fwk_module_is_valid_sub_element_id = "fwk_module_is_valid_sub_element_id"; static const char* CMockString_id = "id"; static const char* CMockString_mod_elem_count = "mod_elem_count"; +static const char* CMockString_mod_id = "mod_id"; +static const char* CMockString_mod_sub_elem_cnt = "mod_sub_elem_cnt"; static const char* CMockString_module_id = "module_id"; static const char* CMockString_target_id = "target_id"; @@ -119,8 +120,14 @@ typedef struct _CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE UNITY_LINE_TYPE LineNumber; char ExpectAnyArgsBool; int ReturnVal; - fwk_id_t Expected_element_id; - char IgnoreArg_element_id; + fwk_id_t Expected_mod_id; + size_t* Expected_mod_sub_elem_cnt; + int Expected_mod_sub_elem_cnt_Depth; + char ReturnThruPtr_mod_sub_elem_cnt_Used; + size_t* ReturnThruPtr_mod_sub_elem_cnt_Val; + size_t ReturnThruPtr_mod_sub_elem_cnt_Size; + char IgnoreArg_mod_id; + char IgnoreArg_mod_sub_elem_cnt; } CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE; @@ -1462,7 +1469,7 @@ void fwk_module_get_element_count_CMockIgnoreArg_mod_elem_count(UNITY_LINE_TYPE cmock_call_instance->IgnoreArg_mod_elem_count = 1; } -int fwk_module_get_sub_element_count(fwk_id_t element_id) +int fwk_module_get_sub_element_count(fwk_id_t mod_id, size_t* mod_sub_elem_cnt) { UNITY_LINE_TYPE cmock_line = TEST_LINE_NUM; CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE* cmock_call_instance; @@ -1480,7 +1487,7 @@ int fwk_module_get_sub_element_count(fwk_id_t element_id) if (!Mock.fwk_module_get_sub_element_count_CallbackBool && Mock.fwk_module_get_sub_element_count_CallbackFunctionPointer != NULL) { - int cmock_cb_ret = Mock.fwk_module_get_sub_element_count_CallbackFunctionPointer(element_id, Mock.fwk_module_get_sub_element_count_CallbackCalls++); + int cmock_cb_ret = Mock.fwk_module_get_sub_element_count_CallbackFunctionPointer(mod_id, mod_sub_elem_cnt, Mock.fwk_module_get_sub_element_count_CallbackCalls++); UNITY_CLR_DETAILS(); return cmock_cb_ret; } @@ -1488,26 +1495,44 @@ int fwk_module_get_sub_element_count(fwk_id_t element_id) cmock_line = cmock_call_instance->LineNumber; if (!cmock_call_instance->ExpectAnyArgsBool) { - if (!cmock_call_instance->IgnoreArg_element_id) + if (!cmock_call_instance->IgnoreArg_mod_id) { - UNITY_SET_DETAILS(CMockString_fwk_module_get_sub_element_count,CMockString_element_id); - UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(&cmock_call_instance->Expected_element_id), (void*)(&element_id), sizeof(fwk_id_t), cmock_line, CMockStringMismatch); + UNITY_SET_DETAILS(CMockString_fwk_module_get_sub_element_count,CMockString_mod_id); + UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(&cmock_call_instance->Expected_mod_id), (void*)(&mod_id), sizeof(fwk_id_t), cmock_line, CMockStringMismatch); + } + if (!cmock_call_instance->IgnoreArg_mod_sub_elem_cnt) + { + UNITY_SET_DETAILS(CMockString_fwk_module_get_sub_element_count,CMockString_mod_sub_elem_cnt); + if (cmock_call_instance->Expected_mod_sub_elem_cnt == NULL) + { UNITY_TEST_ASSERT_NULL(mod_sub_elem_cnt, cmock_line, CMockStringExpNULL); } + else + { UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(cmock_call_instance->Expected_mod_sub_elem_cnt), (void*)(mod_sub_elem_cnt), sizeof(size_t), cmock_call_instance->Expected_mod_sub_elem_cnt_Depth, cmock_line, CMockStringMismatch); } } } if (Mock.fwk_module_get_sub_element_count_CallbackFunctionPointer != NULL) { - cmock_call_instance->ReturnVal = Mock.fwk_module_get_sub_element_count_CallbackFunctionPointer(element_id, Mock.fwk_module_get_sub_element_count_CallbackCalls++); + cmock_call_instance->ReturnVal = Mock.fwk_module_get_sub_element_count_CallbackFunctionPointer(mod_id, mod_sub_elem_cnt, Mock.fwk_module_get_sub_element_count_CallbackCalls++); + } + if (cmock_call_instance->ReturnThruPtr_mod_sub_elem_cnt_Used) + { + UNITY_TEST_ASSERT_NOT_NULL(mod_sub_elem_cnt, cmock_line, CMockStringPtrIsNULL); + memcpy((void*)mod_sub_elem_cnt, (void*)cmock_call_instance->ReturnThruPtr_mod_sub_elem_cnt_Val, + cmock_call_instance->ReturnThruPtr_mod_sub_elem_cnt_Size); } UNITY_CLR_DETAILS(); return cmock_call_instance->ReturnVal; } -void CMockExpectParameters_fwk_module_get_sub_element_count(CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE* cmock_call_instance, fwk_id_t element_id); -void CMockExpectParameters_fwk_module_get_sub_element_count(CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE* cmock_call_instance, fwk_id_t element_id) +void CMockExpectParameters_fwk_module_get_sub_element_count(CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE* cmock_call_instance, fwk_id_t mod_id, size_t* mod_sub_elem_cnt, int mod_sub_elem_cnt_Depth); +void CMockExpectParameters_fwk_module_get_sub_element_count(CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE* cmock_call_instance, fwk_id_t mod_id, size_t* mod_sub_elem_cnt, int mod_sub_elem_cnt_Depth) { - memcpy((void*)(&cmock_call_instance->Expected_element_id), (void*)(&element_id), - sizeof(fwk_id_t[sizeof(element_id) == sizeof(fwk_id_t) ? 1 : -1])); /* add fwk_id_t to :treat_as_array if this causes an error */ - cmock_call_instance->IgnoreArg_element_id = 0; + memcpy((void*)(&cmock_call_instance->Expected_mod_id), (void*)(&mod_id), + sizeof(fwk_id_t[sizeof(mod_id) == sizeof(fwk_id_t) ? 1 : -1])); /* add fwk_id_t to :treat_as_array if this causes an error */ + cmock_call_instance->IgnoreArg_mod_id = 0; + cmock_call_instance->Expected_mod_sub_elem_cnt = mod_sub_elem_cnt; + cmock_call_instance->Expected_mod_sub_elem_cnt_Depth = mod_sub_elem_cnt_Depth; + cmock_call_instance->IgnoreArg_mod_sub_elem_cnt = 0; + cmock_call_instance->ReturnThruPtr_mod_sub_elem_cnt_Used = 0; } void fwk_module_get_sub_element_count_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, int cmock_to_return) @@ -1545,7 +1570,7 @@ void fwk_module_get_sub_element_count_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYP cmock_call_instance->ExpectAnyArgsBool = (char)1; } -void fwk_module_get_sub_element_count_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t element_id, int cmock_to_return) +void fwk_module_get_sub_element_count_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t mod_id, size_t* mod_sub_elem_cnt, int cmock_to_return) { CMOCK_MEM_INDEX_TYPE cmock_guts_index = CMock_Guts_MemNew(sizeof(CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE)); CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE* cmock_call_instance = (CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE*)CMock_Guts_GetAddressFor(cmock_guts_index); @@ -1555,7 +1580,7 @@ void fwk_module_get_sub_element_count_CMockExpectAndReturn(UNITY_LINE_TYPE cmock Mock.fwk_module_get_sub_element_count_IgnoreBool = (char)0; cmock_call_instance->LineNumber = cmock_line; cmock_call_instance->ExpectAnyArgsBool = (char)0; - CMockExpectParameters_fwk_module_get_sub_element_count(cmock_call_instance, element_id); + CMockExpectParameters_fwk_module_get_sub_element_count(cmock_call_instance, mod_id, mod_sub_elem_cnt, 1); cmock_call_instance->ReturnVal = cmock_to_return; } @@ -1573,11 +1598,41 @@ void fwk_module_get_sub_element_count_Stub(CMOCK_fwk_module_get_sub_element_coun Mock.fwk_module_get_sub_element_count_CallbackFunctionPointer = Callback; } -void fwk_module_get_sub_element_count_CMockIgnoreArg_element_id(UNITY_LINE_TYPE cmock_line) +void fwk_module_get_sub_element_count_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t mod_id, size_t* mod_sub_elem_cnt, int mod_sub_elem_cnt_Depth, int cmock_to_return) +{ + CMOCK_MEM_INDEX_TYPE cmock_guts_index = CMock_Guts_MemNew(sizeof(CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE)); + CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE* cmock_call_instance = (CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE*)CMock_Guts_GetAddressFor(cmock_guts_index); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringOutOfMemory); + memset(cmock_call_instance, 0, sizeof(*cmock_call_instance)); + Mock.fwk_module_get_sub_element_count_CallInstance = CMock_Guts_MemChain(Mock.fwk_module_get_sub_element_count_CallInstance, cmock_guts_index); + Mock.fwk_module_get_sub_element_count_IgnoreBool = (char)0; + cmock_call_instance->LineNumber = cmock_line; + cmock_call_instance->ExpectAnyArgsBool = (char)0; + CMockExpectParameters_fwk_module_get_sub_element_count(cmock_call_instance, mod_id, mod_sub_elem_cnt, mod_sub_elem_cnt_Depth); + cmock_call_instance->ReturnVal = cmock_to_return; +} + +void fwk_module_get_sub_element_count_CMockReturnMemThruPtr_mod_sub_elem_cnt(UNITY_LINE_TYPE cmock_line, size_t* mod_sub_elem_cnt, size_t cmock_size) +{ + CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE* cmock_call_instance = (CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.fwk_module_get_sub_element_count_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringPtrPreExp); + cmock_call_instance->ReturnThruPtr_mod_sub_elem_cnt_Used = 1; + cmock_call_instance->ReturnThruPtr_mod_sub_elem_cnt_Val = mod_sub_elem_cnt; + cmock_call_instance->ReturnThruPtr_mod_sub_elem_cnt_Size = cmock_size; +} + +void fwk_module_get_sub_element_count_CMockIgnoreArg_mod_id(UNITY_LINE_TYPE cmock_line) +{ + CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE* cmock_call_instance = (CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.fwk_module_get_sub_element_count_CallInstance)); + UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); + cmock_call_instance->IgnoreArg_mod_id = 1; +} + +void fwk_module_get_sub_element_count_CMockIgnoreArg_mod_sub_elem_cnt(UNITY_LINE_TYPE cmock_line) { CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE* cmock_call_instance = (CMOCK_fwk_module_get_sub_element_count_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.fwk_module_get_sub_element_count_CallInstance)); UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp); - cmock_call_instance->IgnoreArg_element_id = 1; + cmock_call_instance->IgnoreArg_mod_sub_elem_cnt = 1; } const char* fwk_module_get_element_name(fwk_id_t id) diff --git a/unit_test/unity_mocks/mocks/Mockfwk_module.h b/unit_test/unity_mocks/mocks/Mockfwk_module.h index dd6e1ec44..21765add5 100644 --- a/unit_test/unity_mocks/mocks/Mockfwk_module.h +++ b/unit_test/unity_mocks/mocks/Mockfwk_module.h @@ -150,14 +150,22 @@ void fwk_module_get_sub_element_count_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock void fwk_module_get_sub_element_count_CMockStopIgnore(void); #define fwk_module_get_sub_element_count_ExpectAnyArgsAndReturn(cmock_retval) fwk_module_get_sub_element_count_CMockExpectAnyArgsAndReturn(__LINE__, cmock_retval) void fwk_module_get_sub_element_count_CMockExpectAnyArgsAndReturn(UNITY_LINE_TYPE cmock_line, int cmock_to_return); -#define fwk_module_get_sub_element_count_ExpectAndReturn(element_id, cmock_retval) fwk_module_get_sub_element_count_CMockExpectAndReturn(__LINE__, element_id, cmock_retval) -void fwk_module_get_sub_element_count_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t element_id, int cmock_to_return); -typedef int (* CMOCK_fwk_module_get_sub_element_count_CALLBACK)(fwk_id_t element_id, int cmock_num_calls); +#define fwk_module_get_sub_element_count_ExpectAndReturn(mod_id, mod_sub_elem_cnt, cmock_retval) fwk_module_get_sub_element_count_CMockExpectAndReturn(__LINE__, mod_id, mod_sub_elem_cnt, cmock_retval) +void fwk_module_get_sub_element_count_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t mod_id, size_t* mod_sub_elem_cnt, int cmock_to_return); +typedef int (* CMOCK_fwk_module_get_sub_element_count_CALLBACK)(fwk_id_t mod_id, size_t* mod_sub_elem_cnt, int cmock_num_calls); void fwk_module_get_sub_element_count_AddCallback(CMOCK_fwk_module_get_sub_element_count_CALLBACK Callback); void fwk_module_get_sub_element_count_Stub(CMOCK_fwk_module_get_sub_element_count_CALLBACK Callback); #define fwk_module_get_sub_element_count_StubWithCallback fwk_module_get_sub_element_count_Stub -#define fwk_module_get_sub_element_count_IgnoreArg_element_id() fwk_module_get_sub_element_count_CMockIgnoreArg_element_id(__LINE__) -void fwk_module_get_sub_element_count_CMockIgnoreArg_element_id(UNITY_LINE_TYPE cmock_line); +#define fwk_module_get_sub_element_count_ExpectWithArrayAndReturn(mod_id, mod_sub_elem_cnt, mod_sub_elem_cnt_Depth, cmock_retval) fwk_module_get_sub_element_count_CMockExpectWithArrayAndReturn(__LINE__, mod_id, mod_sub_elem_cnt, mod_sub_elem_cnt_Depth, cmock_retval) +void fwk_module_get_sub_element_count_CMockExpectWithArrayAndReturn(UNITY_LINE_TYPE cmock_line, fwk_id_t mod_id, size_t* mod_sub_elem_cnt, int mod_sub_elem_cnt_Depth, int cmock_to_return); +#define fwk_module_get_sub_element_count_ReturnThruPtr_mod_sub_elem_cnt(mod_sub_elem_cnt) fwk_module_get_sub_element_count_CMockReturnMemThruPtr_mod_sub_elem_cnt(__LINE__, mod_sub_elem_cnt, sizeof(size_t)) +#define fwk_module_get_sub_element_count_ReturnArrayThruPtr_mod_sub_elem_cnt(mod_sub_elem_cnt, cmock_len) fwk_module_get_sub_element_count_CMockReturnMemThruPtr_mod_sub_elem_cnt(__LINE__, mod_sub_elem_cnt, cmock_len * sizeof(*mod_sub_elem_cnt)) +#define fwk_module_get_sub_element_count_ReturnMemThruPtr_mod_sub_elem_cnt(mod_sub_elem_cnt, cmock_size) fwk_module_get_sub_element_count_CMockReturnMemThruPtr_mod_sub_elem_cnt(__LINE__, mod_sub_elem_cnt, cmock_size) +void fwk_module_get_sub_element_count_CMockReturnMemThruPtr_mod_sub_elem_cnt(UNITY_LINE_TYPE cmock_line, size_t* mod_sub_elem_cnt, size_t cmock_size); +#define fwk_module_get_sub_element_count_IgnoreArg_mod_id() fwk_module_get_sub_element_count_CMockIgnoreArg_mod_id(__LINE__) +void fwk_module_get_sub_element_count_CMockIgnoreArg_mod_id(UNITY_LINE_TYPE cmock_line); +#define fwk_module_get_sub_element_count_IgnoreArg_mod_sub_elem_cnt() fwk_module_get_sub_element_count_CMockIgnoreArg_mod_sub_elem_cnt(__LINE__) +void fwk_module_get_sub_element_count_CMockIgnoreArg_mod_sub_elem_cnt(UNITY_LINE_TYPE cmock_line); #define fwk_module_get_element_name_IgnoreAndReturn(cmock_retval) fwk_module_get_element_name_CMockIgnoreAndReturn(__LINE__, cmock_retval) void fwk_module_get_element_name_CMockIgnoreAndReturn(UNITY_LINE_TYPE cmock_line, const char* cmock_to_return); #define fwk_module_get_element_name_StopIgnore() fwk_module_get_element_name_CMockStopIgnore() -- GitLab