• Mark Rutland's avatar
    arm64: fix fixmap copy for 16K pages and 48-bit VA · b333b0ba
    Mark Rutland authored
    With 16K pages and 48-bit VAs, the PGD level of table has two entries,
    and so the fixmap shares a PGD with the kernel image. Since commit:
    
      f9040773 ("arm64: move kernel image to base of vmalloc area")
    
    ... we copy the existing fixmap to the new fine-grained page tables at
    the PUD level in this case. When walking to the new PUD, we forgot to
    offset the PGD entry and always used the PGD entry at index 0, but this
    worked as the kernel image and fixmap were in the low half of the TTBR1
    address space.
    
    As of commit:
    
      14c127c9 ("arm64: mm: Flip kernel VA space")
    
    ... the kernel image and fixmap are in the high half of the TTBR1
    address space, and hence use the PGD at index 1, but we didn't update
    the fixmap copying code to account for this.
    
    Thus, we'll erroneously try to copy the fixmap slots into a PUD under
    the PGD entry at index 0. At the point we do so this PGD entry has not
    been initialised, and thus we'll try to write a value to a small offset
    from physical address 0, causing a number of potential problems.
    
    Fix this be correctly offsetting the PGD. This is split over a few steps
    for legibility.
    
    Fixes: 14c127c9 ("arm64: mm: Flip kernel VA space")
    Reported-by: default avatarAnshuman Khandual <anshuman.khandual@arm.com>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarMarc Zyngier <maz@kernel.org>
    Tested-by: default avatarMarc Zyngier <maz@kernel.org>
    Acked-by: default avatarSteve Capper <Steve.Capper@arm.com>
    Tested-by: default avatarSteve Capper <Steve.Capper@arm.com>
    Tested-by: default avatarAnshuman Khandual <anshuman.khandual@arm.com>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    b333b0ba
mmu.c 28.1 KB