feat(rmm-eac5): update RSI_VERSION, RMI_VERSION
This patch adds necessary support for RMI_VERSION
and RSI_VERSION commands.
Macro SMC_RSI_ABI_VERSION renamed to SMC_RSI_VERSION.
Note.
This patch sets both RSI and RMI version numbers to
1.0 as per RMM Specification 1.0-eac5.
Signed-off-by: Shruti Gupta <shruti.gupta@arm.com>
Change-Id: If4eb14d93f657388e2fe64ceefee002403cc4ae8
diff --git a/include/common/test_helpers.h b/include/common/test_helpers.h
index 4972d6a..6b44d0a 100644
--- a/include/common/test_helpers.h
+++ b/include/common/test_helpers.h
@@ -294,7 +294,7 @@
#define SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP() \
do { \
- u_register_t retrmm; \
+ u_register_t retrmm = 0U; \
\
if (!get_armv9_2_feat_rme_support()) { \
tftf_testcase_printf("FEAT_RME not supported\n"); \
@@ -302,7 +302,7 @@
} \
\
host_rmi_init_cmp_result(); \
- retrmm = host_rmi_version(); \
+ retrmm = host_rmi_version(RMI_ABI_VERSION_VAL); \
\
VERBOSE("RMM version is: %lu.%lu\n", \
RMI_ABI_VERSION_GET_MAJOR(retrmm), \
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 b1e54dd..5030c38 100644
--- a/include/runtime_services/host_realm_managment/host_realm_rmi.h
+++ b/include/runtime_services/host_realm_managment/host_realm_rmi.h
@@ -28,6 +28,10 @@
#define RMI_ABI_VERSION_GET_MAJOR(_version) (((_version) >> 16U) & 0x8FFF)
#define RMI_ABI_VERSION_GET_MINOR(_version) ((_version) & 0xFFFF)
+#define RMI_ABI_VERSION_MAJOR U(1)
+#define RMI_ABI_VERSION_MINOR U(0)
+#define RMI_ABI_VERSION_VAL ((RMI_ABI_VERSION_MAJOR << 16U) | \
+ RMI_ABI_VERSION_MINOR)
#define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
#define __ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1U)
@@ -522,7 +526,7 @@
};
/* RMI/SMC */
-u_register_t host_rmi_version(void);
+u_register_t host_rmi_version(u_register_t req_ver);
u_register_t host_rmi_granule_delegate(u_register_t addr);
u_register_t host_rmi_granule_undelegate(u_register_t addr);
u_register_t host_rmi_realm_create(u_register_t rd, u_register_t params_ptr);
diff --git a/realm/include/realm_rsi.h b/realm/include/realm_rsi.h
index e9b6ce8..547db0d 100644
--- a/realm/include/realm_rsi.h
+++ b/realm/include/realm_rsi.h
@@ -26,7 +26,7 @@
* The major version number of the RSI implementation. Increase this whenever
* the binary format or semantics of the SMC calls change.
*/
-#define RSI_ABI_VERSION_MAJOR 12U
+#define RSI_ABI_VERSION_MAJOR 1U
/*
* The minor version number of the RSI implementation. Increase this when
@@ -94,7 +94,7 @@
#define RSI_HOST_CALL SMC_RSI_FID(9U)
-#define RSI_ABI_VERSION SMC_RSI_FID(0U)
+#define RSI_VERSION SMC_RSI_FID(0U)
/*
* arg0 == struct rsi_realm_config address
@@ -102,7 +102,7 @@
#define RSI_REALM_CONFIG SMC_RSI_FID(6U)
/* This function return RSI_ABI_VERSION */
-u_register_t rsi_get_version(void);
+u_register_t rsi_get_version(u_register_t req_ver);
/* This function will call the Host to request IPA of the NS shared buffer */
u_register_t rsi_get_ns_buffer(void);
diff --git a/realm/realm_payload_main.c b/realm/realm_payload_main.c
index 1440716..aaf7479 100644
--- a/realm/realm_payload_main.c
+++ b/realm/realm_payload_main.c
@@ -43,21 +43,22 @@
/*
* This function requests RSI/ABI version from RMM.
*/
-static void realm_get_rsi_version(void)
+static bool realm_get_rsi_version(void)
{
- u_register_t version;
+ u_register_t version = 0U;
- version = rsi_get_version();
+ version = rsi_get_version(RSI_ABI_VERSION_VAL);
if (version == (u_register_t)SMC_UNKNOWN) {
- realm_printf("SMC_RSI_ABI_VERSION failed (%ld)", (long)version);
- return;
+ realm_printf("SMC_RSI_ABI_VERSION failed\n");
+ return false;
}
- realm_printf("RSI ABI version %u.%u (expected: %u.%u)",
+ realm_printf("RSI ABI version %u.%u (expected: %u.%u)\n",
RSI_ABI_VERSION_GET_MAJOR(version),
RSI_ABI_VERSION_GET_MINOR(version),
- RSI_ABI_VERSION_GET_MAJOR(RSI_ABI_VERSION),
- RSI_ABI_VERSION_GET_MINOR(RSI_ABI_VERSION));
+ RSI_ABI_VERSION_GET_MAJOR(RSI_ABI_VERSION_VAL),
+ RSI_ABI_VERSION_GET_MINOR(RSI_ABI_VERSION_VAL));
+ return true;
}
/*
@@ -98,8 +99,7 @@
test_succeed = test_realm_pauth_fault();
break;
case REALM_GET_RSI_VERSION:
- realm_get_rsi_version();
- test_succeed = true;
+ test_succeed = realm_get_rsi_version();
break;
case REALM_PMU_CYCLE:
test_succeed = test_pmuv3_cycle_works_realm();
diff --git a/realm/realm_pmuv3.c b/realm/realm_pmuv3.c
index 862e93e..58c05f0 100644
--- a/realm/realm_pmuv3.c
+++ b/realm/realm_pmuv3.c
@@ -227,7 +227,7 @@
read_all_pmu_configs(pmu_cfg_start);
/* Give RMM a chance to scramble everything */
- (void)rsi_get_version();
+ (void)rsi_get_version(RSI_ABI_VERSION_VAL);
/* Get after reading */
read_all_counters(ctr_end, impl_ev_ctrs);
diff --git a/realm/realm_rsi.c b/realm/realm_rsi.c
index 586d4d2..d82aa6f 100644
--- a/realm/realm_rsi.c
+++ b/realm/realm_rsi.c
@@ -14,14 +14,18 @@
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(void)
+u_register_t rsi_get_version(u_register_t req_ver)
{
smc_ret_values res = {};
res = tftf_smc(&(smc_args)
- {RSI_ABI_VERSION, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
+ {RSI_VERSION, req_ver, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
- return res.ret0;
+ if (res.ret0 == SMC_UNKNOWN) {
+ return SMC_UNKNOWN;
+ }
+ /* Return lower version. */
+ return res.ret1;
}
/* This function will call the Host to request IPA of the NS shared buffer */
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 a897913..8d9e8e9 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
@@ -716,9 +716,16 @@
return host_rmi_handler(&(smc_args) {RMI_GRANULE_UNDELEGATE, addr}, 2U).ret0;
}
-u_register_t host_rmi_version(void)
+u_register_t host_rmi_version(u_register_t requested_ver)
{
- return host_rmi_handler(&(smc_args) {RMI_VERSION}, 1U).ret0;
+ smc_ret_values ret;
+
+ ret = host_rmi_handler(&(smc_args) {RMI_VERSION, requested_ver}, 2U);
+ if (ret.ret0 == (u_register_t)SMC_UNKNOWN) {
+ return SMC_UNKNOWN;
+ }
+ /* Return lower version. */
+ return ret.ret1;
}
u_register_t host_realm_create(struct realm *realm)
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 77d2db0..ce604c0 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
@@ -70,7 +70,7 @@
*/
test_result_t host_realm_version_single_cpu(void)
{
- u_register_t retrmm;
+ u_register_t retrmm = 0U;
if (get_armv9_2_feat_rme_support() == 0U) {
return TEST_RESULT_SKIPPED;
@@ -78,11 +78,13 @@
host_rmi_init_cmp_result();
- retrmm = host_rmi_version();
+ retrmm = host_rmi_version(RMI_ABI_VERSION_VAL);
- tftf_testcase_printf("RMM version is: %lu.%lu\n",
+ tftf_testcase_printf("RMM version is: %lu.%lu (expected: %u.%u)\n",
RMI_ABI_VERSION_GET_MAJOR(retrmm),
- RMI_ABI_VERSION_GET_MINOR(retrmm));
+ RMI_ABI_VERSION_GET_MINOR(retrmm),
+ RMI_ABI_VERSION_GET_MAJOR(RMI_ABI_VERSION_VAL),
+ RMI_ABI_VERSION_GET_MINOR(RMI_ABI_VERSION_VAL));
return host_cmp_result();
}
@@ -173,11 +175,11 @@
static test_result_t host_realm_multi_cpu_payload_test(void)
{
- u_register_t retrmm;
+ u_register_t retrmm = 0U;
host_rmi_init_cmp_result();
- retrmm = host_rmi_version();
+ retrmm = host_rmi_version(RMI_ABI_VERSION_VAL);
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),
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 0732605..48b3e24 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
@@ -61,6 +61,41 @@
}
/*
+ * @Test_Aim@ Test realm payload creation and execution
+ */
+test_result_t host_test_realm_rsi_version(void)
+{
+ bool ret1, ret2;
+ u_register_t rec_flag[] = {RMI_RUNNABLE};
+
+ 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;
+ }
+
+ ret1 = host_enter_realm_execute(REALM_GET_RSI_VERSION, NULL, RMI_EXIT_HOST_CALL, 0U);
+ ret2 = host_destroy_realm();
+
+ if (!ret1 || !ret2) {
+ ERROR("%s(): enter=%d destroy=%d\n",
+ __func__, ret1, ret2);
+ return TEST_RESULT_FAIL;
+ }
+
+ return host_cmp_result();
+}
+
+/*
* @Test_Aim@ Test PAuth in realm
*/
test_result_t host_realm_enable_pauth(void)
diff --git a/tftf/tests/tests-realm-payload.xml b/tftf/tests/tests-realm-payload.xml
index f0ae8c6..cf707a5 100644
--- a/tftf/tests/tests-realm-payload.xml
+++ b/tftf/tests/tests-realm-payload.xml
@@ -16,6 +16,8 @@
function="host_realm_multi_rec_psci_denied" />
<testcase name="Realm payload multi rec force exit on NS IRQ"
function="host_realm_multi_rec_exit_irq" />
+ <testcase name="Realm EL1 creation and RSI version"
+ function="host_test_realm_rsi_version" />
<testcase name="Realm payload boot"
function="host_realm_version_single_cpu" />
<testcase name="Realm payload multi CPU request"