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/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;