Commit aa447b9c authored by Sandrine Bailleux's avatar Sandrine Bailleux
Browse files

Fix computation of L1 bitmask in the translation table lib

This patch fixes the computation of the bitmask used to isolate
the level 1 field of a virtual address. The whole computation needs
to work on 64-bit values to produce the correct bitmask value.
XLAT_TABLE_ENTRIES_MASK being a C constant, it is a 32-bit value
so it needs to be extended to a 64-bit value before it takes part
in any other computation.

This patch fixes this bug by casting XLAT_TABLE_ENTRIES_MASK as
an unsigned long long.

Note that this bug doesn't manifest itself in practice because
address spaces larger than 39 bits are not yet supported in the
Trusted Firmware.

Change-Id: I955fd263ecb691ca94b29b9c9f576008ce1d87ee
parent 142ff9b5
...@@ -284,8 +284,9 @@ static mmap_region_t *init_xlation_table_inner(mmap_region_t *mm, ...@@ -284,8 +284,9 @@ static mmap_region_t *init_xlation_table_inner(mmap_region_t *mm,
unsigned level_size_shift = L1_XLAT_ADDRESS_SHIFT - (level - 1) * unsigned level_size_shift = L1_XLAT_ADDRESS_SHIFT - (level - 1) *
XLAT_TABLE_ENTRIES_SHIFT; XLAT_TABLE_ENTRIES_SHIFT;
unsigned level_size = 1 << level_size_shift; unsigned level_size = 1 << level_size_shift;
unsigned long long level_index_mask = XLAT_TABLE_ENTRIES_MASK << unsigned long long level_index_mask =
level_size_shift; ((unsigned long long) XLAT_TABLE_ENTRIES_MASK)
<< level_size_shift;
assert(level > 0 && level <= 3); assert(level > 0 && level <= 3);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment