fix(lib/s2tt): add missing assertions
Add missing assertions for
- s2tt_init_assigned_dev_empty()
- s2tt_init_assigned_dev_destroyed()
- s2tt_init_assigned_dev_dev()
Refactor
- s2tt_init_assigned_destroyed()
- s2tt_init_assigned_empty()
- s2tt_init_assigned_ram()
- s2tt_init_assigned_dev_empty()
- s2tt_init_assigned_dev_destroyed()
to use init_assigned() function.
Remove explicit comparison of boolean
s2_ctx->enable_lpa2 with true.
Signed-off-by: AlexeiFedorov <Alexei.Fedorov@arm.com>
Change-Id: If660dad0b6bf514e7b89f656bf9d43f47c57564d
diff --git a/lib/s2tt/src/s2tt.c b/lib/s2tt/src/s2tt.c
index 6b9692b..631519d 100644
--- a/lib/s2tt/src/s2tt.c
+++ b/lib/s2tt/src/s2tt.c
@@ -30,7 +30,7 @@
mask = BIT_MASK_ULL((S2TTE_OA_BITS - 1U), lsb);
- if (lpa2 == true) {
+ if (lpa2) {
mask |= (MASK(LPA2_S2TTE_51_50) | MASK(LPA2_OA_49_48));
}
@@ -44,7 +44,7 @@
{
unsigned long pa = s2tte & s2tte_lvl_mask(level, lpa2);
- if (lpa2 == true) {
+ if (lpa2) {
pa &= ~MASK(LPA2_S2TTE_51_50);
pa |= INPLACE(LPA2_OA_51_50, EXTRACT(LPA2_S2TTE_51_50, s2tte));
}
@@ -150,7 +150,7 @@
{
unsigned long tte = pa;
- if (lpa2 == true) {
+ if (lpa2) {
tte &= ~MASK(LPA2_OA_51_50);
tte |= INPLACE(LPA2_S2TTE_51_50, EXTRACT(LPA2_OA_51_50, pa));
}
@@ -338,7 +338,7 @@
assert(map_addr < (1UL << ipa_bits));
assert(wi != NULL);
- if (s2_ctx->enable_lpa2 == true) {
+ if (s2_ctx->enable_lpa2) {
assert(ipa_bits <= S2TTE_OA_BITS_LPA2);
} else {
assert(ipa_bits <= S2TTE_OA_BITS);
@@ -533,9 +533,9 @@
assert(s2_ctx != NULL);
assert(level >= S2TT_MIN_DEV_BLOCK_LEVEL);
- assert((s2tte_ripas == S2TTE_INVALID_RIPAS_EMPTY) ||
- (s2tte_ripas == S2TTE_INVALID_RIPAS_DESTROYED));
assert(s2tte_is_addr_lvl_aligned(s2_ctx, pa, level));
+ assert((s2tte_ripas == S2TTE_INVALID_RIPAS_EMPTY) ||
+ (s2tte_ripas == S2TTE_INVALID_RIPAS_DESTROYED));
tte = pa_to_s2tte(pa, s2_ctx->enable_lpa2);
@@ -591,6 +591,7 @@
unsigned long pa, new_s2tte;
assert(level >= S2TT_MIN_DEV_BLOCK_LEVEL);
+ assert(level <= S2TT_PAGE_LEVEL);
pa = s2tte_to_pa(s2tte, level, lpa2);
@@ -1108,8 +1109,7 @@
void s2tt_init_unassigned_empty(const struct s2tt_context *s2_ctx,
unsigned long *s2tt)
{
- unsigned long s2tte =
- s2tte_create_unassigned_empty(s2_ctx);
+ unsigned long s2tte = s2tte_create_unassigned_empty(s2_ctx);
assert(s2tt != NULL);
@@ -1169,8 +1169,7 @@
void s2tt_init_unassigned_destroyed(const struct s2tt_context *s2_ctx,
unsigned long *s2tt)
{
- unsigned long s2tte =
- s2tte_create_unassigned_destroyed(s2_ctx);
+ unsigned long s2tte = s2tte_create_unassigned_destroyed(s2_ctx);
assert(s2tt != NULL);
@@ -1181,6 +1180,26 @@
dsb(ish);
}
+static void init_assigned(const struct s2tt_context *s2_ctx,
+ unsigned long *s2tt, unsigned long pa, long level,
+ const long min_level, create_assigned_fn func)
+{
+ (void)min_level;
+
+ assert(s2tt != NULL);
+ assert(level >= min_level);
+ assert(level <= S2TT_PAGE_LEVEL);
+ assert(s2tte_is_addr_lvl_aligned(s2_ctx, pa, level));
+
+ const unsigned long map_size = s2tte_map_size(level);
+
+ for (unsigned int i = 0U; i < S2TTES_PER_S2TT; i++) {
+ s2tt[i] = func(s2_ctx, pa, level);
+ pa += map_size;
+ }
+ dsb(ish);
+}
+
/*
* Populates @s2tt with HIPAS=ASSIGNED, RIPAS=DESTROYED s2ttes that refer to a
* contiguous memory block starting at @pa, and mapped at level @level.
@@ -1192,18 +1211,8 @@
unsigned long *s2tt, unsigned long pa,
long level)
{
- assert(s2tt != NULL);
- assert(level >= S2TT_MIN_BLOCK_LEVEL);
- assert(level <= S2TT_PAGE_LEVEL);
- assert(s2tte_is_addr_lvl_aligned(s2_ctx, pa, level));
-
- const unsigned long map_size = s2tte_map_size(level);
-
- for (unsigned int i = 0U; i < S2TTES_PER_S2TT; i++) {
- s2tt[i] = s2tte_create_assigned_destroyed(s2_ctx, pa, level);
- pa += map_size;
- }
- dsb(ish);
+ init_assigned(s2_ctx, s2tt, pa, level, S2TT_MIN_BLOCK_LEVEL,
+ s2tte_create_assigned_destroyed);
}
/*
@@ -1217,18 +1226,8 @@
unsigned long *s2tt, unsigned long pa,
long level)
{
- assert(level >= S2TT_MIN_BLOCK_LEVEL);
- assert(level <= S2TT_PAGE_LEVEL);
- assert(s2tt != NULL);
- assert(s2tte_is_addr_lvl_aligned(s2_ctx, pa, level));
-
- const unsigned long map_size = s2tte_map_size(level);
-
- for (unsigned int i = 0U; i < S2TTES_PER_S2TT; i++) {
- s2tt[i] = s2tte_create_assigned_empty(s2_ctx, pa, level);
- pa += map_size;
- }
- dsb(ish);
+ init_assigned(s2_ctx, s2tt, pa, level, S2TT_MIN_BLOCK_LEVEL,
+ s2tte_create_assigned_empty);
}
/*
@@ -1242,18 +1241,8 @@
unsigned long *s2tt, unsigned long pa,
long level)
{
- assert(level >= S2TT_MIN_BLOCK_LEVEL);
- assert(level <= S2TT_PAGE_LEVEL);
- assert(s2tt != NULL);
- assert(s2tte_is_addr_lvl_aligned(s2_ctx, pa, level));
-
- const unsigned long map_size = s2tte_map_size(level);
-
- for (unsigned int i = 0U; i < S2TTES_PER_S2TT; i++) {
- s2tt[i] = s2tte_create_assigned_ram(s2_ctx, pa, level);
- pa += map_size;
- }
- dsb(ish);
+ init_assigned(s2_ctx, s2tt, pa, level, S2TT_MIN_BLOCK_LEVEL,
+ s2tte_create_assigned_ram);
}
/*
@@ -1267,9 +1256,9 @@
unsigned long *s2tt, unsigned long attrs,
unsigned long pa, long level)
{
+ assert(s2tt != NULL);
assert(level >= S2TT_MIN_BLOCK_LEVEL);
assert(level <= S2TT_PAGE_LEVEL);
- assert(s2tt != NULL);
assert(s2tte_is_addr_lvl_aligned(s2_ctx, pa, level));
const unsigned long map_size = s2tte_map_size(level);
@@ -1296,14 +1285,8 @@
void s2tt_init_assigned_dev_empty(const struct s2tt_context *s2_ctx,
unsigned long *s2tt, unsigned long pa, long level)
{
- const unsigned long map_size = s2tte_map_size(level);
-
- for (unsigned int i = 0U; i < S2TTES_PER_S2TT; i++) {
- s2tt[i] = s2tte_create_assigned_dev_empty(s2_ctx, pa, level);
- pa += map_size;
- }
-
- dsb(ish);
+ init_assigned(s2_ctx, s2tt, pa, level, S2TT_MIN_DEV_BLOCK_LEVEL,
+ s2tte_create_assigned_dev_empty);
}
/*
@@ -1316,14 +1299,8 @@
void s2tt_init_assigned_dev_destroyed(const struct s2tt_context *s2_ctx,
unsigned long *s2tt, unsigned long pa, long level)
{
- const unsigned long map_size = s2tte_map_size(level);
-
- for (unsigned int i = 0U; i < S2TTES_PER_S2TT; i++) {
- s2tt[i] = s2tte_create_assigned_dev_destroyed(s2_ctx, pa, level);
- pa += map_size;
- }
-
- dsb(ish);
+ init_assigned(s2_ctx, s2tt, pa, level, S2TT_MIN_DEV_BLOCK_LEVEL,
+ s2tte_create_assigned_dev_destroyed);
}
/*
@@ -1337,11 +1314,14 @@
unsigned long *s2tt, unsigned long s2tte,
unsigned long pa, long level)
{
- const unsigned long map_size = s2tte_map_size(level);
unsigned long s2tte_mask = (S2TTE_DEV_ATTRS_MASK | S2TTE_MEMATTR_MASK);
- assert(s2_ctx != NULL);
+ assert(s2tt != NULL);
assert(level >= S2TT_MIN_DEV_BLOCK_LEVEL);
+ assert(level <= S2TT_PAGE_LEVEL);
+ assert(s2tte_is_addr_lvl_aligned(s2_ctx, pa, level));
+
+ const unsigned long map_size = s2tte_map_size(level);
/* Add Shareability bits if FEAT_LPA2 is not enabled */
if (!s2_ctx->enable_lpa2) {
@@ -1376,13 +1356,12 @@
long level)
{
bool lpa2;
- unsigned long pa;
__unused long min_starting_level;
assert(s2_ctx != NULL);
/* cppcheck-suppress misra-c2012-10.6 */
- min_starting_level = (s2_ctx->enable_lpa2 == true) ?
+ min_starting_level = s2_ctx->enable_lpa2 ?
S2TT_MIN_STARTING_LEVEL_LPA2 : S2TT_MIN_STARTING_LEVEL;
assert(level >= min_starting_level);
assert(level <= S2TT_PAGE_LEVEL);
@@ -1391,12 +1370,10 @@
lpa2 = s2_ctx->enable_lpa2;
if (s2tte_is_table(s2_ctx, s2tte, level)) {
- pa = table_entry_to_phys(s2tte, lpa2);
- } else {
- pa = s2tte_to_pa(s2tte, level, lpa2);
+ return table_entry_to_phys(s2tte, lpa2);
}
- return pa;
+ return s2tte_to_pa(s2tte, level, lpa2);
}
bool s2tte_is_addr_lvl_aligned(const struct s2tt_context *s2_ctx,
@@ -1405,12 +1382,12 @@
assert(s2_ctx != NULL);
/* cppcheck-suppress misra-c2012-10.6 */
- __unused long min_starting_level = (s2_ctx->enable_lpa2 == true) ?
- S2TT_MIN_STARTING_LEVEL_LPA2 : S2TT_MIN_STARTING_LEVEL;
+ __unused long min_starting_level = s2_ctx->enable_lpa2 ?
+ S2TT_MIN_STARTING_LEVEL_LPA2 : S2TT_MIN_STARTING_LEVEL;
unsigned long levels = (unsigned long)(S2TT_PAGE_LEVEL - level);
unsigned long lsb = (levels * S2TTE_STRIDE) + GRANULE_SHIFT;
- unsigned long s2tte_oa_bits = (s2_ctx->enable_lpa2 == true) ?
- S2TTE_OA_BITS_LPA2 : S2TTE_OA_BITS;
+ unsigned long s2tte_oa_bits = s2_ctx->enable_lpa2 ?
+ S2TTE_OA_BITS_LPA2 : S2TTE_OA_BITS;
assert(level <= S2TT_PAGE_LEVEL);
assert(level >= min_starting_level);
@@ -1499,7 +1476,7 @@
unsigned long s2tt_ns_attrs;
unsigned int i;
- if (s2_ctx->enable_lpa2 == true) {
+ if (s2_ctx->enable_lpa2) {
assert(level >= S2TT_MIN_STARTING_LEVEL_LPA2);
} else {
assert(level >= S2TT_MIN_STARTING_LEVEL);
@@ -1664,7 +1641,7 @@
unsigned long map_size;
/* cppcheck-suppress misra-c2012-10.6 */
- __unused long min_starting_level = (s2_ctx->enable_lpa2 == true) ?
+ __unused long min_starting_level = s2_ctx->enable_lpa2 ?
S2TT_MIN_STARTING_LEVEL_LPA2 : S2TT_MIN_STARTING_LEVEL;
assert(wi->last_level >= min_starting_level);
diff --git a/lib/s2tt/src/s2tt_pvt_defs.h b/lib/s2tt/src/s2tt_pvt_defs.h
index a54ab1e..a4e35b7 100644
--- a/lib/s2tt/src/s2tt_pvt_defs.h
+++ b/lib/s2tt/src/s2tt_pvt_defs.h
@@ -171,4 +171,7 @@
#define NR_RTT_LEVELS_LPA2 (S2TT_PAGE_LEVEL - \
S2TT_MIN_STARTING_LEVEL_LPA2 + 1)
+typedef unsigned long (*create_assigned_fn)(const struct s2tt_context *s2_ctx,
+ unsigned long pa, long level);
+
#endif /* S2TT_PVT_DEFS */