Skip to content

Commit 28becb2

Browse files
ardbiesheuvelwilldeacon
authored andcommitted
arm64: mm: Permit contiguous attribute for preliminary mappings
There are a few cases where we omit the contiguous hint for mappings that start out as read-write and are remapped read-only later, on the basis that manipulating live descriptors with the PTE_CONT attribute set is unsafe. When support for the contiguous hint was added to the code, the ARM ARM was ambiguous about this, and so we erred on the side of caution. In the meantime, this has been clarified [0], and regions that will be remapped in their entirety, retaining the contiguous bit on all entries, can use the contiguous hint both in the initial mapping as well as the one that replaces it. Note that this requires that the logic that may be called to remap overlapping regions respects existing valid descriptors that have the contiguous bit cleared. So omit the NO_CONT_MAPPINGS flag in places where it is unneeded. [0] RJQQTC For a TLB lookup in a contiguous region mapped by translation table entries that have consistent values for the Contiguous bit, but have the OA, attributes, or permissions misprogrammed, that TLB lookup is permitted to produce an OA, access permissions, and memory attributes that are consistent with any one of the programmed translation table values. Reviewed-by: Kevin Brodsky <kevin.brodsky@arm.com> Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Will Deacon <will@kernel.org>
1 parent dfd73e5 commit 28becb2

1 file changed

Lines changed: 3 additions & 7 deletions

File tree

arch/arm64/mm/mmu.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,8 +1016,7 @@ void __init create_mapping_noalloc(phys_addr_t phys, unsigned long virt,
10161016
&phys, virt);
10171017
return;
10181018
}
1019-
early_create_pgd_mapping(init_mm.pgd, phys, virt, size, prot, NULL,
1020-
NO_CONT_MAPPINGS);
1019+
early_create_pgd_mapping(init_mm.pgd, phys, virt, size, prot, NULL, 0);
10211020
}
10221021

10231022
void __init create_pgd_mapping(struct mm_struct *mm, phys_addr_t phys,
@@ -1044,8 +1043,7 @@ static void update_mapping_prot(phys_addr_t phys, unsigned long virt,
10441043
return;
10451044
}
10461045

1047-
early_create_pgd_mapping(init_mm.pgd, phys, virt, size, prot, NULL,
1048-
NO_CONT_MAPPINGS);
1046+
early_create_pgd_mapping(init_mm.pgd, phys, virt, size, prot, NULL, 0);
10491047

10501048
/* flush the TLBs after updating live kernel mappings */
10511049
flush_tlb_kernel_range(virt, virt + size);
@@ -1191,10 +1189,8 @@ static void __init map_mem(void)
11911189
* alternative patching has completed). This makes the contents
11921190
* of the region accessible to subsystems such as hibernate,
11931191
* but protects it from inadvertent modification or execution.
1194-
* Note that contiguous mappings cannot be remapped in this way,
1195-
* so we should avoid them here.
11961192
*/
1197-
__map_memblock(kernel_start, kernel_end, PAGE_KERNEL, NO_CONT_MAPPINGS);
1193+
__map_memblock(kernel_start, kernel_end, PAGE_KERNEL, 0);
11981194
memblock_clear_nomap(kernel_start, kernel_end - kernel_start);
11991195
}
12001196

0 commit comments

Comments
 (0)