[PATCH 4/6] arm64: head: clarify `compute_indices`

Ard Biesheuvel ardb at kernel.org
Tue May 17 23:47:42 PDT 2022


On Wed, 18 May 2022 at 05:17, Anshuman Khandual
<anshuman.khandual at arm.com> wrote:
>
> From: Mark Rutland <mark.rutland at arm.com>
>
> The logic in the `compute_indices` macro can be difficult to follow, as
> it transiently uses output operands for unrelated temporary values.
>
> Let's make this clearer by using a `tmp` parameter, and splitting the
> logic into commented blocks. By folding a MUL and ADD into a single MADD
> we avoid the need for a second temporary.
>
> As `ptrs` is sometimes a register and sometimes an immediate, we cannot
> simplify this much further at present. If it were always a register, we
> could remove redundant MOVs, and if it were always an immediate we could
> use `(\ptrs - 1)` as an immediate for the ANDs when extracting index
> bits (or replace the LSR; SUB; AND sequence with a single UBFX).
>
> There should be no funcitonal change as a result of this patch.
>
> Cc: Ard Biesheuvel <ardb at kernel.org>
> Cc: Catalin Marinas <catalin.marinas at arm.com>
> Cc: Will Deacon <will at kernel.org>
> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> Signed-off-by: Anshuman Khandual <anshuman.khandual at arm.com>

I have a patch out that simplifies this more comprehensively (similar
to what the final paragraph alludes to)

https://lore.kernel.org/linux-arm-kernel/20220411094824.4176877-6-ardb@kernel.org/

> ---
>  arch/arm64/kernel/head.S | 33 ++++++++++++++++++---------------
>  1 file changed, 18 insertions(+), 15 deletions(-)
>
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index b5d7dacbbb2c..01739f5ec3de 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -189,20 +189,23 @@ SYM_CODE_END(preserve_boot_args)
>   * Preserves:  vstart, vend, shift, ptrs
>   * Returns:    istart, iend, count
>   */
> -       .macro compute_indices, vstart, vend, shift, ptrs, istart, iend, count
> +       .macro compute_indices, vstart, vend, shift, ptrs, istart, iend, count, tmp
> +       // iend = (vend >> shift) & (ptrs - 1)
>         lsr     \iend, \vend, \shift
> -       mov     \istart, \ptrs
> -       sub     \istart, \istart, #1
> -       and     \iend, \iend, \istart   // iend = (vend >> shift) & (ptrs - 1)
> -       mov     \istart, \ptrs
> -       mul     \istart, \istart, \count
> -       add     \iend, \iend, \istart   // iend += count * ptrs
> -                                       // our entries span multiple tables
> +       mov     \tmp, \ptrs
> +       sub     \tmp, \tmp, #1
> +       and     \iend, \iend, \tmp
>
> +       // iend += count * ptrs
> +       // our entries span multiple tables
> +       mov     \tmp, \ptrs
> +       madd    \iend, \count, \tmp, \iend
> +
> +       // istart = (vend >> shift) & (ptrs - 1)
>         lsr     \istart, \vstart, \shift
> -       mov     \count, \ptrs
> -       sub     \count, \count, #1
> -       and     \istart, \istart, \count
> +       mov     \tmp, \ptrs
> +       sub     \tmp, \tmp, #1
> +       and     \istart, \istart, \tmp
>
>         sub     \count, \iend, \istart
>         .endm
> @@ -229,25 +232,25 @@ SYM_CODE_END(preserve_boot_args)
>         add \rtbl, \tbl, #PAGE_SIZE
>         mov \sv, \rtbl
>         mov \count, #0
> -       compute_indices \vstart, \vend, #PGDIR_SHIFT, \pgds, \istart, \iend, \count
> +       compute_indices \vstart, \vend, #PGDIR_SHIFT, \pgds, \istart, \iend, \count, \tmp
>         populate_entries \tbl, \rtbl, \istart, \iend, #PMD_TYPE_TABLE, #PAGE_SIZE, \tmp
>         mov \tbl, \sv
>         mov \sv, \rtbl
>
>  #if SWAPPER_PGTABLE_LEVELS > 3
> -       compute_indices \vstart, \vend, #PUD_SHIFT, #PTRS_PER_PUD, \istart, \iend, \count
> +       compute_indices \vstart, \vend, #PUD_SHIFT, #PTRS_PER_PUD, \istart, \iend, \count, \tmp
>         populate_entries \tbl, \rtbl, \istart, \iend, #PMD_TYPE_TABLE, #PAGE_SIZE, \tmp
>         mov \tbl, \sv
>         mov \sv, \rtbl
>  #endif
>
>  #if SWAPPER_PGTABLE_LEVELS > 2
> -       compute_indices \vstart, \vend, #SWAPPER_TABLE_SHIFT, #PTRS_PER_PMD, \istart, \iend, \count
> +       compute_indices \vstart, \vend, #SWAPPER_TABLE_SHIFT, #PTRS_PER_PMD, \istart, \iend, \count, \tmp
>         populate_entries \tbl, \rtbl, \istart, \iend, #PMD_TYPE_TABLE, #PAGE_SIZE, \tmp
>         mov \tbl, \sv
>  #endif
>
> -       compute_indices \vstart, \vend, #SWAPPER_BLOCK_SHIFT, #PTRS_PER_PTE, \istart, \iend, \count
> +       compute_indices \vstart, \vend, #SWAPPER_BLOCK_SHIFT, #PTRS_PER_PTE, \istart, \iend, \count, \tmp
>         bic \count, \phys, #SWAPPER_BLOCK_SIZE - 1
>         populate_entries \tbl, \count, \istart, \iend, \flags, #SWAPPER_BLOCK_SIZE, \tmp
>         .endm
> --
> 2.20.1
>



More information about the linux-arm-kernel mailing list