feat(rmm): pass RD pointer in arg0 register X1
This patch makes changes according to RMM Specification
1.0-eac1 for passing RD pointer in arg0 for RMI_DATA_CREATE,
RMI_DATA_CREATE_UNKNOWN, RMI_REC_CREATE and RMI_RTT_CREATE
commands.
Signed-off-by: AlexeiFedorov <Alexei.Fedorov@arm.com>
Change-Id: Idc1392b22874f26fce7f4e578a08a4125c68ce69
diff --git a/lib/smc/include/smc-rmi.h b/lib/smc/include/smc-rmi.h
index b1f5143..4313cd0 100644
--- a/lib/smc/include/smc-rmi.h
+++ b/lib/smc/include/smc-rmi.h
@@ -185,8 +185,8 @@
#define RMI_MEASURE_CONTENT 1
/*
- * arg0 == data address
- * arg1 == RD address
+ * arg0 == RD address
+ * arg1 == data address
* arg2 == map address
* arg3 == SRC address
* arg4 == flags
@@ -194,8 +194,8 @@
#define SMC_RMM_DATA_CREATE SMC64_RMI_FID(U(0x3))
/*
- * arg0 == data address
- * arg1 == RD address
+ * arg0 == RD address
+ * arg1 == data address
* arg2 == map address
*/
#define SMC_RMM_DATA_CREATE_UNKNOWN SMC64_RMI_FID(U(0x4))
@@ -213,7 +213,7 @@
/*
* arg0 == RD address
- * arg1 == struct rmi_realm_params addr
+ * arg1 == struct rmi_realm_params address
*/
#define SMC_RMM_REALM_CREATE SMC64_RMI_FID(U(0x8))
@@ -223,8 +223,8 @@
#define SMC_RMM_REALM_DESTROY SMC64_RMI_FID(U(0x9))
/*
- * arg0 == REC address
- * arg1 == RD address
+ * arg0 == RD address
+ * arg1 == REC address
* arg2 == struct rmm_rec address
*/
#define SMC_RMM_REC_CREATE SMC64_RMI_FID(U(0xA))
@@ -236,13 +236,13 @@
/*
* arg0 == rec address
- * arg1 == rec_run address
+ * arg1 == struct rec_run address
*/
#define SMC_RMM_REC_ENTER SMC64_RMI_FID(U(0xC))
/*
- * arg0 == RTT address
- * arg1 == RD address
+ * arg0 == RD address
+ * arg1 == RTT address
* arg2 == map address
* arg3 == level
*/
@@ -307,9 +307,9 @@
#define SMC_RMM_REC_AUX_COUNT SMC64_RMI_FID(U(0x17))
/*
- * arg1 == RD address
- * arg2 == map address
- * arg3 == level
+ * arg0 == RD address
+ * arg1 == map address
+ * arg2 == level
*/
#define SMC_RMM_RTT_INIT_RIPAS SMC64_RMI_FID(U(0x18))
diff --git a/plat/host/common/include/host_rmi_wrappers.h b/plat/host/common/include/host_rmi_wrappers.h
index 50326d1..70ad018 100644
--- a/plat/host/common/include/host_rmi_wrappers.h
+++ b/plat/host/common/include/host_rmi_wrappers.h
@@ -12,19 +12,19 @@
void host_rmi_granule_undelegate(void *granule_address, struct smc_result *ret);
void host_rmi_realm_create(void *rd, void *params_ptr, struct smc_result *ret);
void host_rmi_realm_destroy(void *rd, struct smc_result *ret);
-void host_rmi_rtt_create(void *rtt, void *rd, void *ipa,
+void host_rmi_rtt_create(void *rd, void *rtt, void *ipa,
unsigned int level, struct smc_result *ret);
void host_rmi_rtt_destroy(void *rtt, void *rd, void *ipa,
unsigned int level, struct smc_result *ret);
void host_rmi_rec_aux_count(void *rd, struct smc_result *ret);
-void host_rmi_rec_create(void *rec, void *rd, void *params_ptr,
+void host_rmi_rec_create(void *rd, void *rec, void *params_ptr,
struct smc_result *ret);
void host_rmi_rec_destroy(void *rec, struct smc_result *ret);
void host_rmi_realm_activate(void *rd, struct smc_result *ret);
void host_rmi_rec_enter(void *rec, void *run_ptr, struct smc_result *ret);
void host_rmi_data_create(uintptr_t data, void *rd, uintptr_t ipa,
uintptr_t src, struct smc_result *ret);
-void host_rmi_data_create_unknown(uintptr_t data, void *rd, uintptr_t ipa,
+void host_rmi_data_create_unknown(void *rd, uintptr_t data, uintptr_t ipa,
struct smc_result *ret);
void host_rmi_rtt_init_ripas(void *rd, uintptr_t ipa, int64_t level,
struct smc_result *ret);
diff --git a/plat/host/common/src/host_rmi_wrappers.c b/plat/host/common/src/host_rmi_wrappers.c
index e8a4a9a..a4d8cfd 100644
--- a/plat/host/common/src/host_rmi_wrappers.c
+++ b/plat/host/common/src/host_rmi_wrappers.c
@@ -48,11 +48,11 @@
ret);
}
-void host_rmi_rtt_create(void *rtt, void *rd, void *ipa, unsigned int level, struct smc_result *ret)
+void host_rmi_rtt_create(void *rd, void *rtt, void *ipa, unsigned int level, struct smc_result *ret)
{
handle_ns_smc(SMC_RMM_RTT_CREATE,
- (uintptr_t)rtt,
(uintptr_t)rd,
+ (uintptr_t)rtt,
(uintptr_t)ipa,
level,
0, 0,
@@ -79,11 +79,11 @@
ret);
}
-void host_rmi_rec_create(void *rec, void *rd, void *params_ptr, struct smc_result *ret)
+void host_rmi_rec_create(void *rd, void *rec, void *params_ptr, struct smc_result *ret)
{
handle_ns_smc(SMC_RMM_REC_CREATE,
- (uintptr_t)rec,
(uintptr_t)rd,
+ (uintptr_t)rec,
(uintptr_t)params_ptr,
0, 0, 0,
ret);
@@ -124,12 +124,12 @@
ret);
}
-void host_rmi_data_create_unknown(uintptr_t data, void *rd, uintptr_t ipa,
+void host_rmi_data_create_unknown(void *rd, uintptr_t data, uintptr_t ipa,
struct smc_result *ret)
{
handle_ns_smc(SMC_RMM_DATA_CREATE_UNKNOWN,
- (uintptr_t)data,
- (uintptr_t)rd, ipa,
+ (uintptr_t)rd,
+ (uintptr_t)data, ipa,
0, 0, 0,
ret);
}
diff --git a/plat/host/host_build/src/host_setup.c b/plat/host/host_build/src/host_setup.c
index 8f6c1b5..b380b85 100644
--- a/plat/host/host_build/src/host_setup.c
+++ b/plat/host/host_build/src/host_setup.c
@@ -165,7 +165,7 @@
/* Create RTT table to start at IPA 0x0 */
for (i = 1; i < RTT_COUNT; ++i) {
- host_rmi_rtt_create(rtts[i], rd, 0, i, &result);
+ host_rmi_rtt_create(rd, rtts[i], 0, i, &result);
CHECK_RMI_RESULT();
}
@@ -176,7 +176,7 @@
host_rmi_rtt_init_ripas(rd, REALM_BUFFER_IPA, 3, &result);
CHECK_RMI_RESULT();
- host_rmi_data_create_unknown(realm_buffer, rd, REALM_BUFFER_IPA, &result);
+ host_rmi_data_create_unknown(rd, realm_buffer, REALM_BUFFER_IPA, &result);
CHECK_RMI_RESULT();
host_rmi_rec_aux_count(rd, &result);
@@ -197,7 +197,7 @@
rec_params->flags |= REC_PARAMS_FLAG_RUNNABLE;
rec_params->pc = (uintptr_t)realm_start;
- host_rmi_rec_create(rec, rd, rec_params, &result);
+ host_rmi_rec_create(rd, rec, rec_params, &result);
CHECK_RMI_RESULT();
host_rmi_realm_activate(rd, &result);
CHECK_RMI_RESULT();
diff --git a/runtime/include/smc-handler.h b/runtime/include/smc-handler.h
index e9e49fc..390dc4c 100644
--- a/runtime/include/smc-handler.h
+++ b/runtime/include/smc-handler.h
@@ -13,14 +13,14 @@
void smc_read_feature_register(unsigned long index,
struct smc_result *ret_struct);
-unsigned long smc_data_create(unsigned long data_addr,
- unsigned long rd_addr,
+unsigned long smc_data_create(unsigned long rd_addr,
+ unsigned long data_addr,
unsigned long map_addr,
unsigned long src_addr,
unsigned long flags);
-unsigned long smc_data_create_unknown(unsigned long data_addr,
- unsigned long rd_addr,
+unsigned long smc_data_create_unknown(unsigned long rd_addr,
+ unsigned long data_addr,
unsigned long map_addr);
unsigned long smc_data_destroy(unsigned long rd_addr,
@@ -37,8 +37,8 @@
unsigned long smc_realm_destroy(unsigned long rd_addr);
-unsigned long smc_rec_create(unsigned long rec_addr,
- unsigned long rd_addr,
+unsigned long smc_rec_create(unsigned long rd_addr,
+ unsigned long rec_addr,
unsigned long rec_params_addr);
unsigned long smc_rec_destroy(unsigned long rec_addr);
@@ -49,8 +49,8 @@
void smc_rec_aux_count(unsigned long rd_addr,
struct smc_result *ret_struct);
-unsigned long smc_rtt_create(unsigned long rtt_addr,
- unsigned long rd_addr,
+unsigned long smc_rtt_create(unsigned long rd_addr,
+ unsigned long rtt_addr,
unsigned long map_addr,
unsigned long ulevel);
diff --git a/runtime/rmi/rec.c b/runtime/rmi/rec.c
index 84e292d..fd23252 100644
--- a/runtime/rmi/rec.c
+++ b/runtime/rmi/rec.c
@@ -184,8 +184,8 @@
}
}
-unsigned long smc_rec_create(unsigned long rec_addr,
- unsigned long rd_addr,
+unsigned long smc_rec_create(unsigned long rd_addr,
+ unsigned long rec_addr,
unsigned long rec_params_addr)
{
struct granule *g_rd;
diff --git a/runtime/rmi/rtt.c b/runtime/rmi/rtt.c
index df08dd5..ebcd395 100644
--- a/runtime/rmi/rtt.c
+++ b/runtime/rmi/rtt.c
@@ -78,8 +78,8 @@
return validate_map_addr(map_addr, level, rd);
}
-unsigned long smc_rtt_create(unsigned long rtt_addr,
- unsigned long rd_addr,
+unsigned long smc_rtt_create(unsigned long rd_addr,
+ unsigned long rtt_addr,
unsigned long map_addr,
unsigned long ulevel)
{
@@ -822,8 +822,8 @@
* if @g_src == NULL, this implemented Data.CreateUnknown
* and otherwise this implemented Data.Create.
*/
-static unsigned long data_create(unsigned long data_addr,
- unsigned long rd_addr,
+static unsigned long data_create(unsigned long rd_addr,
+ unsigned long data_addr,
unsigned long map_addr,
struct granule *g_src,
unsigned long flags)
@@ -926,14 +926,13 @@
return ret;
}
-unsigned long smc_data_create(unsigned long data_addr,
- unsigned long rd_addr,
+unsigned long smc_data_create(unsigned long rd_addr,
+ unsigned long data_addr,
unsigned long map_addr,
unsigned long src_addr,
unsigned long flags)
{
struct granule *g_src;
- unsigned long ret;
if (flags != RMI_NO_MEASURE_CONTENT && flags != RMI_MEASURE_CONTENT) {
return RMI_ERROR_INPUT;
@@ -944,16 +943,14 @@
return RMI_ERROR_INPUT;
}
- ret = data_create(data_addr, rd_addr, map_addr, g_src, flags);
-
- return ret;
+ return data_create(rd_addr, data_addr, map_addr, g_src, flags);
}
-unsigned long smc_data_create_unknown(unsigned long data_addr,
- unsigned long rd_addr,
+unsigned long smc_data_create_unknown(unsigned long rd_addr,
+ unsigned long data_addr,
unsigned long map_addr)
{
- return data_create(data_addr, rd_addr, map_addr, NULL, 0);
+ return data_create(rd_addr, data_addr, map_addr, NULL, 0);
}
unsigned long smc_data_destroy(unsigned long rd_addr,
@@ -1148,6 +1145,7 @@
rtt_walk_lock_unlock(g_rtt_root, sl, ipa_bits,
map_addr, level, &wi);
+
if (wi.last_level != level) {
ret = pack_return_code(RMI_ERROR_RTT, wi.last_level);
goto out_unlock_llt;