test(realm): test realm pauth state is preserved

Modify Pauth lib to work for multiple CPU
Test if Realm pauth state is preserved for all RECs
on context switch to RMM/NS.

Change-Id: Ibb393b415bab27066289b560be49e02d0c8f58ba
Signed-off-by: Shruti Gupta <shruti.gupta@arm.com>
diff --git a/tftf/tests/extensions/pauth/test_pauth.c b/tftf/tests/extensions/pauth/test_pauth.c
index b29e5d0..ada2f1d 100644
--- a/tftf/tests/extensions/pauth/test_pauth.c
+++ b/tftf/tests/extensions/pauth/test_pauth.c
@@ -13,6 +13,11 @@
 #include <tsp.h>
 #include <string.h>
 
+#ifdef __aarch64__
+static uint128_t pauth_keys_before[NUM_KEYS];
+static uint128_t pauth_keys_after[NUM_KEYS];
+#endif
+
 /*
  * TF-A is expected to allow access to key registers from lower EL's,
  * reading the keys excercises this, on failure this will trap to
@@ -23,7 +28,7 @@
 	SKIP_TEST_IF_AARCH32();
 #ifdef __aarch64__
 	SKIP_TEST_IF_PAUTH_NOT_SUPPORTED();
-	pauth_test_lib_read_keys();
+	pauth_test_lib_read_keys(pauth_keys_before);
 	return TEST_RESULT_SUCCESS;
 #endif	/* __aarch64__ */
 }
@@ -37,11 +42,11 @@
 	SKIP_TEST_IF_AARCH32();
 #ifdef __aarch64__
 	SKIP_TEST_IF_PAUTH_NOT_SUPPORTED();
-	pauth_test_lib_read_keys();
+	pauth_test_lib_read_keys(pauth_keys_before);
 
 	tftf_get_psci_version();
 
-	return pauth_test_lib_compare_template();
+	return pauth_test_lib_compare_template(pauth_keys_before, pauth_keys_after);
 #endif	/* __aarch64__ */
 }
 
@@ -84,7 +89,7 @@
 	SKIP_TEST_IF_PAUTH_NOT_SUPPORTED();
 	SKIP_TEST_IF_TSP_NOT_PRESENT();
 
-	pauth_test_lib_fill_regs_and_template();
+	pauth_test_lib_fill_regs_and_template(pauth_keys_before);
 
 	/* Standard SMC to ADD two numbers */
 	tsp_svc_params.fid = TSP_STD_FID(TSP_ADD);
@@ -106,6 +111,6 @@
 		return TEST_RESULT_FAIL;
 	}
 
-	return pauth_test_lib_compare_template();
+	return pauth_test_lib_compare_template(pauth_keys_before, pauth_keys_after);
 #endif	/* __aarch64__ */
 }
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 175dc04..7cb0d5b 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
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021-2023, Arm Limited. All rights reserved.
+ * Copyright (c) 2021-2024, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -25,6 +25,11 @@
 
 extern const char *rmi_exit[];
 
+#if ENABLE_PAUTH
+static uint128_t pauth_keys_before[NUM_KEYS];
+static uint128_t pauth_keys_after[NUM_KEYS];
+#endif
+
 /*
  * @Test_Aim@ Test realm payload creation, execution and destruction  iteratively
  */
@@ -97,7 +102,8 @@
 }
 
 /*
- * @Test_Aim@ Test PAuth in realm
+ * @Test_Aim@ Create realm with multiple rec
+ * Test PAuth registers are preserved for each rec
  */
 test_result_t host_realm_enable_pauth(void)
 {
@@ -105,16 +111,17 @@
 	return TEST_RESULT_SKIPPED;
 #else
 	bool ret1, ret2;
-	u_register_t rec_flag[1] = {RMI_RUNNABLE};
+	u_register_t rec_flag[MAX_REC_COUNT] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
+		RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,};
 	struct realm realm;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
-	pauth_test_lib_fill_regs_and_template();
+	pauth_test_lib_fill_regs_and_template(pauth_keys_before);
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 				(u_register_t)PAGE_POOL_BASE,
 				(u_register_t)PAGE_POOL_MAX_SIZE,
-				0UL, rec_flag, 1U)) {
+				0UL, rec_flag, MAX_REC_COUNT)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -123,24 +130,33 @@
 		return TEST_RESULT_FAIL;
 	}
 
-	ret1 = host_enter_realm_execute(&realm, REALM_PAUTH_SET_CMD, RMI_EXIT_HOST_CALL, 0U);
+	for (unsigned int i = 0U; i < MAX_REC_COUNT; i++) {
+		ret1 = host_enter_realm_execute(&realm, REALM_PAUTH_SET_CMD,
+				RMI_EXIT_HOST_CALL, i);
 
-	if (ret1) {
+		if (!ret1) {
+			ERROR("Pauth set cmd failed\n");
+			break;
+		}
 		/* Re-enter Realm to compare PAuth registers. */
 		ret1 = host_enter_realm_execute(&realm, REALM_PAUTH_CHECK_CMD,
-				RMI_EXIT_HOST_CALL, 0U);
+			RMI_EXIT_HOST_CALL, i);
+		if (!ret1) {
+			ERROR("Pauth check cmd failed\n");
+			break;
+		}
 	}
 
 	ret2 = host_destroy_realm(&realm);
 
-	if (!ret1) {
+	if (!ret1 || !ret2) {
 		ERROR("%s(): enter=%d destroy=%d\n",
 				__func__, ret1, ret2);
 		return TEST_RESULT_FAIL;
 	}
 
 	/* Check if PAuth keys are preserved. */
-	if (!pauth_test_lib_compare_template()) {
+	if (!pauth_test_lib_compare_template(pauth_keys_before, pauth_keys_after)) {
 		ERROR("%s(): NS PAuth keys not preserved\n",
 				__func__);
 		return TEST_RESULT_FAIL;