arm64: Reinit free_idx to 1 in mmu_init
If mmu_init is called more than once then, free_idx should be reset to 1. Here, the assumption would be that mmu_init will not be called more than once. However, this is not necessarily true. Thus, free_idx should be reset to 1 every time we are initializing ttb from scratch. BUG=None BRANCH=None TEST=Compiles sucessfully and boots to kernel Change-Id: I5ac0af43346a492583380b0f15101390fc98d182 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: 398a68c3b08d82cfa521d235af2c1922629bdf56 Original-Change-Id: Idb7424df7dd577f263f12d1527dbd7fb89216d40 Original-Signed-off-by: Furquan Shaikh <furquan@google.com> Original-Reviewed-on: https://chromium-review.googlesource.com/216906 Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org> Original-Tested-by: Furquan Shaikh <furquan@chromium.org> Original-Commit-Queue: Furquan Shaikh <furquan@chromium.org> Reviewed-on: http://review.coreboot.org/9068 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
parent
cbf17d95c5
commit
c4fb61385f
|
@ -40,6 +40,7 @@
|
||||||
static unsigned int max_tables;
|
static unsigned int max_tables;
|
||||||
/* Address of ttb buffer */
|
/* Address of ttb buffer */
|
||||||
static uint64_t *xlat_addr;
|
static uint64_t *xlat_addr;
|
||||||
|
static int free_idx;
|
||||||
|
|
||||||
static const uint64_t level_to_addr_mask[] = {
|
static const uint64_t level_to_addr_mask[] = {
|
||||||
L1_ADDR_MASK,
|
L1_ADDR_MASK,
|
||||||
|
@ -74,7 +75,6 @@ static uint64_t get_block_attr(unsigned long tag)
|
||||||
attr |= BLOCK_INDEX_MEM_DEV_NGNRNE << BLOCK_INDEX_SHIFT;
|
attr |= BLOCK_INDEX_MEM_DEV_NGNRNE << BLOCK_INDEX_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return attr;
|
return attr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,6 @@ static uint64_t table_desc_valid(uint64_t desc)
|
||||||
*/
|
*/
|
||||||
static uint64_t *get_new_table(void)
|
static uint64_t *get_new_table(void)
|
||||||
{
|
{
|
||||||
static int free_idx = 1;
|
|
||||||
uint64_t *new;
|
uint64_t *new;
|
||||||
|
|
||||||
if (free_idx >= max_tables) {
|
if (free_idx >= max_tables) {
|
||||||
|
@ -260,6 +259,7 @@ void mmu_init(struct memranges *mmap_ranges,
|
||||||
memset((void*)ttb_buffer, 0, GRANULE_SIZE);
|
memset((void*)ttb_buffer, 0, GRANULE_SIZE);
|
||||||
max_tables = (ttb_size >> GRANULE_SIZE_SHIFT);
|
max_tables = (ttb_size >> GRANULE_SIZE_SHIFT);
|
||||||
xlat_addr = ttb_buffer;
|
xlat_addr = ttb_buffer;
|
||||||
|
free_idx = 1;
|
||||||
|
|
||||||
memranges_each_entry(mmap_entry, mmap_ranges) {
|
memranges_each_entry(mmap_entry, mmap_ranges) {
|
||||||
init_mmap_entry(mmap_entry);
|
init_mmap_entry(mmap_entry);
|
||||||
|
|
Loading…
Reference in New Issue