Merge "feat(tftf): TFTF Realm extension enhancement"
diff --git a/include/lib/utils_def.h b/include/lib/utils_def.h
index 9638495..9dcf58d 100644
--- a/include/lib/utils_def.h
+++ b/include/lib/utils_def.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2022, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -178,4 +178,7 @@
unsigned char reserved##end[end - start]; \
}
+#define CONCAT(x, y) x##y
+#define CONC(x, y) CONCAT(x, y)
+
#endif /* UTILS_DEF_H */
diff --git a/include/runtime_services/host_realm_managment/host_realm_helper.h b/include/runtime_services/host_realm_managment/host_realm_helper.h
index a103630..255f257 100644
--- a/include/runtime_services/host_realm_managment/host_realm_helper.h
+++ b/include/runtime_services/host_realm_managment/host_realm_helper.h
@@ -18,5 +18,7 @@
bool host_destroy_realm(void);
bool host_enter_realm_execute(uint8_t cmd);
+test_result_t host_cmp_result(void);
+
#endif /* HOST_REALM_HELPER_H */
diff --git a/include/runtime_services/host_realm_managment/host_realm_rmi.h b/include/runtime_services/host_realm_managment/host_realm_rmi.h
index 4e5f8c6..dd646f7 100644
--- a/include/runtime_services/host_realm_managment/host_realm_rmi.h
+++ b/include/runtime_services/host_realm_managment/host_realm_rmi.h
@@ -502,6 +502,8 @@
u_register_t level,
u_register_t start,
uint64_t end);
-
+test_result_t realm_cmp_result(void);
+void rmi_init_cmp_result(void);
+bool rmi_get_cmp_result(void);
#endif /* HOST_REALM_RMI_H */
diff --git a/tftf/tests/misc_tests/test_invalid_access.c b/tftf/tests/misc_tests/test_invalid_access.c
index 7e4a861..4837304 100644
--- a/tftf/tests/misc_tests/test_invalid_access.c
+++ b/tftf/tests/misc_tests/test_invalid_access.c
@@ -140,6 +140,8 @@
goto out_unregister;
}
+ rmi_init_cmp_result();
+
/* Delegate the shared page to Realm. */
retmm = rmi_granule_delegate((u_register_t)&share_page);
if (retmm != 0UL) {
@@ -155,7 +157,7 @@
goto out_undelegate;
}
- result = TEST_RESULT_SUCCESS;
+ result = host_cmp_result();
out_undelegate:
/* Undelegate the shared page. */
@@ -231,6 +233,8 @@
return TEST_RESULT_SKIPPED;
}
+ rmi_init_cmp_result();
+
retrmm = rmi_version();
VERBOSE("RMM version is: %lu.%lu\n",
@@ -273,7 +277,7 @@
return TEST_RESULT_FAIL;
}
- return TEST_RESULT_SUCCESS;
+ return host_cmp_result();
}
/**
diff --git a/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c b/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
index 4b50b5a..3fbe6a6 100644
--- a/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
+++ b/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
@@ -307,3 +307,14 @@
test_result);
return false;
}
+
+test_result_t host_cmp_result(void)
+{
+ if (rmi_get_cmp_result()) {
+ return TEST_RESULT_SUCCESS;
+ }
+
+ ERROR("RMI registers comparison failed\n");
+ return TEST_RESULT_FAIL;
+}
+
diff --git a/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c b/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
index aa884c2..f0aba64 100644
--- a/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
+++ b/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
@@ -5,6 +5,7 @@
*
*/
+#include <assert.h>
#include <string.h>
#include <debug.h>
@@ -16,76 +17,156 @@
#include <realm_def.h>
#include <tftf_lib.h>
+#define SET_ARG(_n) { \
+ case _n: \
+ regs[_n] = rand(); \
+ CONC(args->arg, _n) = regs[_n]; \
+ __attribute__((fallthrough)); \
+}
+
+#define CHECK_RET(_n) { \
+ if (CONC(ret_val.ret, _n) != regs[_n]) { \
+ cmp_flag |= (1U << _n); \
+ } \
+}
+
+static bool rmi_cmp_result;
+
+static smc_ret_values rmi_handler(smc_args *args, unsigned int in_reg)
+{
+ u_register_t regs[8];
+ smc_ret_values ret_val;
+ unsigned int cmp_flag = 0U;
+
+ assert(args != NULL);
+ assert((in_reg >= 1U) && (in_reg <= 7U));
+
+ /* Function identifier */
+ regs[0] = (u_register_t)args->fid;
+
+ /* X4 and X5 can be passed as parameters */
+ regs[4] = args->arg4;
+ regs[5] = args->arg5;
+
+ /* SMC calls arguments in X1-X7 */
+ switch (in_reg) {
+ SET_ARG(1);
+ SET_ARG(2);
+ SET_ARG(3);
+ SET_ARG(4);
+ SET_ARG(5);
+ SET_ARG(6);
+ default:
+ regs[7] = rand();
+ args->arg7 = regs[7];
+ }
+
+ ret_val = tftf_smc(args);
+
+ /*
+ * According to SMCCC v1.2 X4-X7 registers' values
+ * must be preserved unless they contain result,
+ * as specified in the function definition.
+ */
+ if (regs[0] != RMI_RTT_READ_ENTRY) {
+ CHECK_RET(4);
+ }
+
+ CHECK_RET(5);
+ CHECK_RET(6);
+ CHECK_RET(7);
+
+ if (cmp_flag != 0U) {
+ rmi_cmp_result = false;
+
+ ERROR("RMI SMC 0x%lx corrupted registers: %s %s %s %s\n",
+ regs[0],
+ (((cmp_flag & (1U << 4)) != 0U) ? "X4" : ""),
+ (((cmp_flag & (1U << 5)) != 0U) ? "X5" : ""),
+ (((cmp_flag & (1U << 6)) != 0U) ? "X6" : ""),
+ (((cmp_flag & (1U << 7)) != 0U) ? "X7" : ""));
+ }
+
+ return ret_val;
+}
+
+void rmi_init_cmp_result(void)
+{
+ rmi_cmp_result = true;
+}
+
+bool rmi_get_cmp_result(void)
+{
+ return rmi_cmp_result;
+}
+
static inline u_register_t rmi_data_create(bool unknown, u_register_t data,
u_register_t rd, u_register_t map_addr, u_register_t src)
{
if (unknown) {
- return ((smc_ret_values)(tftf_smc(&(smc_args)
- {RMI_DATA_CREATE_UNKNOWN, data, rd, map_addr,
- 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_DATA_CREATE_UNKNOWN,
+ data, rd, map_addr}, 4U).ret0;
} else {
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_DATA_CREATE,
- data, rd, map_addr, src, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_DATA_CREATE,
+ /* X5 = flags */
+ data, rd, map_addr, src, 0UL}, 6U).ret0;
}
}
static inline u_register_t rmi_realm_activate(u_register_t rd)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_REALM_ACTIVATE,
- rd, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_REALM_ACTIVATE, rd}, 2U).ret0;
}
u_register_t rmi_realm_create(u_register_t rd, u_register_t params_ptr)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_REALM_CREATE,
- rd, params_ptr, 0UL, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_REALM_CREATE,
+ rd, params_ptr}, 3U).ret0;
}
u_register_t rmi_realm_destroy(u_register_t rd)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_REALM_DESTROY,
- rd, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_REALM_DESTROY, rd}, 2U).ret0;
}
static inline u_register_t rmi_data_destroy(u_register_t rd,
u_register_t map_addr)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_DATA_DESTROY,
- rd, map_addr, 0UL, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_DATA_DESTROY, rd, map_addr},
+ 3U).ret0;
}
static inline u_register_t rmi_rec_create(u_register_t rec, u_register_t rd,
u_register_t params_ptr)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_REC_CREATE,
- rec, rd, params_ptr, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_REC_CREATE, rec, rd, params_ptr},
+ 4U).ret0;
}
static inline u_register_t rmi_rec_destroy(u_register_t rec)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_REC_DESTROY,
- rec, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_REC_DESTROY, rec}, 2U).ret0;
}
static inline u_register_t rmi_rtt_create(u_register_t rtt, u_register_t rd,
u_register_t map_addr, u_register_t level)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_RTT_CREATE,
- rtt, rd, map_addr, level, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_RTT_CREATE,
+ rtt, rd, map_addr, level}, 5U).ret0;
}
static inline u_register_t rmi_rtt_destroy(u_register_t rtt, u_register_t rd,
u_register_t map_addr, u_register_t level)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_RTT_DESTROY,
- rtt, rd, map_addr, level, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_RTT_DESTROY,
+ rtt, rd, map_addr, level}, 5U).ret0;
}
u_register_t rmi_features(u_register_t index, u_register_t *features)
{
smc_ret_values rets;
- rets = tftf_smc(&(smc_args) {RMI_FEATURES, index, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
+ rets = rmi_handler(&(smc_args){RMI_FEATURES, index}, 2U);
*features = rets.ret1;
return rets.ret0;
}
@@ -94,15 +175,15 @@
u_register_t map_addr,
u_register_t level)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_RTT_INIT_RIPAS,
- rd, map_addr, level, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_RTT_INIT_RIPAS,
+ rd, map_addr, level}, 4U).ret0;
}
static inline u_register_t rmi_rtt_fold(u_register_t rtt, u_register_t rd,
u_register_t map_addr, u_register_t level)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_RTT_FOLD,
- rtt, rd, map_addr, level, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_RTT_FOLD,
+ rtt, rd, map_addr, level}, 5U).ret0;
}
static inline u_register_t rmi_rec_aux_count(u_register_t rd,
@@ -110,7 +191,7 @@
{
smc_ret_values rets;
- rets = tftf_smc(&(smc_args) {RMI_REC_AUX_COUNT, rd, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
+ rets = rmi_handler(&(smc_args){RMI_REC_AUX_COUNT, rd}, 2U);
*aux_count = rets.ret1;
return rets.ret0;
}
@@ -119,16 +200,16 @@
u_register_t map_addr, u_register_t level,
u_register_t ripas)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_RTT_SET_RIPAS,
- rd, rec, map_addr, level, ripas, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_RTT_SET_RIPAS,
+ rd, rec, map_addr, level, ripas}, 6U).ret0;
}
static inline u_register_t rmi_rtt_mapunprotected(u_register_t rd,
u_register_t map_addr,
u_register_t level, u_register_t ns_pa)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_RTT_MAP_UNPROTECTED,
- rd, map_addr, level, ns_pa, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_RTT_MAP_UNPROTECTED,
+ rd, map_addr, level, ns_pa}, 5U).ret0;
}
static u_register_t rmi_rtt_readentry(u_register_t rd, u_register_t map_addr,
@@ -136,9 +217,8 @@
{
smc_ret_values rets;
- rets = tftf_smc(&(smc_args) {RMI_RTT_READ_ENTRY,
- rd, map_addr, level, 0UL, 0UL, 0UL, 0UL});
-
+ rets = rmi_handler(&(smc_args){RMI_RTT_READ_ENTRY,
+ rd, map_addr, level}, 4U);
rtt->walk_level = rets.ret1;
rtt->state = rets.ret2 & 0xFF;
rtt->out_addr = rets.ret3;
@@ -149,8 +229,8 @@
u_register_t map_addr,
u_register_t level, u_register_t ns_pa)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_RTT_UNMAP_UNPROTECTED,
- rd, map_addr, level, ns_pa, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_RTT_UNMAP_UNPROTECTED,
+ rd, map_addr, level, ns_pa}, 5U).ret0;
}
static inline u_register_t rtt_level_mapsize(u_register_t level)
@@ -537,20 +617,17 @@
u_register_t rmi_granule_delegate(u_register_t addr)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_GRANULE_DELEGATE,
- addr, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_GRANULE_DELEGATE, addr}, 2U).ret0;
}
u_register_t rmi_granule_undelegate(u_register_t addr)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_GRANULE_UNDELEGATE,
- addr, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_GRANULE_UNDELEGATE, addr}, 2U).ret0;
}
u_register_t rmi_version(void)
{
- return ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_VERSION,
- 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ return rmi_handler(&(smc_args){RMI_VERSION}, 1U).ret0;
}
u_register_t realm_create(struct realm *realm)
@@ -998,7 +1075,7 @@
u_register_t realm_rec_enter(struct realm *realm, u_register_t *exit_reason,
- unsigned int *test_result)
+ unsigned int *test_result)
{
struct rmi_rec_run *run = (struct rmi_rec_run *)realm->run;
u_register_t ret;
@@ -1006,9 +1083,8 @@
do {
re_enter_rec = false;
- ret = ((smc_ret_values)(tftf_smc(&(smc_args) {RMI_REC_ENTER,
- realm->rec, realm->run,
- 0UL, 0UL, 0UL, 0UL, 0UL}))).ret0;
+ ret = rmi_handler(&(smc_args){RMI_REC_ENTER,
+ realm->rec, realm->run}, 3U).ret0;
VERBOSE("rmi_rec_enter, \
run->exit.exit_reason=0x%lx, \
run->exit.esr=0x%lx, \
diff --git a/tftf/tests/runtime_services/host_realm_managment/rmi_delegate_tests.c b/tftf/tests/runtime_services/host_realm_managment/rmi_delegate_tests.c
index 17ff651..f35bf65 100644
--- a/tftf/tests/runtime_services/host_realm_managment/rmi_delegate_tests.c
+++ b/tftf/tests/runtime_services/host_realm_managment/rmi_delegate_tests.c
@@ -47,6 +47,8 @@
{
u_register_t retrmm;
+ rmi_init_cmp_result();
+
for (uint32_t i = 0; i < (NUM_GRANULES * PLATFORM_CORE_COUNT) ; i++) {
if ((rand() % 2) == 0) {
retrmm = rmi_granule_delegate(
@@ -61,7 +63,8 @@
bufferstate[i] = B_UNDELEGATED;
}
}
- return TEST_RESULT_SUCCESS;
+
+ return host_cmp_result();
}
/*
@@ -75,13 +78,15 @@
return TEST_RESULT_SKIPPED;
}
+ rmi_init_cmp_result();
+
retrmm = rmi_version();
tftf_testcase_printf("RMM version is: %lu.%lu\n",
RMI_ABI_VERSION_GET_MAJOR(retrmm),
RMI_ABI_VERSION_GET_MINOR(retrmm));
- return TEST_RESULT_SUCCESS;
+ return host_cmp_result();
}
/*
@@ -97,6 +102,8 @@
return TEST_RESULT_SKIPPED;
}
+ rmi_init_cmp_result();
+
lead_mpid = read_mpidr_el1() & MPID_MASK;
for_each_cpu(cpu_node) {
@@ -146,6 +153,8 @@
return TEST_RESULT_SKIPPED;
}
+ rmi_init_cmp_result();
+
retrmm = rmi_granule_delegate((u_register_t)bufferdelegate);
if (retrmm != 0UL) {
tftf_testcase_printf("Delegate operation returns fail, %lx\n", retrmm);
@@ -159,18 +168,22 @@
tftf_testcase_printf("Delegate and undelegate of buffer 0x%lx succeeded\n",
(uintptr_t)bufferdelegate);
- return TEST_RESULT_SUCCESS;
+ return host_cmp_result();
}
static test_result_t realm_multi_cpu_payload_test(void)
{
- u_register_t retrmm = rmi_version();
+ u_register_t retrmm;
+
+ rmi_init_cmp_result();
+
+ retrmm = rmi_version();
tftf_testcase_printf("Multi CPU RMM version on CPU %llx is: %lu.%lu\n",
(long long)read_mpidr_el1() & MPID_MASK, RMI_ABI_VERSION_GET_MAJOR(retrmm),
RMI_ABI_VERSION_GET_MINOR(retrmm));
- return TEST_RESULT_SUCCESS;
+ return host_cmp_result();
}
/*
@@ -190,6 +203,8 @@
lead_mpid = read_mpidr_el1() & MPID_MASK;
+ rmi_init_cmp_result();
+
if (init_buffer_del() == TEST_RESULT_FAIL) {
return TEST_RESULT_FAIL;
}
@@ -228,7 +243,6 @@
/*
* Cleanup to set all granules back to undelegated
*/
-
for (uint32_t i = 0; i < (NUM_GRANULES * PLATFORM_CORE_COUNT) ; i++) {
if (bufferstate[i] == B_DELEGATED) {
retrmm = rmi_granule_undelegate(
@@ -242,8 +256,7 @@
}
}
- ret = TEST_RESULT_SUCCESS;
- return ret;
+ return host_cmp_result();
}
/*
@@ -260,6 +273,8 @@
cpu_node = platform_get_core_pos(read_mpidr_el1() & MPID_MASK);
+ rmi_init_cmp_result();
+
for (uint32_t i = 0; i < NUM_GRANULES; i++) {
if (bufferstate[((cpu_node * NUM_GRANULES) + i)] == B_UNDELEGATED) {
retrmm = rmi_granule_delegate((u_register_t)
@@ -275,14 +290,15 @@
return TEST_RESULT_FAIL;
}
}
- return TEST_RESULT_SUCCESS;
+
+ return host_cmp_result();
}
-/*Fail testing of delegation process. The first is an error expected
+/*
+ * Fail testing of delegation process. The first is an error expected
* for processing the same granule twice and the second is submission of
* a misaligned address
*/
-
test_result_t realm_fail_del(void)
{
if (get_armv9_2_feat_rme_support() == 0U) {
@@ -291,6 +307,8 @@
u_register_t retrmm;
+ rmi_init_cmp_result();
+
retrmm = rmi_granule_delegate((u_register_t)&bufferdelegate[0]);
if (retrmm != 0UL) {
@@ -323,5 +341,5 @@
return TEST_RESULT_FAIL;
}
- return TEST_RESULT_SUCCESS;
+ return host_cmp_result();
}
diff --git a/tftf/tests/runtime_services/host_realm_managment/rmi_spm_tests.c b/tftf/tests/runtime_services/host_realm_managment/rmi_spm_tests.c
index 2a0e1e1..c313a23 100644
--- a/tftf/tests/runtime_services/host_realm_managment/rmi_spm_tests.c
+++ b/tftf/tests/runtime_services/host_realm_managment/rmi_spm_tests.c
@@ -360,6 +360,8 @@
**********************************************************************/
CHECK_SPMC_TESTING_SETUP(1, 0, expected_sp_uuids);
+ rmi_init_cmp_result();
+
/*
* Randomize the initial state of the RMI granules to realm or non-secure
*/
@@ -388,16 +390,16 @@
wait_for_core_to_turn_off(mpidr);
}
- if (TEST_RESULT_SUCCESS != reset_buffer_del_spm_rmi()) {
+ if (reset_buffer_del_spm_rmi() != TEST_RESULT_SUCCESS) {
return TEST_RESULT_FAIL;
}
VERBOSE("Done exiting.\n");
/**********************************************************************
- * All tests passed.
+ * Report register comparison result
**********************************************************************/
- return TEST_RESULT_SUCCESS;
+ return host_cmp_result();
}
/*
@@ -418,6 +420,8 @@
**********************************************************************/
CHECK_SPMC_TESTING_SETUP(1, 0, expected_sp_uuids);
+ rmi_init_cmp_result();
+
/*
* Randomize the initial state of the RMI granules to realm or non-secure
*/
@@ -469,5 +473,12 @@
VERBOSE("Done exiting.\n");
- return reset_buffer_del_spm_rmi();
+ if (reset_buffer_del_spm_rmi() != TEST_RESULT_SUCCESS) {
+ return TEST_RESULT_FAIL;
+ }
+
+ /**********************************************************************
+ * Report register comparison result
+ **********************************************************************/
+ return host_cmp_result();
}
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
index 562e9b8..14b08b2 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
@@ -26,6 +26,8 @@
return TEST_RESULT_SKIPPED;
}
+ rmi_init_cmp_result();
+
retrmm = rmi_version();
VERBOSE("RMM version is: %lu.%lu\n",
RMI_ABI_VERSION_GET_MAJOR(retrmm),
@@ -59,5 +61,6 @@
ret1, ret2);
return TEST_RESULT_FAIL;
}
- return TEST_RESULT_SUCCESS;
+
+ return host_cmp_result();
}
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_exceptions.c b/tftf/tests/runtime_services/secure_service/test_ffa_exceptions.c
index e809885..75cd942 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_exceptions.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_exceptions.c
@@ -70,6 +70,8 @@
VERBOSE("TFTF - Handle: %llx Address: %p\n",
handle, constituents[0].address);
+ rmi_init_cmp_result();
+
/* Delegate the shared page to Realm. */
retmm = rmi_granule_delegate((u_register_t)&share_page);
if (retmm != 0UL) {
@@ -103,5 +105,5 @@
return TEST_RESULT_FAIL;
}
- return TEST_RESULT_SUCCESS;
+ return host_cmp_result();
}