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();
 }