Merge "plat/sgi: increase number of xlat tables"
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 6886a09..1bfc70f 100644
--- a/include/runtime_services/host_realm_managment/host_realm_helper.h
+++ b/include/runtime_services/host_realm_managment/host_realm_helper.h
@@ -10,21 +10,22 @@
 #include <host_realm_rmi.h>
 #include <tftf_lib.h>
 
-bool host_create_realm_payload(u_register_t realm_payload_adr,
+bool host_create_realm_payload(struct realm *realm_ptr,
+		u_register_t realm_payload_adr,
 		u_register_t plat_mem_pool_adr,
 		u_register_t plat_mem_pool_size,
 		u_register_t realm_pages_size,
 		u_register_t feature_flag,
 		const u_register_t *rec_flag,
 		unsigned int rec_count);
-bool host_create_shared_mem(
+bool host_create_shared_mem(struct realm *realm_ptr,
 		u_register_t ns_shared_mem_adr,
 		u_register_t ns_shared_mem_size);
-bool host_destroy_realm(void);
-void host_rec_send_sgi(unsigned int sgi, unsigned int rec_num);
-bool host_enter_realm_execute(uint8_t cmd, struct realm **realm_ptr,
-			      unsigned int test_exit_reason,
-			      unsigned int rec_num);
+bool host_destroy_realm(struct realm *realm_ptr);
+void host_rec_send_sgi(struct realm *realm_ptr,
+		unsigned int sgi, unsigned int rec_num);
+bool host_enter_realm_execute(struct realm *realm_ptr, uint8_t cmd,
+		int test_exit_reason, unsigned int rec_num);
 test_result_t host_cmp_result(void);
 void realm_print_handler(unsigned int rec_num);
 
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 d60e15e..ac6a6f1 100644
--- a/include/runtime_services/host_realm_managment/host_realm_rmi.h
+++ b/include/runtime_services/host_realm_managment/host_realm_rmi.h
@@ -503,25 +503,28 @@
 };
 
 struct realm {
-	unsigned int rec_count;
-	u_register_t par_base;
-	u_register_t par_size;
-	u_register_t rd;
-	u_register_t rtt_addr;
-	u_register_t rec[MAX_REC_COUNT];
-	u_register_t run[MAX_REC_COUNT];
-	u_register_t rec_flag[MAX_REC_COUNT];
-	u_register_t mpidr[MAX_REC_COUNT];
-	u_register_t host_mpidr[MAX_REC_COUNT];
-	u_register_t num_aux;
-	u_register_t rmm_feat_reg0;
-	u_register_t ipa_ns_buffer;
-	u_register_t ns_buffer_size;
-	u_register_t aux_pages_all_rec[MAX_REC_COUNT][REC_PARAMS_AUX_GRANULES];
-	uint8_t      sve_vl;
-	uint8_t      num_bps;
-	uint8_t      num_wps;
-	uint8_t      pmu_num_ctrs;
+	unsigned int     rec_count;
+	u_register_t     par_base;
+	u_register_t     par_size;
+	u_register_t     rd;
+	u_register_t     rtt_addr;
+	u_register_t     rec[MAX_REC_COUNT];
+	u_register_t     run[MAX_REC_COUNT];
+	u_register_t     rec_flag[MAX_REC_COUNT];
+	u_register_t     mpidr[MAX_REC_COUNT];
+	u_register_t     host_mpidr[MAX_REC_COUNT];
+	u_register_t     num_aux;
+	u_register_t     rmm_feat_reg0;
+	u_register_t     ipa_ns_buffer;
+	u_register_t     ns_buffer_size;
+	u_register_t     aux_pages_all_rec[MAX_REC_COUNT][REC_PARAMS_AUX_GRANULES];
+	uint8_t          sve_vl;
+	uint8_t          num_bps;
+	uint8_t          num_wps;
+	uint8_t          pmu_num_ctrs;
+	bool             payload_created;
+	bool             shared_mem_created;
+	unsigned short   vmid;
 	enum realm_state state;
 };
 
diff --git a/realm/realm_rsi.c b/realm/realm_rsi.c
index d82aa6f..ba60ba8 100644
--- a/realm/realm_rsi.c
+++ b/realm/realm_rsi.c
@@ -11,8 +11,6 @@
 #include <realm_rsi.h>
 #include <smccc.h>
 
-static struct rsi_host_call host_cal __aligned(sizeof(struct rsi_host_call));
-
 /* This function return RSI_ABI_VERSION */
 u_register_t rsi_get_version(u_register_t req_ver)
 {
@@ -32,6 +30,7 @@
 u_register_t rsi_get_ns_buffer(void)
 {
 	smc_ret_values res = {};
+	struct rsi_host_call host_cal __aligned(sizeof(struct rsi_host_call));
 
 	host_cal.imm = HOST_CALL_GET_SHARED_BUFF_CMD;
 	res = tftf_smc(&(smc_args) {RSI_HOST_CALL, (u_register_t)&host_cal,
@@ -45,6 +44,8 @@
 /* This function call Host and request to exit Realm with proper exit code */
 void rsi_exit_to_host(enum host_call_cmd exit_code)
 {
+	struct rsi_host_call host_cal __aligned(sizeof(struct rsi_host_call));
+
 	host_cal.imm = exit_code;
 	host_cal.gprs[0] = read_mpidr_el1() & MPID_MASK;
 	tftf_smc(&(smc_args) {RSI_HOST_CALL, (u_register_t)&host_cal,
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 1ba67ed..9a4f5d9 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
@@ -23,11 +23,6 @@
 #include <test_helpers.h>
 #include <xlat_tables_v2.h>
 
-static struct realm realm;
-static bool realm_payload_created;
-static bool shared_mem_created;
-static volatile bool timer_enabled;
-
 #define RMI_EXIT(id)	\
 	[RMI_EXIT_##id] = #id
 
@@ -71,32 +66,34 @@
  * and try to find another CPU other than the lead one to
  * handle the Realm message logging.
  */
-static void host_init_realm_print_buffer(void)
+static void host_init_realm_print_buffer(struct realm *realm_ptr)
 {
 	host_shared_data_t *host_shared_data;
 
-	for (unsigned int i = 0U; i < realm.rec_count; i++) {
+	for (unsigned int i = 0U; i < realm_ptr->rec_count; i++) {
 		host_shared_data = host_get_shared_structure(i);
 		(void)memset((char *)host_shared_data, 0, sizeof(host_shared_data_t));
 	}
 }
 
-static bool host_enter_realm(u_register_t *exit_reason,
-		unsigned int *host_call_result, unsigned int rec_num)
+static bool host_enter_realm(struct realm *realm_ptr,
+			     u_register_t *exit_reason,
+			     unsigned int *host_call_result,
+			     unsigned int rec_num)
 {
 	u_register_t ret;
 
-	if (!realm_payload_created) {
-		ERROR("%s() failed\n", "realm_payload_created");
+	if (!realm_ptr->payload_created) {
+		ERROR("%s() failed\n", "payload_created");
 		return false;
 	}
-	if (!shared_mem_created) {
+	if (!realm_ptr->shared_mem_created) {
 		ERROR("%s() failed\n", "shared_mem_created");
 		return false;
 	}
 
 	/* Enter Realm */
-	ret = host_realm_rec_enter(&realm, exit_reason, host_call_result, rec_num);
+	ret = host_realm_rec_enter(realm_ptr, exit_reason, host_call_result, rec_num);
 	if (ret != REALM_SUCCESS) {
 		ERROR("%s() failed, ret=%lx\n", "host_realm_rec_enter", ret);
 		return false;
@@ -105,13 +102,14 @@
 	return true;
 }
 
-bool host_create_realm_payload(u_register_t realm_payload_adr,
-				u_register_t plat_mem_pool_adr,
-				u_register_t plat_mem_pool_size,
-				u_register_t realm_pages_size,
-				u_register_t feature_flag,
-				const u_register_t *rec_flag,
-				unsigned int rec_count)
+bool host_create_realm_payload(struct realm *realm_ptr,
+			       u_register_t realm_payload_adr,
+			       u_register_t plat_mem_pool_adr,
+			       u_register_t plat_mem_pool_size,
+			       u_register_t realm_pages_size,
+			       u_register_t feature_flag,
+			       const u_register_t *rec_flag,
+			       unsigned int rec_count)
 {
 	int8_t value;
 
@@ -135,73 +133,74 @@
 		ERROR("%s() failed\n", "page_pool_init");
 		return false;
 	}
+	memset((char *)realm_ptr, 0U, sizeof(struct realm));
 
 	/* Read Realm Feature Reg 0 */
-	if (host_rmi_features(0UL, &realm.rmm_feat_reg0) != REALM_SUCCESS) {
+	if (host_rmi_features(0UL, &realm_ptr->rmm_feat_reg0) != REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_rmi_features");
 		return false;
 	}
 
 	/* Disable PMU if not required */
 	if ((feature_flag & RMI_FEATURE_REGISTER_0_PMU_EN) == 0UL) {
-		realm.rmm_feat_reg0 &= ~RMI_FEATURE_REGISTER_0_PMU_EN;
-		realm.pmu_num_ctrs = 0U;
+		realm_ptr->rmm_feat_reg0 &= ~RMI_FEATURE_REGISTER_0_PMU_EN;
+		realm_ptr->pmu_num_ctrs = 0U;
 	} else {
 		value = EXTRACT(FEATURE_PMU_NUM_CTRS, feature_flag);
 		if (value != -1) {
-			realm.pmu_num_ctrs = (unsigned int)value;
+			realm_ptr->pmu_num_ctrs = (unsigned int)value;
 		} else {
-			realm.pmu_num_ctrs =
+			realm_ptr->pmu_num_ctrs =
 				EXTRACT(RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS,
-					realm.rmm_feat_reg0);
+					realm_ptr->rmm_feat_reg0);
 		}
 	}
 
 	/* Disable SVE if not required */
 	if ((feature_flag & RMI_FEATURE_REGISTER_0_SVE_EN) == 0UL) {
-		realm.rmm_feat_reg0 &= ~RMI_FEATURE_REGISTER_0_SVE_EN;
-		realm.sve_vl = 0U;
+		realm_ptr->rmm_feat_reg0 &= ~RMI_FEATURE_REGISTER_0_SVE_EN;
+		realm_ptr->sve_vl = 0U;
 	} else {
-		realm.sve_vl = EXTRACT(FEATURE_SVE_VL, feature_flag);
+		realm_ptr->sve_vl = EXTRACT(FEATURE_SVE_VL, feature_flag);
 	}
 
 	/* Requested number of breakpoints */
 	value = EXTRACT(FEATURE_NUM_BPS, feature_flag);
 	if (value != -1) {
-		realm.num_bps = (unsigned int)value;
+		realm_ptr->num_bps = (unsigned int)value;
 	} else {
-		realm.num_bps = EXTRACT(RMI_FEATURE_REGISTER_0_NUM_BPS,
-					realm.rmm_feat_reg0);
+		realm_ptr->num_bps = EXTRACT(RMI_FEATURE_REGISTER_0_NUM_BPS,
+					realm_ptr->rmm_feat_reg0);
 	}
 
 	/* Requested number of watchpoints */
 	value = EXTRACT(FEATURE_NUM_WPS, feature_flag);
 	if (value != -1) {
-		realm.num_wps = (unsigned int)value;
+		realm_ptr->num_wps = (unsigned int)value;
 	} else {
-		realm.num_wps = EXTRACT(RMI_FEATURE_REGISTER_0_NUM_WPS,
-					realm.rmm_feat_reg0);
+		realm_ptr->num_wps = EXTRACT(RMI_FEATURE_REGISTER_0_NUM_WPS,
+					realm_ptr->rmm_feat_reg0);
 	}
 
 	/* Set SVE bits from feature_flag */
-	realm.rmm_feat_reg0 &= ~(RMI_FEATURE_REGISTER_0_SVE_EN |
+	realm_ptr->rmm_feat_reg0 &= ~(RMI_FEATURE_REGISTER_0_SVE_EN |
 				 MASK(RMI_FEATURE_REGISTER_0_SVE_VL));
 	if ((feature_flag & RMI_FEATURE_REGISTER_0_SVE_EN) != 0UL) {
-		realm.rmm_feat_reg0 |= RMI_FEATURE_REGISTER_0_SVE_EN |
+		realm_ptr->rmm_feat_reg0 |= RMI_FEATURE_REGISTER_0_SVE_EN |
 				       INPLACE(RMI_FEATURE_REGISTER_0_SVE_VL,
 				       EXTRACT(RMI_FEATURE_REGISTER_0_SVE_VL,
 						feature_flag));
 	}
 
-	if (realm.rec_count > MAX_REC_COUNT) {
+	if (realm_ptr->rec_count > MAX_REC_COUNT) {
 		ERROR("Invalid Rec Count\n");
 		return false;
 	}
-	realm.rec_count = rec_count;
+	realm_ptr->rec_count = rec_count;
 	for (unsigned int i = 0U; i < rec_count; i++) {
 		if (rec_flag[i] == RMI_RUNNABLE ||
 				rec_flag[i] == RMI_NOT_RUNNABLE) {
-			realm.rec_flag[i] = rec_flag[i];
+			realm_ptr->rec_flag[i] = rec_flag[i];
 		} else {
 			ERROR("Invalid Rec Flag\n");
 			return false;
@@ -209,84 +208,85 @@
 	}
 
 	/* Create Realm */
-	if (host_realm_create(&realm) != REALM_SUCCESS) {
+	if (host_realm_create(realm_ptr) != REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_create");
 		return false;
 	}
 
-	if (host_realm_init_ipa_state(&realm, 0U, 0U, 1ULL << 32)
+	if (host_realm_init_ipa_state(realm_ptr, 0U, 0U, 1ULL << 32)
 		!= RMI_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_init_ipa_state");
 		goto destroy_realm;
 	}
 
 	/* RTT map Realm image */
-	if (host_realm_map_payload_image(&realm, realm_payload_adr) !=
+	if (host_realm_map_payload_image(realm_ptr, realm_payload_adr) !=
 			REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_map_payload_image");
 		goto destroy_realm;
 	}
 
 	/* Create REC */
-	if (host_realm_rec_create(&realm) != REALM_SUCCESS) {
+	if (host_realm_rec_create(realm_ptr) != REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_rec_create");
 		goto destroy_realm;
 	}
 
 	/* Activate Realm */
-	if (host_realm_activate(&realm) != REALM_SUCCESS) {
+	if (host_realm_activate(realm_ptr) != REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_activate");
 		goto destroy_realm;
 	}
 
-	realm_payload_created = true;
+	realm_ptr->payload_created = true;
 
-	return realm_payload_created;
+	return true;
 
 	/* Free test resources */
 destroy_realm:
-	if (host_realm_destroy(&realm) != REALM_SUCCESS) {
+	if (host_realm_destroy(realm_ptr) != REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_destroy");
 	}
-	realm_payload_created = false;
+	realm_ptr->payload_created = false;
 
-	return realm_payload_created;
+	return false;
 }
 
-bool host_create_shared_mem(u_register_t ns_shared_mem_adr,
-	u_register_t ns_shared_mem_size)
+bool host_create_shared_mem(struct realm *realm_ptr,
+			    u_register_t ns_shared_mem_adr,
+			    u_register_t ns_shared_mem_size)
 {
 	/* RTT map NS shared region */
-	if (host_realm_map_ns_shared(&realm, ns_shared_mem_adr,
+	if (host_realm_map_ns_shared(realm_ptr, ns_shared_mem_adr,
 				ns_shared_mem_size) != REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_map_ns_shared");
-		shared_mem_created = false;
+		realm_ptr->shared_mem_created = false;
 		return false;
 	}
 
 	memset((void *)ns_shared_mem_adr, 0, (size_t)ns_shared_mem_size);
-	host_init_realm_print_buffer();
-	shared_mem_created = true;
+	host_init_realm_print_buffer(realm_ptr);
+	realm_ptr->shared_mem_created = true;
 
-	return shared_mem_created;
+	return true;
 }
 
-bool host_destroy_realm(void)
+bool host_destroy_realm(struct realm *realm_ptr)
 {
 	/* Free test resources */
-	timer_enabled = false;
 	page_pool_reset();
 
-	if (!realm_payload_created) {
-		ERROR("%s() failed\n", "realm_payload_created");
+	if (!realm_ptr->payload_created) {
+		ERROR("%s() failed\n", "payload_created");
 		return false;
 	}
 
-	realm_payload_created = false;
-	if (host_realm_destroy(&realm) != REALM_SUCCESS) {
+	realm_ptr->payload_created = false;
+	if (host_realm_destroy(realm_ptr) != REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_destroy");
 		return false;
 	}
+	memset((char *)realm_ptr, 0U, sizeof(struct realm));
 
 	return true;
 }
@@ -301,30 +301,32 @@
  *	       TEST_RESULT_SUCCESS.
  *	false: On error.
  */
-bool host_enter_realm_execute(uint8_t cmd, struct realm **realm_ptr,
-			      unsigned int test_exit_reason,
+bool host_enter_realm_execute(struct realm *realm_ptr,
+			      uint8_t cmd,
+			      int test_exit_reason,
 			      unsigned int rec_num)
 {
 	u_register_t realm_exit_reason = RMI_EXIT_INVALID;
 	unsigned int host_call_result = TEST_RESULT_FAIL;
 
+	if (realm_ptr == NULL || realm_ptr->payload_created == false) {
+		return false;
+	}
+
 	if (test_exit_reason >= RMI_EXIT_INVALID) {
 		ERROR("Invalid RmiRecExitReason\n");
 		return false;
 	}
 
-	if (rec_num >= realm.rec_count) {
+	if (rec_num >= realm_ptr->rec_count) {
 		ERROR("Invalid Rec Count\n");
 		return false;
 	}
 	host_shared_data_set_realm_cmd(cmd, rec_num);
-	if (!host_enter_realm(&realm_exit_reason, &host_call_result, rec_num)) {
+	if (!host_enter_realm(realm_ptr, &realm_exit_reason, &host_call_result, rec_num)) {
 		return false;
 	}
 
-	if (realm_ptr != NULL) {
-		*realm_ptr = &realm;
-	}
 
 	if (test_exit_reason == realm_exit_reason) {
 		if (realm_exit_reason != RMI_EXIT_HOST_CALL) {
@@ -365,10 +367,11 @@
  * Returns Host core position for specified Rec
  * Host mpidr is saved on every rec enter
  */
-static unsigned int host_realm_find_core_pos_by_rec(unsigned int rec_num)
+static unsigned int host_realm_find_core_pos_by_rec(struct realm *realm_ptr,
+		unsigned int rec_num)
 {
-	if (rec_num < MAX_REC_COUNT && realm.run[rec_num] != 0U) {
-		return platform_get_core_pos(realm.host_mpidr[rec_num]);
+	if (rec_num < MAX_REC_COUNT && realm_ptr->run[rec_num] != 0U) {
+		return platform_get_core_pos(realm_ptr->host_mpidr[rec_num]);
 	}
 	return (unsigned int)-1;
 }
@@ -377,9 +380,11 @@
  * Send SGI on core running specified Rec
  * API can be used to forcefully exit from Realm
  */
-void host_rec_send_sgi(unsigned int sgi, unsigned int rec_num)
+void host_rec_send_sgi(struct realm *realm_ptr,
+		       unsigned int sgi,
+		       unsigned int rec_num)
 {
-	unsigned int core_pos = host_realm_find_core_pos_by_rec(rec_num);
+	unsigned int core_pos = host_realm_find_core_pos_by_rec(realm_ptr, rec_num);
 	if (core_pos < PLATFORM_CORE_COUNT) {
 		tftf_send_sgi(sgi, core_pos);
 	}
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
index 916e848..4df9005 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
@@ -20,6 +20,8 @@
 #include <host_shared_data.h>
 
 static uint64_t is_secondary_cpu_on;
+static struct realm realm;
+
 /*
  * Test tries to create max Rec
  * Enters all Rec from single CPU
@@ -32,7 +34,7 @@
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
-	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
+	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)(PAGE_POOL_MAX_SIZE +
 			NS_REALM_SHARED_MEM_SIZE),
@@ -40,21 +42,21 @@
 			0UL, rec_flag, MAX_REC_COUNT)) {
 		return TEST_RESULT_FAIL;
 	}
-	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
 			NS_REALM_SHARED_MEM_SIZE)) {
 		return TEST_RESULT_FAIL;
 	}
 
 	for (unsigned int i = 0; i < MAX_REC_COUNT; i++) {
 		host_shared_data_set_host_val(i, HOST_ARG1_INDEX, 10U);
-		ret1 = host_enter_realm_execute(REALM_SLEEP_CMD, NULL,
+		ret1 = host_enter_realm_execute(&realm, REALM_SLEEP_CMD,
 				RMI_EXIT_HOST_CALL, i);
 		if (!ret1) {
 			break;
 		}
 	}
 
-	ret2 = host_destroy_realm();
+	ret2 = host_destroy_realm(&realm);
 
 	if (!ret1 || !ret2) {
 		ERROR("%s(): enter=%d destroy=%d\n",
@@ -79,7 +81,6 @@
  */
 test_result_t host_realm_multi_rec_psci_denied(void)
 {
-	struct realm *realm_ptr;
 	bool ret1, ret2;
 	u_register_t ret;
 	unsigned int host_call_result;
@@ -91,7 +92,7 @@
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
-	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
+	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)(PAGE_POOL_MAX_SIZE +
 			NS_REALM_SHARED_MEM_SIZE),
@@ -99,28 +100,28 @@
 			0UL, rec_flag, 3U)) {
 		return TEST_RESULT_FAIL;
 	}
-	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
 			NS_REALM_SHARED_MEM_SIZE)) {
 		return TEST_RESULT_FAIL;
 	}
 
-	ret1 = host_enter_realm_execute(REALM_MULTIPLE_REC_PSCI_DENIED_CMD, &realm_ptr,
+	ret1 = host_enter_realm_execute(&realm, REALM_MULTIPLE_REC_PSCI_DENIED_CMD,
 			RMI_EXIT_PSCI, 0U);
-	run = (struct rmi_rec_run *)realm_ptr->run[0];
+	run = (struct rmi_rec_run *)realm.run[0];
 
 	if (run->exit.gprs[0] != SMC_PSCI_CPU_ON_AARCH64) {
 		ERROR("Host did not receive CPU ON request\n");
 		ret1 = false;
 		goto destroy_realm;
 	}
-	rec_num = host_realm_find_rec_by_mpidr(run->exit.gprs[1], realm_ptr);
+	rec_num = host_realm_find_rec_by_mpidr(run->exit.gprs[1], &realm);
 	if (rec_num != 1U) {
 		ERROR("Invalid mpidr requested\n");
 		ret1 = false;
 		goto destroy_realm;
 	}
 	INFO("Requesting PSCI Complete Status Denied REC %d\n", rec_num);
-	ret = host_rmi_psci_complete(realm_ptr->rec[0], realm_ptr->rec[rec_num],
+	ret = host_rmi_psci_complete(realm.rec[0], realm.rec[rec_num],
 			(unsigned long)PSCI_E_DENIED);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_psci_complete failed\n");
@@ -129,27 +130,27 @@
 	}
 
 	/* Enter rec1, should fail */
-	ret = host_realm_rec_enter(realm_ptr, &exit_reason, &host_call_result, 1U);
+	ret = host_realm_rec_enter(&realm, &exit_reason, &host_call_result, 1U);
 	if (ret == RMI_SUCCESS) {
 		ERROR("Rec1 enter should have failed\n");
 		ret1 = false;
 		goto destroy_realm;
 	}
-	ret = host_realm_rec_enter(realm_ptr, &exit_reason, &host_call_result, 0U);
+	ret = host_realm_rec_enter(&realm, &exit_reason, &host_call_result, 0U);
 
 	if (run->exit.gprs[0] != SMC_PSCI_AFFINITY_INFO_AARCH64) {
 		ERROR("Host did not receive PSCI_AFFINITY_INFO request\n");
 		ret1 = false;
 		goto destroy_realm;
 	}
-	rec_num = host_realm_find_rec_by_mpidr(run->exit.gprs[1], realm_ptr);
+	rec_num = host_realm_find_rec_by_mpidr(run->exit.gprs[1], &realm);
 	if (rec_num != 1U) {
 		ERROR("Invalid mpidr requested\n");
 		goto destroy_realm;
 	}
 
 	INFO("Requesting PSCI Complete Affinity Info REC %d\n", rec_num);
-	ret = host_rmi_psci_complete(realm_ptr->rec[0], realm_ptr->rec[rec_num],
+	ret = host_rmi_psci_complete(realm.rec[0], realm.rec[rec_num],
 			(unsigned long)PSCI_E_SUCCESS);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_psci_complete failed\n");
@@ -158,7 +159,7 @@
 	}
 
 	/* Re-enter REC0 complete PSCI_AFFINITY_INFO */
-	ret = host_realm_rec_enter(realm_ptr, &exit_reason, &host_call_result, 0U);
+	ret = host_realm_rec_enter(&realm, &exit_reason, &host_call_result, 0U);
 
 
 	if (run->exit.gprs[0] != SMC_PSCI_CPU_ON_AARCH64) {
@@ -166,7 +167,7 @@
 		ret1 = false;
 		goto destroy_realm;
 	}
-	rec_num = host_realm_find_rec_by_mpidr(run->exit.gprs[1], realm_ptr);
+	rec_num = host_realm_find_rec_by_mpidr(run->exit.gprs[1], &realm);
 	if (rec_num != 2U) {
 		ERROR("Invalid mpidr requested\n");
 		ret1 = false;
@@ -175,7 +176,7 @@
 
 	INFO("Requesting PSCI Complete Status Denied REC %d\n", rec_num);
 	/* PSCI_DENIED should fail as rec2 is RMI_RUNNABLE */
-	ret = host_rmi_psci_complete(realm_ptr->rec[0], realm_ptr->rec[rec_num],
+	ret = host_rmi_psci_complete(realm.rec[0], realm.rec[rec_num],
 			(unsigned long)PSCI_E_DENIED);
 	if (ret == RMI_SUCCESS) {
 		ret1 = false;
@@ -183,7 +184,7 @@
 		goto destroy_realm;
 	}
 
-	ret = host_realm_rec_enter(realm_ptr, &exit_reason, &host_call_result, 0U);
+	ret = host_realm_rec_enter(&realm, &exit_reason, &host_call_result, 0U);
 	if (ret != RMI_SUCCESS) {
 		ERROR("Rec0 re-enter failed\n");
 		ret1 = false;
@@ -191,7 +192,7 @@
 	}
 
 destroy_realm:
-	ret2 = host_destroy_realm();
+	ret2 = host_destroy_realm(&realm);
 
 	if (!ret1 || !ret2) {
 		ERROR("%s(): enter=%d destroy=%d\n",
@@ -213,7 +214,8 @@
 	is_secondary_cpu_on++;
 	spin_unlock(&secondary_cpu_lock);
 
-	ret = host_enter_realm_execute(REALM_LOOP_CMD, NULL, RMI_EXIT_IRQ, is_secondary_cpu_on);
+	ret = host_enter_realm_execute(&realm, REALM_LOOP_CMD,
+			RMI_EXIT_IRQ, is_secondary_cpu_on);
 	if (!ret) {
 		return TEST_RESULT_FAIL;
 	}
@@ -233,7 +235,7 @@
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 	SKIP_TEST_IF_LESS_THAN_N_CPUS(rec_count);
 
-	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
+	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)(PAGE_POOL_MAX_SIZE +
 			NS_REALM_SHARED_MEM_SIZE),
@@ -241,14 +243,14 @@
 			0UL, rec_flag, rec_count)) {
 		return TEST_RESULT_FAIL;
 	}
-	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
 			NS_REALM_SHARED_MEM_SIZE)) {
 		return TEST_RESULT_FAIL;
 	}
 
 	is_secondary_cpu_on = 0U;
 	my_mpidr = read_mpidr_el1() & MPID_MASK;
-	ret1 = host_enter_realm_execute(REALM_GET_RSI_VERSION, NULL, RMI_EXIT_HOST_CALL, 0U);
+	ret1 = host_enter_realm_execute(&realm, REALM_GET_RSI_VERSION, RMI_EXIT_HOST_CALL, 0U);
 	for_each_cpu(cpu_node) {
 		other_mpidr = tftf_get_mpidr_from_node(cpu_node);
 		if (other_mpidr == my_mpidr) {
@@ -270,10 +272,10 @@
 	tftf_irq_enable(IRQ_NS_SGI_7, GIC_HIGHEST_NS_PRIORITY);
 	for (unsigned int i = 1U; i < rec_count; i++) {
 		INFO("Raising NS IRQ for rec %d\n", i);
-		host_rec_send_sgi(IRQ_NS_SGI_7, i);
+		host_rec_send_sgi(&realm, IRQ_NS_SGI_7, i);
 	}
 	tftf_irq_disable(IRQ_NS_SGI_7);
-	ret2 = host_destroy_realm();
+	ret2 = host_destroy_realm(&realm);
 	if (!ret1 || !ret2) {
 		ERROR("%s(): enter=%d destroy=%d\n",
 		__func__, ret1, ret2);
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c
index 3528319..b6ea5d4 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c
@@ -66,6 +66,8 @@
 static fpu_cs_regs_t ns_fpu_cs_regs_write;
 static fpu_cs_regs_t ns_fpu_cs_regs_read;
 
+static struct realm realm;
+
 /* Skip test if SVE is not supported in H/W or in RMI features */
 #define CHECK_SVE_SUPPORT_IN_HW_AND_IN_RMI(_reg0)				\
 	do {									\
@@ -97,7 +99,8 @@
 	}
 
 	/* Initialise Realm payload */
-	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
+	if (!host_create_realm_payload(&realm,
+				       (u_register_t)REALM_IMAGE_BASE,
 				       (u_register_t)PAGE_POOL_BASE,
 				       (u_register_t)(PAGE_POOL_MAX_SIZE +
 						      NS_REALM_SHARED_MEM_SIZE),
@@ -107,7 +110,7 @@
 	}
 
 	/* Create shared memory between Host and Realm */
-	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
 				    NS_REALM_SHARED_MEM_SIZE)) {
 		return TEST_RESULT_FAIL;
 	}
@@ -170,7 +173,7 @@
 		return TEST_RESULT_FAIL;
 	}
 
-	realm_rc = host_enter_realm_execute(REALM_SVE_RDVL, NULL,
+	realm_rc = host_enter_realm_execute(&realm, REALM_SVE_RDVL,
 					    RMI_EXIT_HOST_CALL, 0U);
 	if (realm_rc != true) {
 		rc = TEST_RESULT_FAIL;
@@ -191,7 +194,7 @@
 	}
 
 rm_realm:
-	if (!host_destroy_realm()) {
+	if (!host_destroy_realm(&realm)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -218,7 +221,7 @@
 	rc = host_create_sve_realm_payload(true, (sve_vq + 1));
 	if (rc == TEST_RESULT_SUCCESS) {
 		ERROR("Error: Realm created with invalid SVE VL %u\n", (sve_vq + 1));
-		host_destroy_realm();
+		host_destroy_realm(&realm);
 		return TEST_RESULT_FAIL;
 	}
 
@@ -246,7 +249,7 @@
 		return rc;
 	}
 
-	realm_rc = host_enter_realm_execute(REALM_SVE_ID_REGISTERS, NULL,
+	realm_rc = host_enter_realm_execute(&realm, REALM_SVE_ID_REGISTERS,
 					    RMI_EXIT_HOST_CALL, 0U);
 	if (!realm_rc) {
 		rc = TEST_RESULT_FAIL;
@@ -280,7 +283,7 @@
 	}
 
 rm_realm:
-	host_destroy_realm();
+	host_destroy_realm(&realm);
 	return rc;
 }
 
@@ -333,7 +336,7 @@
 	 */
 	vl_bitmap_expected = sve_probe_vl(sve_vq);
 
-	realm_rc = host_enter_realm_execute(REALM_SVE_PROBE_VL, NULL,
+	realm_rc = host_enter_realm_execute(&realm, REALM_SVE_PROBE_VL,
 					    RMI_EXIT_HOST_CALL, 0U);
 	if (!realm_rc) {
 		rc = TEST_RESULT_FAIL;
@@ -356,7 +359,7 @@
 	}
 
 rm_realm:
-	if (!host_destroy_realm()) {
+	if (!host_destroy_realm(&realm)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -394,7 +397,7 @@
 		ns_zcr_el2 = read_zcr_el2();
 
 		/* Call Realm to run SVE command */
-		realm_rc = host_enter_realm_execute(REALM_SVE_RDVL, NULL,
+		realm_rc = host_enter_realm_execute(&realm, REALM_SVE_RDVL,
 						    RMI_EXIT_HOST_CALL, 0U);
 		if (!realm_rc) {
 			ERROR("Realm command REALM_SVE_RDVL failed\n");
@@ -410,7 +413,7 @@
 		}
 	}
 
-	if (!host_destroy_realm()) {
+	if (!host_destroy_realm(&realm)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -427,7 +430,7 @@
 static bool callback_realm_do_sve(void)
 {
 
-	return !host_enter_realm_execute(REALM_SVE_OPS, NULL,
+	return !host_enter_realm_execute(&realm, REALM_SVE_OPS,
 					 RMI_EXIT_HOST_CALL, 0U);
 }
 
@@ -440,7 +443,7 @@
  */
 static bool callback_realm_do_fpu(void)
 {
-	return !host_enter_realm_execute(REALM_REQ_FPU_FILL_CMD, NULL,
+	return !host_enter_realm_execute(&realm, REALM_REQ_FPU_FILL_CMD,
 					 RMI_EXIT_HOST_CALL, 0U);
 }
 
@@ -507,7 +510,7 @@
 	}
 
 rm_realm:
-	if (!host_destroy_realm()) {
+	if (!host_destroy_realm(&realm)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -622,7 +625,7 @@
 	}
 
 	/* 4. Call Realm to fill in Z registers */
-	realm_rc = host_enter_realm_execute(REALM_SVE_FILL_REGS, NULL,
+	realm_rc = host_enter_realm_execute(&realm, REALM_SVE_FILL_REGS,
 					    RMI_EXIT_HOST_CALL, 0U);
 	if (!realm_rc) {
 		rc = TEST_RESULT_FAIL;
@@ -648,7 +651,7 @@
 	}
 
 rm_realm:
-	if (!host_destroy_realm()) {
+	if (!host_destroy_realm(&realm)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -672,7 +675,7 @@
 		return rc;
 	}
 
-	realm_rc = host_enter_realm_execute(REALM_SVE_UNDEF_ABORT, NULL,
+	realm_rc = host_enter_realm_execute(&realm, REALM_SVE_UNDEF_ABORT,
 					    RMI_EXIT_HOST_CALL, 0U);
 	if (!realm_rc) {
 		ERROR("Realm didn't receive undefined abort\n");
@@ -681,7 +684,7 @@
 		rc = TEST_RESULT_SUCCESS;
 	}
 
-	if (!host_destroy_realm()) {
+	if (!host_destroy_realm(&realm)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -1007,7 +1010,7 @@
 		rl_fill_cmd = REALM_REQ_FPU_FILL_CMD;
 	}
 
-	rc = host_enter_realm_execute(rl_fill_cmd, NULL, RMI_EXIT_HOST_CALL, 0U);
+	rc = host_enter_realm_execute(&realm, rl_fill_cmd, RMI_EXIT_HOST_CALL, 0U);
 	assert(rc);
 
 	return type;
@@ -1025,7 +1028,7 @@
 		rl_cmp_cmd = REALM_REQ_FPU_CMP_CMD;
 	}
 
-	return host_enter_realm_execute(rl_cmp_cmd, NULL, RMI_EXIT_HOST_CALL,
+	return host_enter_realm_execute(&realm, rl_cmp_cmd, RMI_EXIT_HOST_CALL,
 					0U);
 }
 
@@ -1171,7 +1174,7 @@
 		tftf_smc_set_sve_hint(false);
 	}
 
-	if (!host_destroy_realm()) {
+	if (!host_destroy_realm(&realm)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -1197,7 +1200,7 @@
 		return rc;
 	}
 
-	realm_rc = host_enter_realm_execute(REALM_SME_ID_REGISTERS, NULL,
+	realm_rc = host_enter_realm_execute(&realm, REALM_SME_ID_REGISTERS,
 					    RMI_EXIT_HOST_CALL, 0U);
 	if (!realm_rc) {
 		rc = TEST_RESULT_FAIL;
@@ -1220,7 +1223,7 @@
 	}
 
 rm_realm:
-	host_destroy_realm();
+	host_destroy_realm(&realm);
 	return rc;
 }
 
@@ -1240,7 +1243,7 @@
 		return rc;
 	}
 
-	realm_rc = host_enter_realm_execute(REALM_SME_UNDEF_ABORT, NULL,
+	realm_rc = host_enter_realm_execute(&realm, REALM_SME_UNDEF_ABORT,
 					    RMI_EXIT_HOST_CALL, 0U);
 	if (!realm_rc) {
 		ERROR("Realm didn't receive undefined abort\n");
@@ -1249,7 +1252,7 @@
 		rc = TEST_RESULT_SUCCESS;
 	}
 
-	host_destroy_realm();
+	host_destroy_realm(&realm);
 	return rc;
 }
 
@@ -1318,13 +1321,12 @@
 		 * SVE support, so run SVE command else run FPU command
 		 */
 		if (sve_en) {
-			realm_rc = host_enter_realm_execute(REALM_SVE_RDVL, NULL,
+			realm_rc = host_enter_realm_execute(&realm, REALM_SVE_RDVL,
 							    RMI_EXIT_HOST_CALL,
 							    0U);
 		} else {
-			realm_rc = host_enter_realm_execute(
+			realm_rc = host_enter_realm_execute(&realm,
 							REALM_REQ_FPU_FILL_CMD,
-							NULL,
 							RMI_EXIT_HOST_CALL, 0U);
 		}
 
@@ -1357,7 +1359,7 @@
 		sme_smstop(SMSTOP_SM);
 	}
 
-	if (!host_destroy_realm()) {
+	if (!host_destroy_realm(&realm)) {
 		return TEST_RESULT_FAIL;
 	}
 
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 f2d1861..0c3349d 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
@@ -25,36 +25,39 @@
 extern const char *rmi_exit[];
 
 /*
- * @Test_Aim@ Test realm payload creation and execution
+ * @Test_Aim@ Test realm payload creation, execution and destruction  iteratively
  */
 test_result_t host_test_realm_create_enter(void)
 {
 	bool ret1, ret2;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
+	struct realm realm;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
-	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
-			(u_register_t)PAGE_POOL_BASE,
-			(u_register_t)(PAGE_POOL_MAX_SIZE +
-			NS_REALM_SHARED_MEM_SIZE),
-			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
-		return TEST_RESULT_FAIL;
-	}
-	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
-			NS_REALM_SHARED_MEM_SIZE)) {
-		return TEST_RESULT_FAIL;
-	}
+	for (unsigned int i = 0U; i < 5U; i++) {
+		if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
+				(u_register_t)PAGE_POOL_BASE,
+				(u_register_t)(PAGE_POOL_MAX_SIZE +
+				NS_REALM_SHARED_MEM_SIZE),
+				(u_register_t)PAGE_POOL_MAX_SIZE,
+				0UL, rec_flag, 1U)) {
+			return TEST_RESULT_FAIL;
+		}
+		if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
+				NS_REALM_SHARED_MEM_SIZE)) {
+			return TEST_RESULT_FAIL;
+		}
 
-	host_shared_data_set_host_val(0U, HOST_ARG1_INDEX, SLEEP_TIME_MS);
-	ret1 = host_enter_realm_execute(REALM_SLEEP_CMD, NULL, RMI_EXIT_HOST_CALL, 0U);
-	ret2 = host_destroy_realm();
+		host_shared_data_set_host_val(0U, HOST_ARG1_INDEX, SLEEP_TIME_MS);
+		ret1 = host_enter_realm_execute(&realm, REALM_SLEEP_CMD, RMI_EXIT_HOST_CALL, 0U);
+		ret2 = host_destroy_realm(&realm);
 
-	if (!ret1 || !ret2) {
-		ERROR("%s(): enter=%d destroy=%d\n",
-		__func__, ret1, ret2);
-		return TEST_RESULT_FAIL;
+		if (!ret1 || !ret2) {
+			ERROR("%s(): enter=%d destroy=%d\n",
+			__func__, ret1, ret2);
+			return TEST_RESULT_FAIL;
+		}
 	}
 
 	return host_cmp_result();
@@ -67,10 +70,11 @@
 {
 	bool ret1, ret2;
 	u_register_t rec_flag[] = {RMI_RUNNABLE};
+	struct realm realm;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
-	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
+	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)(PAGE_POOL_MAX_SIZE +
 			NS_REALM_SHARED_MEM_SIZE),
@@ -78,13 +82,13 @@
 			0UL, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}
-	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
 			NS_REALM_SHARED_MEM_SIZE)) {
 		return TEST_RESULT_FAIL;
 	}
 
-	ret1 = host_enter_realm_execute(REALM_GET_RSI_VERSION, NULL, RMI_EXIT_HOST_CALL, 0U);
-	ret2 = host_destroy_realm();
+	ret1 = host_enter_realm_execute(&realm, REALM_GET_RSI_VERSION, RMI_EXIT_HOST_CALL, 0U);
+	ret2 = host_destroy_realm(&realm);
 
 	if (!ret1 || !ret2) {
 		ERROR("%s(): enter=%d destroy=%d\n",
@@ -105,11 +109,12 @@
 #else
 	bool ret1, ret2;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
+	struct realm realm;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
 	pauth_test_lib_fill_regs_and_template();
-	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
+	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 				(u_register_t)PAGE_POOL_BASE,
 				(u_register_t)(PAGE_POOL_MAX_SIZE +
 					NS_REALM_SHARED_MEM_SIZE),
@@ -118,20 +123,20 @@
 		return TEST_RESULT_FAIL;
 	}
 
-	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
 				NS_REALM_SHARED_MEM_SIZE)) {
 		return TEST_RESULT_FAIL;
 	}
 
-	ret1 = host_enter_realm_execute(REALM_PAUTH_SET_CMD, NULL, RMI_EXIT_HOST_CALL, 0U);
+	ret1 = host_enter_realm_execute(&realm, REALM_PAUTH_SET_CMD, RMI_EXIT_HOST_CALL, 0U);
 
 	if (ret1) {
 		/* Re-enter Realm to compare PAuth registers. */
-		ret1 = host_enter_realm_execute(REALM_PAUTH_CHECK_CMD, NULL,
+		ret1 = host_enter_realm_execute(&realm, REALM_PAUTH_CHECK_CMD,
 				RMI_EXIT_HOST_CALL, 0U);
 	}
 
-	ret2 = host_destroy_realm();
+	ret2 = host_destroy_realm(&realm);
 
 	if (!ret1) {
 		ERROR("%s(): enter=%d destroy=%d\n",
@@ -160,9 +165,10 @@
 #else
 	bool ret1, ret2;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
+	struct realm realm;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
-	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
+	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 				(u_register_t)PAGE_POOL_BASE,
 				(u_register_t)(PAGE_POOL_MAX_SIZE +
 					NS_REALM_SHARED_MEM_SIZE),
@@ -170,13 +176,13 @@
 				0UL, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}
-	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
 				NS_REALM_SHARED_MEM_SIZE)) {
 		return TEST_RESULT_FAIL;
 	}
 
-	ret1 = host_enter_realm_execute(REALM_PAUTH_FAULT, NULL, RMI_EXIT_HOST_CALL, 0U);
-	ret2 = host_destroy_realm();
+	ret1 = host_enter_realm_execute(&realm, REALM_PAUTH_FAULT, RMI_EXIT_HOST_CALL, 0U);
+	ret2 = host_destroy_realm(&realm);
 
 	if (!ret1) {
 		ERROR("%s(): enter=%d destroy=%d\n",
@@ -248,7 +254,7 @@
  */
 static test_result_t host_test_realm_pmuv3(uint8_t cmd)
 {
-	struct realm *realm_ptr;
+	struct realm realm;
 	u_register_t feature_flag;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
 	bool ret1, ret2;
@@ -260,7 +266,7 @@
 	feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
 			INPLACE(FEATURE_PMU_NUM_CTRS, (unsigned long long)(-1));
 
-	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
+	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)(PAGE_POOL_MAX_SIZE +
 			NS_REALM_SHARED_MEM_SIZE),
@@ -268,22 +274,22 @@
 			feature_flag, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}
-	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
 			NS_REALM_SHARED_MEM_SIZE)) {
 		return TEST_RESULT_FAIL;
 	}
 
-	ret1 = host_enter_realm_execute(cmd, &realm_ptr,
+	ret1 = host_enter_realm_execute(&realm, cmd,
 					(cmd == REALM_PMU_INTERRUPT) ?
 					RMI_EXIT_IRQ : RMI_EXIT_HOST_CALL, 0U);
 	if (!ret1 || (cmd != REALM_PMU_INTERRUPT)) {
 		goto test_exit;
 	}
 
-	ret1 = host_realm_handle_irq_exit(realm_ptr, 0U);
+	ret1 = host_realm_handle_irq_exit(&realm, 0U);
 
 test_exit:
-	ret2 = host_destroy_realm();
+	ret2 = host_destroy_realm(&realm);
 	if (!ret1 || !ret2) {
 		ERROR("%s() enter=%u destroy=%u\n", __func__, ret1, ret2);
 		return TEST_RESULT_FAIL;
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_spm.c b/tftf/tests/runtime_services/realm_payload/host_realm_spm.c
index a187584..6001113 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_spm.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_spm.c
@@ -25,6 +25,7 @@
 
 static fpu_state_t ns_fpu_state_write;
 static fpu_state_t ns_fpu_state_read;
+static struct realm realm;
 
 typedef enum security_state {
 	NONSECURE_WORLD = 0U,
@@ -55,7 +56,7 @@
 	/*
 	 * Initialise Realm payload
 	 */
-	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
+	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)(PAGE_POOL_MAX_SIZE +
 			NS_REALM_SHARED_MEM_SIZE),
@@ -66,7 +67,7 @@
 	/*
 	 * Create shared memory between Host and Realm
 	 */
-	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
 			NS_REALM_SHARED_MEM_SIZE)) {
 		return TEST_RESULT_FAIL;
 	}
@@ -120,7 +121,7 @@
 /* Send request to Realm to fill FPU/SIMD regs with realm template values */
 static bool fpu_fill_rl(void)
 {
-	if (!host_enter_realm_execute(REALM_REQ_FPU_FILL_CMD, NULL, RMI_EXIT_HOST_CALL, 0U)) {
+	if (!host_enter_realm_execute(&realm, REALM_REQ_FPU_FILL_CMD, RMI_EXIT_HOST_CALL, 0U)) {
 		ERROR("%s failed %d\n", __func__, __LINE__);
 		return false;
 	}
@@ -130,7 +131,7 @@
 /* Send request to Realm to compare FPU/SIMD regs with previous realm template values */
 static bool fpu_cmp_rl(void)
 {
-	if (!host_enter_realm_execute(REALM_REQ_FPU_CMP_CMD, NULL, RMI_EXIT_HOST_CALL, 0U)) {
+	if (!host_enter_realm_execute(&realm, REALM_REQ_FPU_CMP_CMD, RMI_EXIT_HOST_CALL, 0U)) {
 		ERROR("%s failed %d\n", __func__, __LINE__);
 		return false;
 	}
@@ -180,7 +181,6 @@
  */
 test_result_t host_realm_sec_interrupt_can_preempt_rl(void)
 {
-	struct realm *realm_ptr;
 	struct ffa_value ret_values;
 	test_result_t res;
 
@@ -220,12 +220,12 @@
 	 * timer triggers during this time.
 	 */
 	host_shared_data_set_host_val(0U, HOST_ARG1_INDEX, REALM_TIME_SLEEP);
-	host_enter_realm_execute(REALM_SLEEP_CMD, &realm_ptr, RMI_EXIT_FIQ, 0U);
+	host_enter_realm_execute(&realm, REALM_SLEEP_CMD, RMI_EXIT_FIQ, 0U);
 
 	/*
 	 * Check if Realm exit reason is FIQ.
 	 */
-	if (!host_realm_handle_fiq_exit(realm_ptr, 0U)) {
+	if (!host_realm_handle_fiq_exit(&realm, 0U)) {
 		ERROR("Trusted watchdog timer interrupt not fired\n");
 		goto destroy_realm;
 	}
@@ -250,7 +250,7 @@
 		goto destroy_realm;
 	}
 
-	if (!host_destroy_realm()) {
+	if (!host_destroy_realm(&realm)) {
 		ERROR("host_destroy_realm error\n");
 		return TEST_RESULT_FAIL;
 	}
@@ -258,7 +258,7 @@
 	return TEST_RESULT_SUCCESS;
 
 destroy_realm:
-	host_destroy_realm();
+	host_destroy_realm(&realm);
 	return TEST_RESULT_FAIL;
 }
 
@@ -404,12 +404,12 @@
 		}
 	}
 
-	if (!host_destroy_realm()) {
+	if (!host_destroy_realm(&realm)) {
 		ERROR("host_destroy_realm error\n");
 		return TEST_RESULT_FAIL;
 	}
 	return TEST_RESULT_SUCCESS;
 destroy_realm:
-	host_destroy_realm();
+	host_destroy_realm(&realm);
 	return TEST_RESULT_FAIL;
 }