feat(rmm): update API of data/rtt functions
This patch modifies API of RMI_DATA_DESTROY,
RMI_RTT_DESTROY and RMI_RTT_FOLD commands
according to RMM Specification 1.0-eac1.
Signed-off-by: AlexeiFedorov <Alexei.Fedorov@arm.com>
Change-Id: Id71a9a0524d767fcbdfd727d6ad3608e7be4e4b4
diff --git a/runtime/core/handler.c b/runtime/core/handler.c
index 49c6c8e..a38b56e 100644
--- a/runtime/core/handler.c
+++ b/runtime/core/handler.c
@@ -137,10 +137,10 @@
HANDLER(REC_ENTER, 2, 0, smc_rec_enter, false, true),
HANDLER(DATA_CREATE, 5, 0, smc_data_create, false, false),
HANDLER(DATA_CREATE_UNKNOWN, 3, 0, smc_data_create_unknown, false, false),
- HANDLER(DATA_DESTROY, 2, 0, smc_data_destroy, false, true),
+ HANDLER(DATA_DESTROY, 2, 2, smc_data_destroy, false, true),
HANDLER(RTT_CREATE, 4, 0, smc_rtt_create, false, true),
- HANDLER(RTT_DESTROY, 4, 0, smc_rtt_destroy, false, true),
- HANDLER(RTT_FOLD, 4, 0, smc_rtt_fold, false, true),
+ HANDLER(RTT_DESTROY, 3, 2, smc_rtt_destroy, false, true),
+ HANDLER(RTT_FOLD, 3, 1, smc_rtt_fold, false, true),
HANDLER(RTT_MAP_UNPROTECTED, 4, 0, smc_rtt_map_unprotected, false, false),
HANDLER(RTT_UNMAP_UNPROTECTED, 3, 0, smc_rtt_unmap_unprotected, false, false),
HANDLER(RTT_READ_ENTRY, 3, 4, smc_rtt_read_entry, false, true),
diff --git a/runtime/include/smc-handler.h b/runtime/include/smc-handler.h
index 390dc4c..b61c814 100644
--- a/runtime/include/smc-handler.h
+++ b/runtime/include/smc-handler.h
@@ -23,8 +23,9 @@
unsigned long data_addr,
unsigned long map_addr);
-unsigned long smc_data_destroy(unsigned long rd_addr,
- unsigned long map_addr);
+void smc_data_destroy(unsigned long rd_addr,
+ unsigned long map_addr,
+ struct smc_result *ret_struct);
unsigned long smc_granule_delegate(unsigned long addr);
@@ -33,7 +34,7 @@
unsigned long smc_realm_activate(unsigned long rd_addr);
unsigned long smc_realm_create(unsigned long rd_addr,
- unsigned long realm_params_addr);
+ unsigned long realm_params_addr);
unsigned long smc_realm_destroy(unsigned long rd_addr);
@@ -54,15 +55,15 @@
unsigned long map_addr,
unsigned long ulevel);
-unsigned long smc_rtt_destroy(unsigned long rtt_addr,
- unsigned long rd_addr,
- unsigned long map_addr,
- unsigned long ulevel);
+void smc_rtt_destroy(unsigned long rd_addr,
+ unsigned long map_addr,
+ unsigned long ulevel,
+ struct smc_result *ret_struct);
-unsigned long smc_rtt_fold(unsigned long rtt_addr,
- unsigned long rd_addr,
- unsigned long map_addr,
- unsigned long ulevel);
+void smc_rtt_fold(unsigned long rd_addr,
+ unsigned long map_addr,
+ unsigned long ulevel,
+ struct smc_result *ret_struct);
unsigned long smc_rtt_map_unprotected(unsigned long rd_addr,
unsigned long map_addr,
diff --git a/runtime/rmi/rtt.c b/runtime/rmi/rtt.c
index a0e3e1f..fbf4956 100644
--- a/runtime/rmi/rtt.c
+++ b/runtime/rmi/rtt.c
@@ -256,10 +256,10 @@
return ret;
}
-unsigned long smc_rtt_fold(unsigned long rtt_addr,
- unsigned long rd_addr,
- unsigned long map_addr,
- unsigned long ulevel)
+void smc_rtt_fold(unsigned long rd_addr,
+ unsigned long map_addr,
+ unsigned long ulevel,
+ struct smc_result *res)
{
struct granule *g_rd;
struct granule *g_tbl;
@@ -268,14 +268,15 @@
struct rtt_walk wi;
unsigned long *table, *parent_s2tt, parent_s2tte;
long level = (long)ulevel;
- unsigned long ipa_bits;
+ unsigned long ipa_bits, rtt_addr;
unsigned long ret;
struct realm_s2_context s2_ctx;
int sl;
g_rd = find_lock_granule(rd_addr, GRANULE_STATE_RD);
if (g_rd == NULL) {
- return RMI_ERROR_INPUT;
+ res->x[0] = RMI_ERROR_INPUT;
+ return;
}
rd = granule_map(g_rd, SLOT_RD);
@@ -283,7 +284,8 @@
if (!validate_rtt_structure_cmds(map_addr, level, rd)) {
buffer_unmap(rd);
granule_unlock(g_rd);
- return RMI_ERROR_INPUT;
+ res->x[0] = RMI_ERROR_INPUT;
+ return;
}
g_table_root = rd->s2_ctx.g_rtt;
@@ -309,16 +311,7 @@
goto out_unmap_parent_table;
}
- /*
- * Check that the 'rtt_addr' RTT is used at (map_addr, level).
- * Note that this also verifies that the rtt_addr is properly aligned.
- */
- if (rtt_addr != s2tte_pa_table(parent_s2tte, level - 1L)) {
- ret = pack_return_code(RMI_ERROR_RTT,
- (unsigned int)(level - 1L));
- goto out_unmap_parent_table;
- }
-
+ rtt_addr = s2tte_pa_table(parent_s2tte, level - 1L);
g_tbl = find_lock_granule(rtt_addr, GRANULE_STATE_RTT);
/*
@@ -409,6 +402,7 @@
}
ret = RMI_SUCCESS;
+ res->x[1] = rtt_addr;
/*
* Break before make.
@@ -434,13 +428,13 @@
buffer_unmap(parent_s2tt);
out_unlock_parent_table:
granule_unlock(wi.g_llt);
- return ret;
+ res->x[0] = ret;
}
-unsigned long smc_rtt_destroy(unsigned long rtt_addr,
- unsigned long rd_addr,
- unsigned long map_addr,
- unsigned long ulevel)
+void smc_rtt_destroy(unsigned long rd_addr,
+ unsigned long map_addr,
+ unsigned long ulevel,
+ struct smc_result *res)
{
struct granule *g_rd;
struct granule *g_tbl;
@@ -449,7 +443,7 @@
struct rtt_walk wi;
unsigned long *table, *parent_s2tt, parent_s2tte;
long level = (long)ulevel;
- unsigned long ipa_bits;
+ unsigned long ipa_bits, rtt_addr;
unsigned long ret;
struct realm_s2_context s2_ctx;
int sl;
@@ -457,7 +451,8 @@
g_rd = find_lock_granule(rd_addr, GRANULE_STATE_RD);
if (g_rd == NULL) {
- return RMI_ERROR_INPUT;
+ res->x[0] = RMI_ERROR_INPUT;
+ return;
}
rd = granule_map(g_rd, SLOT_RD);
@@ -465,7 +460,8 @@
if (!validate_rtt_structure_cmds(map_addr, level, rd)) {
buffer_unmap(rd);
granule_unlock(g_rd);
- return RMI_ERROR_INPUT;
+ res->x[0] = RMI_ERROR_INPUT;
+ return;
}
g_table_root = rd->s2_ctx.g_rtt;
@@ -492,14 +488,7 @@
goto out_unmap_parent_table;
}
- /*
- * Check that the 'rtt_addr' RTT is used at (map_addr, level).
- * Note that this also verifies that the rtt_addr is properly aligned.
- */
- if (rtt_addr != s2tte_pa_table(parent_s2tte, level - 1L)) {
- ret = RMI_ERROR_INPUT;
- goto out_unmap_parent_table;
- }
+ rtt_addr = s2tte_pa_table(parent_s2tte, level - 1L);
/*
* Lock the RTT granule. The 'rtt_addr' is verified, thus can be treated
@@ -522,6 +511,7 @@
}
ret = RMI_SUCCESS;
+ res->x[1] = rtt_addr;
table = granule_map(g_tbl, SLOT_RTT2);
@@ -550,7 +540,7 @@
buffer_unmap(parent_s2tt);
out_unlock_parent_table:
granule_unlock(wi.g_llt);
- return ret;
+ res->x[0] = ret;
}
enum map_unmap_ns_op {
@@ -958,8 +948,9 @@
return data_create(rd_addr, data_addr, map_addr, NULL, 0);
}
-unsigned long smc_data_destroy(unsigned long rd_addr,
- unsigned long map_addr)
+void smc_data_destroy(unsigned long rd_addr,
+ unsigned long map_addr,
+ struct smc_result *res)
{
struct granule *g_data;
struct granule *g_rd;
@@ -967,14 +958,14 @@
struct rtt_walk wi;
unsigned long data_addr, s2tte, *s2tt;
struct rd *rd;
- unsigned long ipa_bits;
- unsigned long ret;
+ unsigned long ipa_bits, ret;
struct realm_s2_context s2_ctx;
int sl;
g_rd = find_lock_granule(rd_addr, GRANULE_STATE_RD);
if (g_rd == NULL) {
- return RMI_ERROR_INPUT;
+ res->x[0] = RMI_ERROR_INPUT;
+ return;
}
rd = granule_map(g_rd, SLOT_RD);
@@ -982,7 +973,8 @@
if (!validate_map_addr(map_addr, RTT_PAGE_LEVEL, rd)) {
buffer_unmap(rd);
granule_unlock(g_rd);
- return RMI_ERROR_INPUT;
+ res->x[0] = RMI_ERROR_INPUT;
+ return;
}
g_table_root = rd->s2_ctx.g_rtt;
@@ -1032,13 +1024,13 @@
granule_unlock_transition(g_data, GRANULE_STATE_DELEGATED);
ret = RMI_SUCCESS;
+ res->x[1] = data_addr;
out_unmap_ll_table:
buffer_unmap(s2tt);
out_unlock_ll_table:
granule_unlock(wi.g_llt);
-
- return ret;
+ res->x[0] = ret;
}
/*