feat(realm): update rsi_ipa_state_get() function
This patch updates rsi_ipa_state_get() function and its
related test calls as per RMM Specification 1.0-rel0-rc1.
It also updates RSI commands API related comments and
makes minor changes in test functions to improve code
readability.
Change-Id: I28f69967ab6ff5b38c2b9efd423b0e8b4ad61dae
Signed-off-by: AlexeiFedorov <Alexei.Fedorov@arm.com>
diff --git a/realm/include/realm_rsi.h b/realm/include/realm_rsi.h
index 6a4de5e..92a078b 100644
--- a/realm/include/realm_rsi.h
+++ b/realm/include/realm_rsi.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
+ * Copyright (c) 2022-2024, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -76,14 +76,6 @@
SET_MEMBER(unsigned char rpv[RSI_RPV_SIZE], 0x200, 0x1000); /* Offset 0x200 */
};
-/*
- * arg0 == IPA address of target region
- * arg1 == Size of target region in bytes
- * arg2 == RIPAS value
- * ret0 == Status / error
- * ret1 == Top of modified IPA range
- */
-
#define RSI_HOST_CALL_NR_GPRS 31U
struct rsi_host_call {
@@ -97,17 +89,42 @@
/*
* arg0 == struct rsi_host_call address
+ * ret0 == Status / error
*/
#define RSI_HOST_CALL SMC_RSI_FID(9U)
-
+/*
+ * arg0: Requested interface version
+ * ret0: Status / error
+ * ret1: Lower implemented interface revision
+ * ret2: Higher implemented interface revision
+ */
#define RSI_VERSION SMC_RSI_FID(0U)
/*
* arg0 == struct rsi_realm_config address
+ * ret0 == Status / error
*/
#define RSI_REALM_CONFIG SMC_RSI_FID(6U)
+
+/*
+ * arg0 == Base IPA address of target region
+ * arg1 == Top address of target region
+ * arg2 == RIPAS value
+ * arg3 == flags
+ * ret0 == Status / error
+ * ret1 == Base of IPA region which was not modified by the command
+ * ret2 == RSI response
+ */
#define RSI_IPA_STATE_SET SMC_RSI_FID(7U)
+
+/*
+ * arg0 == Base of target IPA region
+ * arg1 == End of target IPA region
+ * ret0 == Status / error
+ * ret1 == Top of IPA region which has the reported RIPAS value
+ * ret2 == RIPAS value
+ */
#define RSI_IPA_STATE_GET SMC_RSI_FID(8U)
typedef enum {
@@ -125,16 +142,19 @@
#define RSI_NO_CHANGE_DESTROYED 0UL
#define RSI_CHANGE_DESTROYED 1UL
-/* Request RIPAS of a target IPA range to be changed to a specified value. */
+/* Request RIPAS of a target IPA range to be changed to a specified value */
u_register_t rsi_ipa_state_set(u_register_t base,
- u_register_t top,
- rsi_ripas_type ripas,
- u_register_t flag,
- u_register_t *new_base,
- rsi_ripas_respose_type *response);
+ u_register_t top,
+ rsi_ripas_type ripas,
+ u_register_t flag,
+ u_register_t *new_base,
+ rsi_ripas_respose_type *response);
-/* Request RIPAS of a target IPA */
-u_register_t rsi_ipa_state_get(u_register_t adr, rsi_ripas_type *ripas);
+/* Request RIPAS of a target IPA range */
+u_register_t rsi_ipa_state_get(u_register_t base,
+ u_register_t top,
+ u_register_t *out_top,
+ rsi_ripas_type *ripas);
/* This function return RSI_ABI_VERSION */
u_register_t rsi_get_version(u_register_t req_ver);
diff --git a/realm/realm_payload_main.c b/realm/realm_payload_main.c
index 5eec5b8..47f9b9f 100644
--- a/realm/realm_payload_main.c
+++ b/realm/realm_payload_main.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
+ * Copyright (c) 2022-2024, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -63,70 +63,76 @@
bool test_realm_set_ripas(void)
{
- u_register_t ret, base, new_base, top;
+ u_register_t ret, base, new_base, top, new_top;
rsi_ripas_respose_type response;
rsi_ripas_type ripas;
base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
top = realm_shared_data_get_my_host_val(HOST_ARG2_INDEX);
- realm_printf("base=0x%lx top =0x%lx\n", base, top);
- ret = rsi_ipa_state_get(base, &ripas);
+ realm_printf("base=0x%lx top=0x%lx\n", base, top);
+ ret = rsi_ipa_state_get(base, top, &new_top, &ripas);
if (ripas != RSI_EMPTY) {
return false;
}
ret = rsi_ipa_state_set(base, top, RSI_RAM,
- RSI_NO_CHANGE_DESTROYED, &new_base, &response);
- if (ret != RSI_SUCCESS || response != RSI_ACCEPT) {
+ RSI_NO_CHANGE_DESTROYED, &new_base, &response);
+ if ((ret != RSI_SUCCESS) || (response != RSI_ACCEPT)) {
return false;
}
+
while (new_base < top) {
- realm_printf("new_base=0x%lx top =0x%lx\n", new_base, top);
+ realm_printf("new_base=0x%lx top=0x%lx\n", new_base, top);
ret = rsi_ipa_state_set(new_base, top, RSI_RAM,
RSI_NO_CHANGE_DESTROYED, &new_base, &response);
- if (ret != RSI_SUCCESS || response != RSI_ACCEPT) {
+ if ((ret != RSI_SUCCESS) || (response != RSI_ACCEPT)) {
realm_printf("rsi_ipa_state_set failed\n");
return false;
}
}
- /* Verify that RIAS has changed for range base-top. */
- for (unsigned int i = 0U; (base + (PAGE_SIZE * i) < top); i++) {
- ret = rsi_ipa_state_get(base + (PAGE_SIZE * i), &ripas);
- if (ret != RSI_SUCCESS || ripas != RSI_RAM) {
- realm_printf("rsi_ipa_state_get failed base=0x%lx, ripas=0x%x\n",
- base + (PAGE_SIZE * i), ripas);
- return false;
- }
+ /* Verify that RIAS has changed for range base-top */
+ ret = rsi_ipa_state_get(base, top, &new_top, &ripas);
+ if ((ret != RSI_SUCCESS) || (ripas != RSI_RAM) || (new_top != top)) {
+ realm_printf("rsi_ipa_state_get failed base=0x%lx top=0x%lx",
+ "new_top=0x%lx ripas=%u ret=0x%lx\n",
+ base, top, ripas);
+ return false;
}
+
return true;
}
bool test_realm_reject_set_ripas(void)
{
- u_register_t ret, base, new_base;
+ u_register_t ret, base, top, new_base, new_top;
rsi_ripas_respose_type response;
rsi_ripas_type ripas;
base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
- ret = rsi_ipa_state_get(base, &ripas);
- if (ret != RSI_SUCCESS || ripas != RSI_EMPTY) {
- realm_printf("Wrong initial ripas=0x%lx\n", ripas);
+ top = base + PAGE_SIZE;
+ ret = rsi_ipa_state_get(base, top, &new_top, &ripas);
+ if ((ret != RSI_SUCCESS) || (ripas != RSI_EMPTY)) {
+ realm_printf("Wrong initial ripas=%u\n", ripas);
return false;
}
- ret = rsi_ipa_state_set(base, base + PAGE_SIZE, RSI_RAM,
- RSI_NO_CHANGE_DESTROYED, &new_base, &response);
- if (ret == RSI_SUCCESS && response == RSI_REJECT) {
- realm_printf("rsi_ipa_state_set passed response = %d\n", response);
- ret = rsi_ipa_state_get(base, &ripas);
- if (ret == RSI_SUCCESS && ripas == RSI_EMPTY) {
+ ret = rsi_ipa_state_set(base, top, RSI_RAM,
+ RSI_NO_CHANGE_DESTROYED, &new_base, &response);
+ if ((ret == RSI_SUCCESS) && (response == RSI_REJECT)) {
+ realm_printf("rsi_ipa_state_set passed response=%u\n", response);
+ ret = rsi_ipa_state_get(base, top, &new_top, &ripas);
+ if ((ret == RSI_SUCCESS) && (ripas == RSI_EMPTY) &&
+ (new_top == top)) {
return true;
} else {
- realm_printf("rsi_ipa_state_get failed ripas = %d\n", ripas);
+ realm_printf("rsi_ipa_state_get failed top=0x%lx",
+ "new_top=0x%lx ripas=%u ret=0x%lx\n",
+ ripas);
return false;
}
}
- realm_printf("rsi_ipa_state_set failed ret=0x%lx, response = %d\n", ret, response);
+ realm_printf("rsi_ipa_state_set failed ret=0x%lx response=%u\n",
+ ret, response);
return false;
}
@@ -143,36 +149,34 @@
return false;
}
-
static bool test_realm_instr_fetch_cmd(void)
{
- u_register_t base;
+ u_register_t base, new_top;
void (*func_ptr)(void);
rsi_ripas_type ripas;
base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
- rsi_ipa_state_get(base, &ripas);
- realm_printf("Initial ripas=0x%lx\n", ripas);
- /* causes instruction abort */
+ rsi_ipa_state_get(base, base + PAGE_SIZE, &new_top, &ripas);
+ realm_printf("Initial ripas=%u\n", ripas);
+ /* Causes instruction abort */
realm_printf("Generate Instruction Abort\n");
func_ptr = (void (*)(void))base;
func_ptr();
- /* should not return */
+ /* Should not return */
return false;
}
static bool test_realm_data_access_cmd(void)
{
- u_register_t base;
+ u_register_t base, new_top;
rsi_ripas_type ripas;
-
base = realm_shared_data_get_my_host_val(HOST_ARG1_INDEX);
- rsi_ipa_state_get(base, &ripas);
- realm_printf("Initial ripas=0x%lx\n", ripas);
- /* causes data abort */
+ rsi_ipa_state_get(base, base + PAGE_SIZE, &new_top, &ripas);
+ realm_printf("Initial ripas=%u\n", ripas);
+ /* Causes data abort */
realm_printf("Generate Data Abort\n");
*((volatile uint64_t *)base);
- /* should not return */
+ /* Should not return */
return false;
}
@@ -185,14 +189,14 @@
esr = read_esr_el1();
if (far == base) {
- /* return ESR to Host */
+ /* Return ESR to Host */
realm_shared_data_set_my_realm_val(HOST_ARG2_INDEX, esr);
rsi_exit_to_host(HOST_CALL_EXIT_SUCCESS_CMD);
}
- realm_printf("Realm Abort fail incorrect FAR=0x%lx ESR+0x%lx\n", far, esr);
+ realm_printf("Realm Abort fail incorrect FAR=0x%lx ESR=0x%lx\n", far, esr);
rsi_exit_to_host(HOST_CALL_EXIT_FAILED_CMD);
- /* Should not return. */
+ /* Should not return */
return false;
}
diff --git a/realm/realm_rsi.c b/realm/realm_rsi.c
index cd4342f..b2a49d4 100644
--- a/realm/realm_rsi.c
+++ b/realm/realm_rsi.c
@@ -22,7 +22,7 @@
if (res.ret0 == SMC_UNKNOWN) {
return SMC_UNKNOWN;
}
- /* Return lower version. */
+ /* Return lower version */
return res.ret1;
}
@@ -71,15 +71,19 @@
return res.ret0;
}
-/* This function will return RIPAS of IPA */
-u_register_t rsi_ipa_state_get(u_register_t adr, rsi_ripas_type *ripas)
+/* This function will return RIPAS of IPA range */
+u_register_t rsi_ipa_state_get(u_register_t base,
+ u_register_t top,
+ u_register_t *out_top,
+ rsi_ripas_type *ripas)
{
smc_ret_values res = {};
res = tftf_smc(&(smc_args)
- {RSI_IPA_STATE_GET, adr});
+ {RSI_IPA_STATE_GET, base, top});
if (res.ret0 == RSI_SUCCESS) {
- *ripas = res.ret1;
+ *out_top = res.ret1;
+ *ripas = res.ret2;
}
return res.ret0;
}