Tested on Versal (A72) and large mappings are now working. I have pushed the patch.
Thanks for this. :) Chris On 17/11/2022 2:22 am, Kinsey Moore wrote: > In the original implementation, level -1 was unused and all levels could > have block-like descriptors (level 2 block descriptors are called page > descriptors). When support for level -1 page tables was added the > constraint on level -1 block descriptors was not honored. This prevents > block descriptors from being mapped at level -1 since the hardware will > not map them properly. > --- > bsps/aarch64/include/bsp/aarch64-mmu.h | 23 +++++++++++++---------- > 1 file changed, 13 insertions(+), 10 deletions(-) > > diff --git a/bsps/aarch64/include/bsp/aarch64-mmu.h > b/bsps/aarch64/include/bsp/aarch64-mmu.h > index 1287c67016..ebc224b9e1 100644 > --- a/bsps/aarch64/include/bsp/aarch64-mmu.h > +++ b/bsps/aarch64/include/bsp/aarch64-mmu.h > @@ -243,26 +243,29 @@ BSP_START_TEXT_SECTION static inline rtems_status_code > aarch64_mmu_map_block( > /* check for perfect block match */ > if ( block_bottom == addr ) { > if ( size >= chunk_size ) { > - /* when page_flag is set the last level must be a page descriptor */ > - if ( page_flag || ( page_table[index] & MMU_DESC_TYPE_TABLE ) != > MMU_DESC_TYPE_TABLE ) { > - /* no sub-table, apply block properties */ > - page_table[index] = addr | flags | page_flag; > - size -= chunk_size; > - addr += chunk_size; > - continue; > + /* level -1 can't contain block descriptors, fall through to > subtable */ > + if ( level != -1 ) { > + /* when page_flag is set the last level must be a page descriptor > */ > + if ( page_flag || ( page_table[index] & MMU_DESC_TYPE_TABLE ) != > MMU_DESC_TYPE_TABLE ) { > + /* no sub-table, apply block properties */ > + page_table[index] = addr | flags | page_flag; > + size -= chunk_size; > + addr += chunk_size; > + continue; > + } > } > } else { > /* block starts on a boundary, but is short */ > chunk_size = size; > > - /* it isn't possible to go beyond page table level 2 */ > - if ( page_flag ) { > + /* it isn't possible to go beyond page table level 2 */ > + if ( page_flag ) { > /* no sub-table, apply block properties */ > page_table[index] = addr | flags | page_flag; > size -= chunk_size; > addr += chunk_size; > continue; > - } > + } > } > } else { > uintptr_t block_top = RTEMS_ALIGN_UP( addr, granularity ); _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel