[PATCH] bsps/aarch64: Use MMU pages appropriately

Joel Sherrill joel at rtems.org
Tue Jul 5 19:38:50 UTC 2022


I'm ok with this. But Chris should speak up about the Versal.

On Tue, Jul 5, 2022 at 2:36 PM Kinsey Moore <kinsey.moore at oarcorp.com>
wrote:

> There were two bugs with MMU page use that were partially hiding each
> other. The linker script page table section was 4x the size it needed to
> be and the page table allocation routine was allocating pages PTRSIZE
> times larger than it needed to. On ILP32, this resulted in incorrect but
> functional allocation. On LP64, this resulted in allocation failures
> earlier than expected.
> ---
>  bsps/aarch64/include/bsp/aarch64-mmu.h                   | 4 ++--
>  spec/build/bsps/aarch64/xilinx-versal/linkcmds_ilp32.yml | 6 +++---
>  spec/build/bsps/aarch64/xilinx-versal/linkcmds_lp64.yml  | 6 +++---
>  spec/build/bsps/aarch64/xilinx-zynqmp/linkcmds_ilp32.yml | 6 +++---
>  spec/build/bsps/aarch64/xilinx-zynqmp/linkcmds_lp64.yml  | 6 +++---
>  5 files changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/bsps/aarch64/include/bsp/aarch64-mmu.h
> b/bsps/aarch64/include/bsp/aarch64-mmu.h
> index 6e589cd6cd..bca7e0ce8d 100644
> --- a/bsps/aarch64/include/bsp/aarch64-mmu.h
> +++ b/bsps/aarch64/include/bsp/aarch64-mmu.h
> @@ -145,8 +145,8 @@ BSP_START_TEXT_SECTION static inline rtems_status_code
>  aarch64_mmu_page_table_alloc( uint64_t **page_table )
>  {
>    /* First page table is already in use as TTB0 */
> -  static uintptr_t *current_page_table =
> -    (uintptr_t *) bsp_translation_table_base;
> +  static uintptr_t current_page_table =
> +    (uintptr_t) bsp_translation_table_base;
>
>    current_page_table += MMU_PAGE_SIZE;
>    *page_table = (uint64_t *) current_page_table;
> diff --git a/spec/build/bsps/aarch64/xilinx-versal/linkcmds_ilp32.yml
> b/spec/build/bsps/aarch64/xilinx-versal/linkcmds_ilp32.yml
> index 3030fd0ae9..2d7a922495 100644
> --- a/spec/build/bsps/aarch64/xilinx-versal/linkcmds_ilp32.yml
> +++ b/spec/build/bsps/aarch64/xilinx-versal/linkcmds_ilp32.yml
> @@ -29,9 +29,9 @@ content: |
>     */
>
>    MEMORY {
> -    RAM       : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_LOAD_OFFSET}, LENGTH = ${BSP_XILINX_VERSAL_RAM_LENGTH}
> - ${BSP_XILINX_VERSAL_LOAD_OFFSET} - ${BSP_XILINX_VERSAL_NOCACHE_LENGTH} -
> (0x4000 * ${AARCH64_MMU_TRANSLATION_TABLE_PAGES})
> -    NOCACHE   : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_RAM_LENGTH} - (0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}) -
> ${BSP_XILINX_VERSAL_NOCACHE_LENGTH}, LENGTH =
> ${BSP_XILINX_VERSAL_NOCACHE_LENGTH}
> -    RAM_MMU   : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_RAM_LENGTH} - (0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}), LENGTH = 0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}
> +    RAM       : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_LOAD_OFFSET}, LENGTH = ${BSP_XILINX_VERSAL_RAM_LENGTH}
> - ${BSP_XILINX_VERSAL_LOAD_OFFSET} - ${BSP_XILINX_VERSAL_NOCACHE_LENGTH} -
> (0x1000 * ${AARCH64_MMU_TRANSLATION_TABLE_PAGES})
> +    NOCACHE   : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_RAM_LENGTH} - (0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}) -
> ${BSP_XILINX_VERSAL_NOCACHE_LENGTH}, LENGTH =
> ${BSP_XILINX_VERSAL_NOCACHE_LENGTH}
> +    RAM_MMU   : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_RAM_LENGTH} - (0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}), LENGTH = 0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}
>    }
>
>    REGION_ALIAS ("REGION_START",          RAM);
> diff --git a/spec/build/bsps/aarch64/xilinx-versal/linkcmds_lp64.yml
> b/spec/build/bsps/aarch64/xilinx-versal/linkcmds_lp64.yml
> index bd5d1f791b..76c0220f0e 100644
> --- a/spec/build/bsps/aarch64/xilinx-versal/linkcmds_lp64.yml
> +++ b/spec/build/bsps/aarch64/xilinx-versal/linkcmds_lp64.yml
> @@ -29,9 +29,9 @@ content: |
>     */
>
>    MEMORY {
> -    RAM       : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_LOAD_OFFSET}, LENGTH = ${BSP_XILINX_VERSAL_RAM_LENGTH}
> - ${BSP_XILINX_VERSAL_LOAD_OFFSET} - ${BSP_XILINX_VERSAL_NOCACHE_LENGTH} -
> (0x4000 * ${AARCH64_MMU_TRANSLATION_TABLE_PAGES})
> -    NOCACHE   : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_RAM_LENGTH} - (0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}) -
> ${BSP_XILINX_VERSAL_NOCACHE_LENGTH}, LENGTH =
> ${BSP_XILINX_VERSAL_NOCACHE_LENGTH}
> -    RAM_MMU   : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_RAM_LENGTH} - (0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}), LENGTH = 0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}
> +    RAM       : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_LOAD_OFFSET}, LENGTH = ${BSP_XILINX_VERSAL_RAM_LENGTH}
> - ${BSP_XILINX_VERSAL_LOAD_OFFSET} - ${BSP_XILINX_VERSAL_NOCACHE_LENGTH} -
> (0x1000 * ${AARCH64_MMU_TRANSLATION_TABLE_PAGES})
> +    NOCACHE   : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_RAM_LENGTH} - (0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}) -
> ${BSP_XILINX_VERSAL_NOCACHE_LENGTH}, LENGTH =
> ${BSP_XILINX_VERSAL_NOCACHE_LENGTH}
> +    RAM_MMU   : ORIGIN = ${BSP_XILINX_VERSAL_RAM_BASE} +
> ${BSP_XILINX_VERSAL_RAM_LENGTH} - (0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}), LENGTH = 0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}
>    }
>
>    REGION_ALIAS ("REGION_START",          RAM);
> diff --git a/spec/build/bsps/aarch64/xilinx-zynqmp/linkcmds_ilp32.yml
> b/spec/build/bsps/aarch64/xilinx-zynqmp/linkcmds_ilp32.yml
> index b530969de7..568e663c49 100644
> --- a/spec/build/bsps/aarch64/xilinx-zynqmp/linkcmds_ilp32.yml
> +++ b/spec/build/bsps/aarch64/xilinx-zynqmp/linkcmds_ilp32.yml
> @@ -30,9 +30,9 @@ content: |
>     */
>
>    MEMORY {
> -    RAM       : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_LOAD_OFFSET}, LENGTH = ${BSP_XILINX_ZYNQMP_RAM_LENGTH}
> - ${BSP_XILINX_ZYNQMP_LOAD_OFFSET} - ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH} -
> (0x4000 * ${AARCH64_MMU_TRANSLATION_TABLE_PAGES})
> -    NOCACHE   : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_RAM_LENGTH} - (0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}) -
> ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH}, LENGTH =
> ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH}
> -    RAM_MMU   : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_RAM_LENGTH} - (0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}), LENGTH = 0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}
> +    RAM       : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_LOAD_OFFSET}, LENGTH = ${BSP_XILINX_ZYNQMP_RAM_LENGTH}
> - ${BSP_XILINX_ZYNQMP_LOAD_OFFSET} - ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH} -
> (0x1000 * ${AARCH64_MMU_TRANSLATION_TABLE_PAGES})
> +    NOCACHE   : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_RAM_LENGTH} - (0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}) -
> ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH}, LENGTH =
> ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH}
> +    RAM_MMU   : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_RAM_LENGTH} - (0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}), LENGTH = 0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}
>    }
>
>    REGION_ALIAS ("REGION_START",          RAM);
> diff --git a/spec/build/bsps/aarch64/xilinx-zynqmp/linkcmds_lp64.yml
> b/spec/build/bsps/aarch64/xilinx-zynqmp/linkcmds_lp64.yml
> index d9696be5d4..4a26c59944 100644
> --- a/spec/build/bsps/aarch64/xilinx-zynqmp/linkcmds_lp64.yml
> +++ b/spec/build/bsps/aarch64/xilinx-zynqmp/linkcmds_lp64.yml
> @@ -30,9 +30,9 @@ content: |
>     */
>
>    MEMORY {
> -    RAM       : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_LOAD_OFFSET}, LENGTH = ${BSP_XILINX_ZYNQMP_RAM_LENGTH}
> - ${BSP_XILINX_ZYNQMP_LOAD_OFFSET} - ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH} -
> (0x4000 * ${AARCH64_MMU_TRANSLATION_TABLE_PAGES})
> -    NOCACHE   : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_RAM_LENGTH} - (0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}) -
> ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH}, LENGTH =
> ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH}
> -    RAM_MMU   : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_RAM_LENGTH} - (0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}), LENGTH = 0x4000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}
> +    RAM       : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_LOAD_OFFSET}, LENGTH = ${BSP_XILINX_ZYNQMP_RAM_LENGTH}
> - ${BSP_XILINX_ZYNQMP_LOAD_OFFSET} - ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH} -
> (0x1000 * ${AARCH64_MMU_TRANSLATION_TABLE_PAGES})
> +    NOCACHE   : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_RAM_LENGTH} - (0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}) -
> ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH}, LENGTH =
> ${BSP_XILINX_ZYNQMP_NOCACHE_LENGTH}
> +    RAM_MMU   : ORIGIN = ${BSP_XILINX_ZYNQMP_RAM_BASE} +
> ${BSP_XILINX_ZYNQMP_RAM_LENGTH} - (0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}), LENGTH = 0x1000 *
> ${AARCH64_MMU_TRANSLATION_TABLE_PAGES}
>    }
>
>    REGION_ALIAS ("REGION_START",          RAM);
> --
> 2.30.2
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20220705/58288e24/attachment.htm>


More information about the devel mailing list