feat(rmi): add support for FEAT_LPA2 to the Realm Extension tests
This patch adds support to the current Realm Extension tests to
enable and use 52 bit address size with 4KB granularity when
FEAT_LPA2 is present.
In addition, this patch also introduces changes to support passing the
starting RTT level and the FEAT_LPA2 enable flag during realm creation
so they can be used later to implement tests for FEAT_LPA2 on RMI.
Signed-off-by: Javier Almansa Sobrino <javier.almansasobrino@arm.com>
Change-Id: I0a930735a44772e5e76d6608c969759f27129917
diff --git a/include/lib/xlat_tables/xlat_tables_defs.h b/include/lib/xlat_tables/xlat_tables_defs.h
index ba0559c..c9b91cc 100644
--- a/include/lib/xlat_tables/xlat_tables_defs.h
+++ b/include/lib/xlat_tables/xlat_tables_defs.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2022, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2024, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -196,7 +196,7 @@
* For Normal WB cacheability attribute, set bit[4] to 1 and bits[3:2] to 0b10.
*/
#define S2TTE_MEMATTR_FWB_NORMAL_WB ((1UL << 4) | (2UL << 2))
-#define S2TTE_ATTR_FWB_WB_RW (S2TTE_MEMATTR_FWB_NORMAL_WB | S2TTE_AP_RW | \
- S2TTE_SH_IS)
+#define S2TTE_ATTR_FWB_WB_RW_LPA2 (S2TTE_MEMATTR_FWB_NORMAL_WB | S2TTE_AP_RW)
+#define S2TTE_ATTR_FWB_WB_RW (S2TTE_ATTR_FWB_WB_RW_LPA2 | S2TTE_SH_IS)
#endif /* XLAT_TABLES_DEFS_H */
diff --git a/include/runtime_services/host_realm_managment/host_realm_helper.h b/include/runtime_services/host_realm_managment/host_realm_helper.h
index ae5f461..c654877 100644
--- a/include/runtime_services/host_realm_managment/host_realm_helper.h
+++ b/include/runtime_services/host_realm_managment/host_realm_helper.h
@@ -18,6 +18,7 @@
u_register_t plat_mem_pool_adr,
u_register_t realm_pages_size,
u_register_t feature_flag,
+ long sl,
const u_register_t *rec_flag,
unsigned int rec_count);
@@ -30,6 +31,7 @@
u_register_t plat_mem_pool_adr,
u_register_t realm_pages_size,
u_register_t feature_flag,
+ long sl,
const u_register_t *rec_flag,
unsigned int rec_count);
@@ -42,6 +44,7 @@
u_register_t plat_mem_pool_adr,
u_register_t realm_pages_size,
u_register_t feature_flag,
+ long sl,
const u_register_t *rec_flag,
unsigned int rec_count);
bool host_create_shared_mem(struct realm *realm_ptr,
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 59abdb5..78fc6c1 100644
--- a/include/runtime_services/host_realm_managment/host_realm_rmi.h
+++ b/include/runtime_services/host_realm_managment/host_realm_rmi.h
@@ -344,7 +344,9 @@
#define RMI_RETURN_STATUS(ret) ((ret) & 0xFF)
#define RMI_RETURN_INDEX(ret) (((ret) >> 8U) & 0xFF)
-#define RTT_MAX_LEVEL 3U
+#define RTT_MAX_LEVEL (3L)
+#define RTT_MIN_LEVEL (0L)
+#define RTT_MIN_LEVEL_LPA2 (-1L)
#define ALIGN_DOWN(x, a) ((uint64_t)(x) & ~(((uint64_t)(a)) - 1ULL))
#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a)-1U)) == 0U)
#define PAGE_SHIFT FOUR_KB_SHIFT
@@ -358,6 +360,19 @@
#define REC_GIC_NUM_LRS 16U
/*
+ * When FEAT_LPA2 is enabled bits [51:50] of the OA are not
+ * contiguous to the rest of the OA.
+ */
+
+#define TTE_OA_50_51_SHIFT ULL(8)
+#define TTE_OA_50_51_WIDTH ULL(2)
+
+/* Bitfields for the 2 MSBs on an OA */
+#define OA_50_51_SHIFT ULL(50)
+#define OA_50_51_WIDTH TTE_OA_50_51_WIDTH
+#define OA_50_51_MASK MASK(OA_50_51)
+
+/*
* The Realm attribute parameters are shared by the Host via
* RMI_REALM_CREATE::params_ptr. The values can be observed or modified
* either by the Host or by the Realm.
@@ -504,7 +519,7 @@
};
struct rtt_entry {
- uint64_t walk_level;
+ long walk_level;
uint64_t out_addr;
u_register_t state;
u_register_t ripas;
@@ -542,6 +557,7 @@
bool shared_mem_created;
unsigned short vmid;
enum realm_state state;
+ long start_level;
};
/* RMI/SMC */
@@ -557,11 +573,11 @@
u_register_t *top);
u_register_t host_rmi_rtt_readentry(u_register_t rd,
u_register_t map_addr,
- u_register_t level,
+ long level,
struct rtt_entry *rtt);
u_register_t host_rmi_rtt_destroy(u_register_t rd,
u_register_t map_addr,
- u_register_t level,
+ long level,
u_register_t *rtt,
u_register_t *top);
u_register_t host_rmi_rtt_init_ripas(u_register_t rd,
@@ -570,11 +586,10 @@
u_register_t *top);
u_register_t host_rmi_create_rtt_levels(struct realm *realm,
u_register_t map_addr,
- u_register_t level,
- u_register_t max_level);
+ long level, long max_level);
u_register_t host_rmi_rtt_unmap_unprotected(u_register_t rd,
u_register_t map_addr,
- u_register_t level,
+ long level,
u_register_t *top);
u_register_t host_rmi_rtt_set_ripas(u_register_t rd,
u_register_t rec,
@@ -601,7 +616,7 @@
u_register_t *exit_reason,
unsigned int *host_call_result,
unsigned int rec_num);
-u_register_t host_realm_init_ipa_state(struct realm *realm, u_register_t level,
+u_register_t host_realm_init_ipa_state(struct realm *realm, long level,
u_register_t start, uint64_t end);
u_register_t host_realm_delegate_map_protected_data(bool unknown,
struct realm *realm,
@@ -610,6 +625,6 @@
u_register_t src_pa);
u_register_t host_realm_map_unprotected(struct realm *realm, u_register_t ns_pa,
u_register_t map_size);
-u_register_t host_realm_fold_rtt(u_register_t rd, u_register_t addr, u_register_t level);
+u_register_t host_realm_fold_rtt(u_register_t rd, u_register_t addr, long level);
#endif /* HOST_REALM_RMI_H */
diff --git a/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c b/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
index 2c58919..28df45d 100644
--- a/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
+++ b/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
@@ -106,12 +106,13 @@
}
bool host_prepare_realm_payload(struct realm *realm_ptr,
- u_register_t realm_payload_adr,
- u_register_t plat_mem_pool_adr,
- u_register_t realm_pages_size,
- u_register_t feature_flag,
- const u_register_t *rec_flag,
- unsigned int rec_count)
+ u_register_t realm_payload_adr,
+ u_register_t plat_mem_pool_adr,
+ u_register_t realm_pages_size,
+ u_register_t feature_flag,
+ long sl,
+ const u_register_t *rec_flag,
+ unsigned int rec_count)
{
int8_t value;
@@ -166,18 +167,6 @@
EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ, feature_flag));
}
- /*
- * At the moment, TFTF does not have support for FEAT_LPA2, so if
- * S2SZ is larger than 48 bits, truncate it to ensure we don't surpass
- * the maximum IPA size for a realm with no LPA2 support.
- */
- if (EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ, realm_ptr->rmm_feat_reg0) > 48U) {
- realm_ptr->rmm_feat_reg0 &=
- ~MASK(RMI_FEATURE_REGISTER_0_S2SZ);
- realm_ptr->rmm_feat_reg0 |=
- INPLACE(RMI_FEATURE_REGISTER_0_S2SZ, 48U);
- }
-
/* Disable PMU if not required */
if ((feature_flag & RMI_FEATURE_REGISTER_0_PMU_EN) == 0UL) {
realm_ptr->rmm_feat_reg0 &= ~RMI_FEATURE_REGISTER_0_PMU_EN;
@@ -244,6 +233,17 @@
}
}
+ /*
+ * Force FEAT_LPA2 to the selected configuration.
+ */
+ if ((feature_flag & RMI_FEATURE_REGISTER_0_LPA2) == 0ULL) {
+ realm_ptr->rmm_feat_reg0 &= ~RMI_FEATURE_REGISTER_0_LPA2;
+ } else {
+ realm_ptr->rmm_feat_reg0 |= RMI_FEATURE_REGISTER_0_LPA2;
+ }
+
+ realm_ptr->start_level = sl;
+
/* Create Realm */
if (host_realm_create(realm_ptr) != REALM_SUCCESS) {
ERROR("%s() failed\n", "host_realm_create");
@@ -276,6 +276,7 @@
u_register_t plat_mem_pool_adr,
u_register_t realm_pages_size,
u_register_t feature_flag,
+ long sl,
const u_register_t *rec_flag,
unsigned int rec_count)
{
@@ -286,6 +287,7 @@
plat_mem_pool_adr,
realm_pages_size,
feature_flag,
+ sl,
rec_flag,
rec_count);
if (!ret) {
@@ -297,8 +299,8 @@
goto destroy_realm;
}
- if (host_realm_init_ipa_state(realm_ptr, 0U, 0U, 1ULL << 32)
- != RMI_SUCCESS) {
+ if (host_realm_init_ipa_state(realm_ptr, realm_ptr->start_level,
+ 0U, 1ULL << 32) != RMI_SUCCESS) {
ERROR("%s() failed\n", "host_realm_init_ipa_state");
goto destroy_realm;
}
@@ -318,6 +320,7 @@
u_register_t plat_mem_pool_adr,
u_register_t realm_pages_size,
u_register_t feature_flag,
+ long sl,
const u_register_t *rec_flag,
unsigned int rec_count)
@@ -329,6 +332,7 @@
plat_mem_pool_adr,
realm_pages_size,
feature_flag,
+ sl,
rec_flag,
rec_count);
if (!ret) {
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 22717e5..a99fcd5 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
@@ -8,6 +8,8 @@
#include <assert.h>
#include <string.h>
+#include <arch_features.h>
+
#include <debug.h>
#include <heap/page_alloc.h>
#include <test_helpers.h>
@@ -18,6 +20,7 @@
#include <plat/common/platform.h>
#include <realm_def.h>
#include <tftf_lib.h>
+#include <utils_def.h>
#define SET_ARG(_n) { \
case _n: \
@@ -173,22 +176,23 @@
static inline u_register_t host_rmi_rtt_create(u_register_t rd,
u_register_t rtt,
u_register_t map_addr,
- u_register_t level)
+ long level)
{
return host_rmi_handler(&(smc_args) {RMI_RTT_CREATE,
- rd, rtt, map_addr, level}, 5U).ret0;
+ rd, rtt, map_addr, (u_register_t)level}, 5U).ret0;
}
u_register_t host_rmi_rtt_destroy(u_register_t rd,
u_register_t map_addr,
- u_register_t level,
+ long level,
u_register_t *rtt,
u_register_t *top)
{
smc_ret_values rets;
rets = host_rmi_handler(&(smc_args) {RMI_RTT_DESTROY,
- rd, map_addr, level, (u_register_t)&rets}, 5U);
+ rd, map_addr, (u_register_t)level,
+ (u_register_t)&rets}, 5U);
*rtt = rets.ret1;
*top = rets.ret2;
return rets.ret0;
@@ -225,13 +229,14 @@
*/
static inline u_register_t host_rmi_rtt_fold(u_register_t rd,
u_register_t map_addr,
- u_register_t level,
+ long level,
u_register_t *pa)
{
smc_ret_values rets;
rets = host_rmi_handler(&(smc_args) {RMI_RTT_FOLD,
- rd, map_addr, level, (u_register_t)&rets}, 5U);
+ rd, map_addr, (u_register_t)level,
+ (u_register_t)&rets}, 5U);
*pa = rets.ret1;
return rets.ret0;
}
@@ -262,23 +267,23 @@
u_register_t host_rmi_rtt_mapunprotected(u_register_t rd,
u_register_t map_addr,
- u_register_t level,
+ long level,
u_register_t ns_pa)
{
return host_rmi_handler(&(smc_args) {RMI_RTT_MAP_UNPROTECTED,
- rd, map_addr, level, ns_pa}, 5U).ret0;
+ rd, map_addr, (u_register_t)level, ns_pa}, 5U).ret0;
}
u_register_t host_rmi_rtt_readentry(u_register_t rd,
u_register_t map_addr,
- u_register_t level,
+ long level,
struct rtt_entry *rtt)
{
smc_ret_values rets;
rets = host_rmi_handler(&(smc_args) {RMI_RTT_READ_ENTRY,
- rd, map_addr, level}, 4U);
- rtt->walk_level = rets.ret1;
+ rd, map_addr, (u_register_t)level}, 4U);
+ rtt->walk_level = (long)rets.ret1;
rtt->state = rets.ret2;
rtt->out_addr = rets.ret3;
rtt->ripas = rets.ret4;
@@ -287,13 +292,13 @@
u_register_t host_rmi_rtt_unmap_unprotected(u_register_t rd,
u_register_t map_addr,
- u_register_t level,
+ long level,
u_register_t *top)
{
smc_ret_values rets;
rets = host_rmi_handler(&(smc_args) {RMI_RTT_UNMAP_UNPROTECTED,
- rd, map_addr, level}, 4U);
+ rd, map_addr, (u_register_t)level}, 4U);
*top = rets.ret1;
return rets.ret0;
}
@@ -305,17 +310,16 @@
static inline u_register_t host_realm_rtt_create(struct realm *realm,
u_register_t addr,
- u_register_t level,
+ long level,
u_register_t phys)
{
- addr = ALIGN_DOWN(addr, RTT_MAP_SIZE(level - 1U));
+ addr = ALIGN_DOWN(addr, RTT_MAP_SIZE(level - 1));
return host_rmi_rtt_create(realm->rd, phys, addr, level);
}
u_register_t host_rmi_create_rtt_levels(struct realm *realm,
u_register_t map_addr,
- u_register_t level,
- u_register_t max_level)
+ long level, long max_level)
{
u_register_t rtt, ret;
@@ -332,7 +336,7 @@
return REALM_ERROR;
}
}
- ret = host_realm_rtt_create(realm, map_addr, level, rtt);
+ ret = host_realm_rtt_create(realm, map_addr, (u_register_t)level, rtt);
if (ret != RMI_SUCCESS) {
ERROR("%s() failed, rtt=0x%lx ret=0x%lx\n",
"host_realm_rtt_create", rtt, ret);
@@ -346,7 +350,7 @@
}
u_register_t host_realm_fold_rtt(u_register_t rd, u_register_t addr,
- u_register_t level)
+ long level)
{
u_register_t pa, ret;
@@ -380,7 +384,7 @@
u_register_t src_pa)
{
u_register_t rd = realm->rd;
- u_register_t level;
+ int8_t level;
u_register_t ret = 0UL;
u_register_t size = 0UL;
u_register_t phys = target_pa;
@@ -403,7 +407,8 @@
if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {
/* Create missing RTTs till L3 and retry */
level = RMI_RETURN_INDEX(ret);
- ret = host_rmi_create_rtt_levels(realm, map_addr, level,
+ ret = host_rmi_create_rtt_levels(realm, map_addr,
+ (u_register_t)level,
3U);
if (ret != RMI_SUCCESS) {
ERROR("%s() failed, ret=0x%lx line=%u\n",
@@ -458,7 +463,9 @@
u_register_t map_size)
{
u_register_t rd = realm->rd;
- u_register_t map_level, level;
+ long map_level;
+ u_register_t desc;
+ int8_t level;
u_register_t ret = 0UL;
u_register_t phys = ns_pa;
u_register_t map_addr = ns_pa |
@@ -483,15 +490,22 @@
ERROR("Unknown map_size=0x%lx\n", map_size);
return REALM_ERROR;
}
- u_register_t desc = phys | S2TTE_ATTR_FWB_WB_RW;
+
+ if ((realm->rmm_feat_reg0 & RMI_FEATURE_REGISTER_0_LPA2) != 0L) {
+ desc = (phys & ~OA_50_51_MASK) |
+ INPLACE(TTE_OA_50_51, EXTRACT(OA_50_51, phys));
+ desc |= S2TTE_ATTR_FWB_WB_RW_LPA2;
+ } else {
+ desc = phys | S2TTE_ATTR_FWB_WB_RW;
+ }
ret = host_rmi_rtt_mapunprotected(rd, map_addr, map_level, desc);
if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {
/* Create missing RTTs and retry */
level = RMI_RETURN_INDEX(ret);
- ret = host_rmi_create_rtt_levels(realm, map_addr, level,
- map_level);
+ ret = host_rmi_create_rtt_levels(realm, map_addr,
+ level, map_level);
if (ret != RMI_SUCCESS) {
ERROR("%s() failed, ret=0x%lx line=%u\n",
"host_rmi_create_rtt_levels", ret, __LINE__);
@@ -512,17 +526,17 @@
static u_register_t host_realm_rtt_destroy(struct realm *realm,
u_register_t addr,
- u_register_t level,
+ long level,
u_register_t *rtt,
u_register_t *top)
{
- addr = ALIGN_DOWN(addr, RTT_MAP_SIZE(level - 1U));
+ addr = ALIGN_DOWN(addr, RTT_MAP_SIZE(level - 1L));
return host_rmi_rtt_destroy(realm->rd, addr, level, rtt, top);
}
static u_register_t host_realm_destroy_free_rtt(struct realm *realm,
u_register_t addr,
- u_register_t level,
+ long level,
u_register_t rtt_granule)
{
u_register_t rtt, top, ret;
@@ -579,7 +593,7 @@
}
static u_register_t host_realm_tear_down_rtt_range(struct realm *realm,
- u_register_t level,
+ long level,
u_register_t start,
u_register_t end)
{
@@ -633,7 +647,7 @@
case RMI_UNASSIGNED:
break;
case RMI_TABLE:
- ret = host_realm_tear_down_rtt_range(realm, level + 1U,
+ ret = host_realm_tear_down_rtt_range(realm, level + 1L,
map_addr,
end_addr);
if (ret != RMI_SUCCESS) {
@@ -644,7 +658,7 @@
}
ret = host_realm_destroy_free_rtt(realm, map_addr,
- level + 1U,
+ level + 1L,
rtt_out_addr);
if (ret != RMI_SUCCESS) {
ERROR("%s() failed, map_addr=0x%lx ret=0x%lx\n",
@@ -760,10 +774,15 @@
params->pmu_num_ctrs = 0U;
}
+ /* LPA2 enable */
+ if ((realm->rmm_feat_reg0 & RMI_FEATURE_REGISTER_0_LPA2) != 0UL) {
+ params->flags |= RMI_REALM_FLAGS_LPA2;
+ }
+
+ params->rtt_level_start = realm->start_level;
params->hash_algo = RMI_HASH_SHA_256;
params->vmid = vmid++;
params->rtt_base = realm->rtt_addr;
- params->rtt_level_start = 0L;
params->rtt_num_start = 1U;
/* Create Realm */
@@ -842,7 +861,7 @@
return REALM_SUCCESS;
}
-u_register_t host_realm_init_ipa_state(struct realm *realm, u_register_t level,
+u_register_t host_realm_init_ipa_state(struct realm *realm, long level,
u_register_t start, uint64_t end)
{
u_register_t rd = realm->rd, ret;
@@ -855,9 +874,9 @@
ret = host_rmi_rtt_init_ripas(rd, start, end, &top);
if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {
- int cur_level = RMI_RETURN_INDEX(ret);
+ int8_t cur_level = RMI_RETURN_INDEX(ret);
- if (cur_level < level) {
+ if ((int)cur_level < level) {
ret = host_rmi_create_rtt_levels(realm,
start,
cur_level,
@@ -1074,6 +1093,7 @@
u_register_t host_realm_destroy(struct realm *realm)
{
u_register_t ret;
+ long rtt_start_level = realm->start_level;
if (realm->state == REALM_STATE_NULL) {
return REALM_SUCCESS;
@@ -1114,14 +1134,16 @@
* using RMI_DATA_DESTROY, RMI_RTT_DESTROY and RMI_GRANULE_UNDELEGATE
* commands.
*/
- if (host_realm_tear_down_rtt_range(realm, 0UL, 0UL,
+ if (host_realm_tear_down_rtt_range(realm, rtt_start_level, 0UL,
(1UL << (EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ,
- realm->rmm_feat_reg0) - 1))) != RMI_SUCCESS) {
+ realm->rmm_feat_reg0) - 1UL))) != RMI_SUCCESS) {
ERROR("host_realm_tear_down_rtt_range() line=%u\n", __LINE__);
return REALM_ERROR;
}
+
if (realm->shared_mem_created == true) {
- if (host_realm_tear_down_rtt_range(realm, 0UL, realm->ipa_ns_buffer,
+ if (host_realm_tear_down_rtt_range(realm, rtt_start_level,
+ realm->ipa_ns_buffer,
(realm->ipa_ns_buffer + realm->ns_buffer_size)) !=
RMI_SUCCESS) {
ERROR("host_realm_tear_down_rtt_range() line=%u\n", __LINE__);
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
index 4774dfc..81294cd 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
@@ -32,13 +32,20 @@
bool ret1, ret2;
u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE};
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, MAX_REC_COUNT)) {
+ feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -86,15 +93,22 @@
u_register_t exit_reason;
unsigned int rec_num;
struct rmi_rec_run *run;
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
/* Create 3 rec Rec 0 and 2 are runnable, Rec 1 in not runnable */
u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_NOT_RUNNABLE, RMI_RUNNABLE};
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 3U)) {
+ feature_flag, sl, rec_flag, 3U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -225,6 +239,8 @@
unsigned int rec_count = MAX_REC_COUNT;
u_register_t other_mpidr, my_mpidr, ret;
int cpu_node;
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
RMI_RUNNABLE};
@@ -232,10 +248,15 @@
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
SKIP_TEST_IF_LESS_THAN_N_CPUS(rec_count);
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, rec_count)) {
+ feature_flag, sl, rec_flag, rec_count)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -327,14 +348,21 @@
RMI_NOT_RUNNABLE};
u_register_t exit_reason;
int cpu_node;
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
SKIP_TEST_IF_LESS_THAN_N_CPUS(MAX_REC_COUNT);
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, MAX_REC_COUNT)) {
+ feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -457,6 +485,8 @@
struct rmi_rec_run *run;
unsigned int host_call_result;
struct realm realm2;
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_NOT_RUNNABLE, RMI_NOT_RUNNABLE,
RMI_NOT_RUNNABLE, RMI_NOT_RUNNABLE, RMI_NOT_RUNNABLE, RMI_NOT_RUNNABLE,
RMI_NOT_RUNNABLE};
@@ -464,17 +494,22 @@
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, MAX_REC_COUNT)) {
+ feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
return TEST_RESULT_FAIL;
}
if (!host_create_activate_realm_payload(&realm2, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE + PAGE_POOL_MAX_SIZE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
ret2 = host_destroy_realm(&realm);
return TEST_RESULT_FAIL;
}
@@ -590,7 +625,7 @@
*/
test_result_t host_realm_pmuv3_mul_rec(void)
{
- u_register_t feature_flag;
+ u_register_t feature_flag = 0U;
u_register_t rmm_feat_reg0;
u_register_t rec_flag[8U] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE};
@@ -598,9 +633,15 @@
unsigned int num_cnts, i = 0U;
u_register_t other_mpidr, my_mpidr, ret;
int cpu_node;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
/* Get Max PMU counter implemented through RMI_FEATURES */
if (host_rmi_features(0UL, &rmm_feat_reg0) != REALM_SUCCESS) {
ERROR("%s() failed\n", "host_rmi_features");
@@ -617,15 +658,14 @@
return TEST_RESULT_SKIPPED;
}
- feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
+ feature_flag |= RMI_FEATURE_REGISTER_0_PMU_EN |
INPLACE(FEATURE_PMU_NUM_CTRS, num_cnts + 1U);
-
/* Request more PMU counter than total, expect failure */
if (host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- feature_flag, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
ERROR("Realm create should have failed\n");
host_destroy_realm(&realm);
return TEST_RESULT_FAIL;
@@ -635,10 +675,14 @@
feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
INPLACE(FEATURE_PMU_NUM_CTRS, 0U);
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag |= RMI_FEATURE_REGISTER_0_LPA2;
+ }
+
ret1 = host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- feature_flag, rec_flag, 1U);
+ feature_flag, sl, rec_flag, 1U);
if (!get_feat_hpmn0_supported()) {
if (ret1) {
@@ -658,11 +702,15 @@
feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
INPLACE(FEATURE_PMU_NUM_CTRS, num_cnts);
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag |= RMI_FEATURE_REGISTER_0_LPA2;
+ }
+
/* Prepare realm0, create recs for realm0 later */
if (!host_prepare_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- feature_flag, rec_flag, MAX_REC_COUNT)) {
+ feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
goto test_exit;
return TEST_RESULT_FAIL;
}
@@ -675,10 +723,14 @@
feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
INPLACE(FEATURE_PMU_NUM_CTRS, num_cnts - 1U);
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag |= RMI_FEATURE_REGISTER_0_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm1, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE + PAGE_POOL_MAX_SIZE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- feature_flag, rec_flag, MAX_REC_COUNT)) {
+ feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
goto test_exit2;
}
if (!host_create_shared_mem(&realm1, NS_REALM_SHARED_MEM_BASE + NS_REALM_SHARED_MEM_SIZE,
@@ -692,7 +744,7 @@
goto test_exit2;
}
- if (host_realm_init_ipa_state(&realm, 0U, 0U, 1ULL << 32)
+ if (host_realm_init_ipa_state(&realm, sl, 0U, 1ULL << 32)
!= RMI_SUCCESS) {
ERROR("%s() failed\n", "host_realm_init_ipa_state");
goto test_exit2;
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c
index c190985..44b872f 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c
@@ -88,14 +88,18 @@
static test_result_t host_create_sve_realm_payload(bool sve_en, uint8_t sve_vq)
{
- u_register_t feature_flag;
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
u_register_t rec_flag[1] = {RMI_RUNNABLE};
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (sve_en) {
- feature_flag = RMI_FEATURE_REGISTER_0_SVE_EN |
+ feature_flag |= RMI_FEATURE_REGISTER_0_SVE_EN |
INPLACE(FEATURE_SVE_VL, sve_vq);
- } else {
- feature_flag = 0UL;
}
/* Initialise Realm payload */
@@ -103,7 +107,7 @@
(u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- feature_flag, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
return TEST_RESULT_FAIL;
}
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 25c65de..34ff786 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
@@ -38,14 +38,21 @@
bool ret1, ret2;
u_register_t rec_flag[1] = {RMI_RUNNABLE};
struct realm realm;
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
for (unsigned int i = 0U; i < 5U; i++) {
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -75,13 +82,20 @@
bool ret1, ret2;
u_register_t rec_flag[] = {RMI_RUNNABLE};
struct realm realm;
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -114,14 +128,21 @@
u_register_t rec_flag[MAX_REC_COUNT] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,};
struct realm realm;
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
pauth_test_lib_fill_regs_and_template(pauth_keys_before);
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, MAX_REC_COUNT)) {
+ feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
return TEST_RESULT_FAIL;
}
@@ -177,12 +198,19 @@
bool ret1, ret2;
u_register_t rec_flag[1] = {RMI_RUNNABLE};
struct realm realm;
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
+
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -265,6 +293,7 @@
{
struct realm realm;
u_register_t feature_flag;
+ long sl = RTT_MIN_LEVEL;
u_register_t rec_flag[1] = {RMI_RUNNABLE};
bool ret1, ret2;
@@ -275,10 +304,16 @@
feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
INPLACE(FEATURE_PMU_NUM_CTRS, (unsigned long long)(-1));
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag |= RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- feature_flag, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -375,13 +410,20 @@
bool ret1, ret2, ret3;
u_register_t rec_flag[1] = {RMI_RUNNABLE};
struct realm realm1, realm2;
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm1, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
return TEST_RESULT_FAIL;
}
@@ -389,7 +431,7 @@
if (!host_create_activate_realm_payload(&realm2, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE + PAGE_POOL_MAX_SIZE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
ret2 = host_destroy_realm(&realm1);
return TEST_RESULT_FAIL;
}
@@ -450,13 +492,20 @@
struct rmi_rec_run *run;
u_register_t rec_flag[1] = {RMI_RUNNABLE};
u_register_t test_page_num = 3U;
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -548,13 +597,20 @@
struct realm realm;
struct rmi_rec_run *run;
u_register_t rec_flag[1] = {RMI_RUNNABLE}, base;
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -618,14 +674,21 @@
struct realm realm;
struct rmi_rec_run *run;
struct rtt_entry rtt;
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 2U)) {
+ feature_flag, sl, rec_flag, 2U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -646,7 +709,7 @@
ERROR("host_realm_delegate_map_protected_data failed\n");
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
(rtt.ripas != RMI_RAM)) {
ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -662,7 +725,7 @@
ERROR("host_rmi_data_destroy failed\n");
goto undelegate_destroy;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
rtt.ripas != RMI_DESTROYED) {
ERROR("Wrong state after host_rmi_data_destroy\n");
@@ -742,15 +805,22 @@
struct realm realm;
struct rmi_rec_run *run;
struct rtt_entry rtt;
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
test_result_t res = TEST_RESULT_FAIL;
u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 2U)) {
+ feature_flag, sl, rec_flag, 2U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -775,7 +845,7 @@
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
(rtt.ripas != RMI_RAM)) {
ERROR("wrong initial state\n");
@@ -851,14 +921,21 @@
struct realm realm;
struct rmi_rec_run *run;
struct rtt_entry rtt;
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 2U)) {
+ feature_flag, sl, rec_flag, 2U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -876,7 +953,7 @@
ERROR("host_realm_delegate_map_protected_data failed\n");
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
(rtt.ripas != RMI_RAM)) {
ERROR("wrong state after data create\n");
@@ -897,7 +974,7 @@
ERROR("host_rmi_data_destroy failed\n");
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
rtt.ripas != RMI_DESTROYED) {
ERROR("Wrong state after host_rmi_data_destroy\n");
@@ -911,7 +988,7 @@
ERROR("host_realm_delegate_map_protected_data failede\n");
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
(rtt.ripas != RMI_DESTROYED)) {
ERROR("wrong state after data create unknown\n");
@@ -985,14 +1062,21 @@
u_register_t ret, base, esr;
struct realm realm;
struct rtt_entry rtt;
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE};
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 4U)) {
+ feature_flag, sl, rec_flag, 4U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1002,7 +1086,7 @@
base = (u_register_t)page_alloc(PAGE_SIZE);
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (rtt.state != RMI_UNASSIGNED ||
(rtt.ripas != RMI_EMPTY)) {
ERROR("wrong initial state\n");
@@ -1051,7 +1135,7 @@
ERROR("host_realm_delegate_map_protected_data failed\n");
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (rtt.state != RMI_ASSIGNED ||
(rtt.ripas != RMI_EMPTY)) {
ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -1126,14 +1210,21 @@
struct realm realm;
struct rtt_entry rtt;
struct rmi_rec_run *run;
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE};
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 2U)) {
+ feature_flag, sl, rec_flag, 2U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1147,7 +1238,7 @@
realm.rmm_feat_reg0) - 1U));
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (rtt.state != RMI_UNASSIGNED) {
ERROR("wrong state\n");
goto destroy_realm;
@@ -1229,15 +1320,22 @@
{
bool ret1, ret2;
struct realm realm;
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE}, dit;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, MAX_REC_COUNT)) {
+ feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1287,7 +1385,7 @@
/* Find an address not mapped in L3 */
base = ALIGN_DOWN(PAGE_POOL_BASE, RTT_MAP_SIZE(2U));
while (true) {
- ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_EMPTY)) {
base += RTT_MAP_SIZE(2U);
@@ -1299,15 +1397,15 @@
INFO("base = 0x%lx\n", base);
/* Create L3 RTT entries */
- ret = host_rmi_create_rtt_levels(realm, base, rtt.walk_level, 3U);
+ ret = host_rmi_create_rtt_levels(realm, base, rtt.walk_level, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
return TEST_RESULT_FAIL;
}
/* L3 entry should be created */
- ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
- if (rtt.walk_level != 3U) {
+ ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
+ if (rtt.walk_level != 3L) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
return TEST_RESULT_FAIL;
}
@@ -1320,7 +1418,7 @@
}
/* INIT_RIPAS should move state to unassigned ram */
- ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
(rtt.ripas != RMI_RAM)) {
ERROR("wrong state after INIT_RIPAS\n");
@@ -1336,7 +1434,7 @@
}
/* Destroy newly created rtt, for protected IPA there should be no live L3 entry */
- ret = host_rmi_rtt_destroy(realm->rd, base, 3U, &out_rtt, &top);
+ ret = host_rmi_rtt_destroy(realm->rd, base, 3L, &out_rtt, &top);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_destroy failed ret=0x%lx\n", ret);
return TEST_RESULT_FAIL;
@@ -1344,9 +1442,9 @@
ret = host_rmi_granule_undelegate(out_rtt);
/* Walk should terminate at L2 after RTT_DESTROY */
- ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
- rtt.ripas != RMI_DESTROYED || rtt.walk_level != 2U) {
+ rtt.ripas != RMI_DESTROYED || rtt.walk_level != 2L) {
ERROR("Wrong state after host_rmi_rtt_destroy\n");
return TEST_RESULT_FAIL;
}
@@ -1366,8 +1464,8 @@
/* Find an address not mapped in L3 */
base = ALIGN_DOWN(PAGE_POOL_BASE, RTT_MAP_SIZE(2U));
while (true) {
- ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_EMPTY)) {
base += RTT_MAP_SIZE(2U);
continue;
@@ -1378,21 +1476,21 @@
INFO("base = 0x%lx\n", base);
/* Create L3 RTT entries */
- ret = host_rmi_create_rtt_levels(realm, base, rtt.walk_level, 3U);
+ ret = host_rmi_create_rtt_levels(realm, base, rtt.walk_level, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
return TEST_RESULT_FAIL;
}
/* L3 entry should be created */
- ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
- if (rtt.walk_level != 3U) {
+ ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
+ if (rtt.walk_level != 3L) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
return TEST_RESULT_FAIL;
}
/* Destroy newly created rtt, for protected IPA there should be no live L3 entry */
- ret = host_rmi_rtt_destroy(realm->rd, base, 3U, &out_rtt, &top);
+ ret = host_rmi_rtt_destroy(realm->rd, base, 3L, &out_rtt, &top);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_destroy failed ret=0x%lx\n", ret);
return TEST_RESULT_FAIL;
@@ -1404,9 +1502,9 @@
}
/* Walk should terminate at L2 after RTT_DESTROY */
- ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
- rtt.ripas != RMI_DESTROYED || rtt.walk_level != 2U) {
+ rtt.ripas != RMI_DESTROYED || rtt.walk_level != 2L) {
ERROR("Wrong state after host_rmi_rtt_destroy\n");
return TEST_RESULT_FAIL;
}
@@ -1459,13 +1557,20 @@
struct realm realm;
struct rtt_entry rtt;
u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 2U)) {
+ feature_flag, sl, rec_flag, 2U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1477,15 +1582,15 @@
base = (u_register_t)page_alloc(PAGE_SIZE);
/* Create level 3 RTT */
- ret = host_rmi_create_rtt_levels(&realm, base, 3U, 3U);
+ ret = host_rmi_create_rtt_levels(&realm, base, 3L, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_create_rtt_levels failed\n");
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
- (rtt.ripas != RMI_EMPTY) || rtt.walk_level != 3U) {
+ (rtt.ripas != RMI_EMPTY) || rtt.walk_level != 3L) {
ERROR("wrong initial state\n");
goto destroy_realm;
}
@@ -1497,7 +1602,7 @@
ERROR("host_realm_delegate_map_protected_data failed\n");
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
(rtt.ripas != RMI_RAM)) {
ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -1510,7 +1615,7 @@
ERROR("host_rmi_data_destroy failed\n");
goto undelegate_destroy;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
rtt.ripas != RMI_DESTROYED) {
ERROR("Wrong state after host_rmi_data_destroy\n");
@@ -1526,7 +1631,7 @@
ERROR("host_realm_delegate_map_protected_data failed\n");
goto undelegate_destroy;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
(rtt.ripas != RMI_DESTROYED)) {
ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -1539,7 +1644,7 @@
ERROR("host_rmi_data_destroy failed\n");
goto undelegate_destroy;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
rtt.ripas != RMI_DESTROYED) {
ERROR("Wrong state after host_rmi_data_destroy\n");
@@ -1556,7 +1661,7 @@
ERROR("host_realm_delegate_map_protected_data failed\n");
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
(rtt.ripas != RMI_EMPTY)) {
ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -1567,7 +1672,7 @@
ERROR("host_rmi_data_destroy failed\n");
goto undelegate_destroy;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
rtt.ripas != RMI_EMPTY) {
ERROR("Wrong state after host_rmi_data_destroy\n");
@@ -1584,7 +1689,7 @@
"host_rmi_rtt_init_ripas", ret, __LINE__);
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
(rtt.ripas != RMI_RAM)) {
ERROR("wrong state after INIT_RIPAS\n");
@@ -1596,7 +1701,7 @@
ERROR("host_realm_delegate_map_protected_data failed\n");
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
(rtt.ripas != RMI_RAM)) {
ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -1643,13 +1748,20 @@
test_result_t test_result = TEST_RESULT_FAIL;
u_register_t rec_flag[] = {RMI_RUNNABLE};
struct realm realm;
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
goto destroy_realm;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1700,7 +1812,7 @@
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- feature_flag, rec_flag, 4U)) {
+ feature_flag, RTT_MIN_LEVEL, rec_flag, 4U)) {
return TEST_RESULT_FAIL;
}
if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1840,13 +1952,20 @@
struct realm realm;
struct rtt_entry rtt;
u_register_t rec_flag[] = {RMI_RUNNABLE};
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
ERROR("Realm creation failed\n");
goto destroy_realm;
}
@@ -1858,7 +1977,7 @@
/* Find an address not mapped at L1 and mapped at L0 as unassigned empty */
base = ALIGN_DOWN(TFTF_BASE, RTT_MAP_SIZE(1U));
while (true) {
- ret = host_rmi_rtt_readentry(realm.rd, base, 1U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 1L, &rtt);
if (ret != RMI_SUCCESS || rtt.walk_level > 0U || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_EMPTY)) {
base += RTT_MAP_SIZE(1U);
@@ -1874,94 +1993,94 @@
INFO("base=0x%lx\n", base);
/* Create RTT entries */
- ret = host_rmi_create_rtt_levels(&realm, base, 0U, 3U);
+ ret = host_rmi_create_rtt_levels(&realm, base, 0L, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* L3 entry is expected now */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_EMPTY)) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
/* RTT Fold */
- ret = host_realm_fold_rtt(realm.rd, base, 3U);
+ ret = host_realm_fold_rtt(realm.rd, base, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* Walk should terminate at L2 */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_EMPTY)) {
ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
- " rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ " rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
ret, rtt.state, rtt.walk_level, rtt.out_addr);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
/* RTT Fold */
- ret = host_realm_fold_rtt(realm.rd, base, 2U);
+ ret = host_realm_fold_rtt(realm.rd, base, 2L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* Walk should terminate at L1 */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 1U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 1L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_EMPTY)) {
ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
- " rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ " rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
ret, rtt.state, rtt.walk_level, rtt.out_addr);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
/* RTT Fold */
- ret = host_realm_fold_rtt(realm.rd, base, 1U);
+ ret = host_realm_fold_rtt(realm.rd, base, 1L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* Walk should terminate at L0 */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 0U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 0L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_EMPTY)) {
ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
- " rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ " rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
ret, rtt.state, rtt.walk_level, rtt.out_addr);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
/* Create RTT entries will cause unfold operation */
- ret = host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3U);
+ ret = host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* L3 entry should be created */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_EMPTY)) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
res = TEST_RESULT_SUCCESS;
@@ -1996,13 +2115,20 @@
struct realm realm;
struct rtt_entry rtt;
u_register_t rec_flag[] = {RMI_RUNNABLE};
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
ERROR("Realm creation failed\n");
goto destroy_realm;
}
@@ -2014,8 +2140,8 @@
/* Find an address not mapped at L1 and mapped at L0 as unassigned empty */
base = ALIGN_DOWN(TFTF_BASE, RTT_MAP_SIZE(1U));
while (true) {
- ret = host_rmi_rtt_readentry(realm.rd, base, 1U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level > 0U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 1L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level > 0L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_EMPTY)) {
base += RTT_MAP_SIZE(1U);
if (host_ipa_is_ns(base, realm.rmm_feat_reg0)) {
@@ -2039,9 +2165,9 @@
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
- (rtt.ripas != RMI_RAM) || rtt.walk_level != 0U) {
+ (rtt.ripas != RMI_RAM) || rtt.walk_level != 0L) {
ERROR("wrong initial state\n");
goto destroy_realm;
}
@@ -2049,94 +2175,94 @@
INFO("base=0x%lx\n", base);
/* Create RTT entries */
- ret = host_rmi_create_rtt_levels(&realm, base, 0U, 3U);
+ ret = host_rmi_create_rtt_levels(&realm, base, 0L, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* L3 entry should be created */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_RAM)) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
/* RTT Fold */
- ret = host_realm_fold_rtt(realm.rd, base, 3U);
+ ret = host_realm_fold_rtt(realm.rd, base, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* Walk should terminate at L2 */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_RAM)) {
ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
- " rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ " rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
ret, rtt.state, rtt.walk_level, rtt.out_addr);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
/* RTT Fold */
- ret = host_realm_fold_rtt(realm.rd, base, 2U);
+ ret = host_realm_fold_rtt(realm.rd, base, 2L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* Walk should terminate at L1 */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 1U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 1L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_RAM)) {
ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
- " rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ " rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
ret, rtt.state, rtt.walk_level, rtt.out_addr);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
/* RTT Fold */
- ret = host_realm_fold_rtt(realm.rd, base, 1U);
+ ret = host_realm_fold_rtt(realm.rd, base, 1L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* Walk should terminate at L0 */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 0U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 0L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_RAM)) {
ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
- " rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ " rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
ret, rtt.state, rtt.walk_level, rtt.out_addr);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
/* Create RTT entries will cause unfold operation */
- ret = host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3U);
+ ret = host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* L3 entry should be created */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_UNASSIGNED
|| (rtt.ripas != RMI_RAM)) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
res = TEST_RESULT_SUCCESS;
@@ -2170,13 +2296,20 @@
struct realm realm;
struct rtt_entry rtt;
u_register_t rec_flag[] = {RMI_RUNNABLE};
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
ERROR("Realm creation failed\n");
goto destroy_realm;
}
@@ -2204,55 +2337,55 @@
goto destroy_realm;
}
- ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 1U || rtt.state != RMI_ASSIGNED) {
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 1L || rtt.state != RMI_ASSIGNED) {
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
rtt.state, rtt.walk_level, rtt.out_addr);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
rtt.state, rtt.walk_level, rtt.out_addr);
/* Unfold Create L2 RTT entries */
- ret = host_rmi_create_rtt_levels(&realm, ns_ipa, 1U, 2U);
+ ret = host_rmi_create_rtt_levels(&realm, ns_ipa, 1L, 2L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
}
- ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_ASSIGNED) {
+ ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_ASSIGNED) {
ERROR("Initial realm table creation changed\n");
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
rtt.state, rtt.walk_level, rtt.out_addr);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
rtt.state, rtt.walk_level, rtt.out_addr);
INFO("Fold L2\n");
/* RTT Fold */
- ret = host_realm_fold_rtt(realm.rd, ns_ipa, 2U);
+ ret = host_realm_fold_rtt(realm.rd, ns_ipa, 2L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* Walk should terminate at L1 */
- ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 1U || rtt.state != RMI_ASSIGNED) {
+ ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 1L || rtt.state != RMI_ASSIGNED) {
ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
- " rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ " rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
ret, rtt.state, rtt.walk_level, rtt.out_addr);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
rtt.state, rtt.walk_level, rtt.out_addr);
res = TEST_RESULT_SUCCESS;
INFO("unmap\n\n");
/* unmap */
- ret = host_rmi_rtt_unmap_unprotected(realm.rd, ns_ipa, 1U, &top);
+ ret = host_rmi_rtt_unmap_unprotected(realm.rd, ns_ipa, 1L, &top);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_mapunprotected failed ret=0x%lx\n", ret);
}
@@ -2284,13 +2417,20 @@
struct realm realm;
struct rtt_entry rtt;
u_register_t rec_flag[] = {RMI_RUNNABLE};
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
ERROR("Realm creation failed\n");
goto destroy_realm;
}
@@ -2315,9 +2455,9 @@
}
INFO("base=0x%lx\n", base);
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
- (rtt.ripas != RMI_EMPTY) || rtt.walk_level != 3U) {
+ (rtt.ripas != RMI_EMPTY) || rtt.walk_level != 3L) {
ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
goto undelegate_destroy;
}
@@ -2330,32 +2470,32 @@
}
/* Walk should terminate at L2 */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_ASSIGNED ||
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_ASSIGNED ||
rtt.ripas != RMI_EMPTY) {
ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
- " rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+ " rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
ret, rtt.state, rtt.walk_level, rtt.out_addr);
goto undelegate_destroy;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
/* Create L3 RTT entries */
- ret = host_rmi_create_rtt_levels(&realm, base, 2U, 3U);
+ ret = host_rmi_create_rtt_levels(&realm, base, 2L, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* L3 entry should be created */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_ASSIGNED ||
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_ASSIGNED ||
rtt.ripas != RMI_EMPTY) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
res = TEST_RESULT_SUCCESS;
@@ -2395,13 +2535,20 @@
struct realm realm;
struct rtt_entry rtt;
u_register_t rec_flag[] = {RMI_RUNNABLE};
+ u_register_t feature_flag = 0UL;
+ long sl = RTT_MIN_LEVEL;
SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
+
if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
(u_register_t)PAGE_POOL_MAX_SIZE,
- 0UL, rec_flag, 1U)) {
+ feature_flag, sl, rec_flag, 1U)) {
ERROR("Realm creation failed\n");
goto destroy_realm;
}
@@ -2428,7 +2575,7 @@
}
/* INIT_RIPAS should move state to unassigned ram */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
(rtt.ripas != RMI_RAM)) {
ERROR("wrong state after INIT_RIPAS\n");
@@ -2437,39 +2584,39 @@
host_realm_activate(&realm);
/* RTT Fold */
- ret = host_realm_fold_rtt(realm.rd, base, 3U);
+ ret = host_realm_fold_rtt(realm.rd, base, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
goto undelegate_destroy;
}
/* Walk should terminate at L2 */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_ASSIGNED ||
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_ASSIGNED ||
rtt.ripas != RMI_RAM) {
ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
- " rtt.walk_level=0x%llx rtt.out_addr=0x%llx ripas=0x%lx\n",
+ " rtt.walk_level=0x%lx rtt.out_addr=0x%llx ripas=0x%lx\n",
ret, rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
goto undelegate_destroy;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
/* Create L3 RTT entries */
- ret = host_rmi_create_rtt_levels(&realm, base, 2U, 3U);
+ ret = host_rmi_create_rtt_levels(&realm, base, 2L, 3L);
if (ret != RMI_SUCCESS) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
/* L3 entry should be created */
- ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
- if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_ASSIGNED ||
+ ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+ if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_ASSIGNED ||
rtt.ripas != RMI_RAM) {
ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
goto destroy_realm;
}
- INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx ripas=0x%lx\n",
+ INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx ripas=0x%lx\n",
rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
res = TEST_RESULT_SUCCESS;
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_spm.c b/tftf/tests/runtime_services/realm_payload/host_realm_spm.c
index 51b87e7..589888e 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_spm.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_spm.c
@@ -52,13 +52,21 @@
static test_result_t init_realm(void)
{
u_register_t rec_flag[1] = {RMI_RUNNABLE};
+ u_register_t feature_flag = 0U;
+ long sl = RTT_MIN_LEVEL;
+
+ if (is_feat_52b_on_4k_2_supported() == true) {
+ feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+ sl = RTT_MIN_LEVEL_LPA2;
+ }
/*
* Initialise Realm payload
*/
if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
(u_register_t)PAGE_POOL_BASE,
- (u_register_t)PAGE_POOL_MAX_SIZE, 0UL, rec_flag, 1U)) {
+ (u_register_t)PAGE_POOL_MAX_SIZE,
+ feature_flag, sl, rec_flag, 1U)) {
return TEST_RESULT_FAIL;
}