Skip to content

Commit 25ec51e

Browse files
committed
Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 fixes from Catalin Marinas: - Fix a kernel fault during page table walking in huge_pte_alloc() with PTABLE_LEVELS=5 due to using p4d_offset() instead of p4d_alloc() - head.S fix and cleanup to disable the MMU before toggling the HCR_EL2.E2H bit when entering the kernel with the MMU on from the EFI stub. Changing this bit (currently from VHE to nVHE) causes some system registers as well as page table descriptors to be interpreted differently, potentially resulting in spurious MMU faults - Fix translation fault in swsusp_save() accessing MEMBLOCK_NOMAP memory ranges due to kernel_page_present() returning true in most configurations other than rodata_full == true, CONFIG_DEBUG_PAGEALLOC=y or CONFIG_KFENCE=y * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: arm64: hibernate: Fix level3 translation fault in swsusp_save() arm64/head: Disable MMU at EL2 before clearing HCR_EL2.E2H arm64/head: Drop unnecessary pre-disable-MMU workaround arm64/hugetlb: Fix page table walk in huge_pte_alloc()
2 parents 3cdb455 + 50449ca commit 25ec51e

File tree

3 files changed

+9
-6
lines changed

3 files changed

+9
-6
lines changed

arch/arm64/kernel/head.S

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,11 @@ SYM_INNER_LABEL(init_el2, SYM_L_LOCAL)
289289
adr_l x1, __hyp_text_end
290290
adr_l x2, dcache_clean_poc
291291
blr x2
292+
293+
mov_q x0, INIT_SCTLR_EL2_MMU_OFF
294+
pre_disable_mmu_workaround
295+
msr sctlr_el2, x0
296+
isb
292297
0:
293298
mov_q x0, HCR_HOST_NVHE_FLAGS
294299

@@ -323,13 +328,11 @@ SYM_INNER_LABEL(init_el2, SYM_L_LOCAL)
323328
cbz x0, 2f
324329

325330
/* Set a sane SCTLR_EL1, the VHE way */
326-
pre_disable_mmu_workaround
327331
msr_s SYS_SCTLR_EL12, x1
328332
mov x2, #BOOT_CPU_FLAG_E2H
329333
b 3f
330334

331335
2:
332-
pre_disable_mmu_workaround
333336
msr sctlr_el1, x1
334337
mov x2, xzr
335338
3:

arch/arm64/mm/hugetlbpage.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,10 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma,
276276
pte_t *ptep = NULL;
277277

278278
pgdp = pgd_offset(mm, addr);
279-
p4dp = p4d_offset(pgdp, addr);
279+
p4dp = p4d_alloc(mm, pgdp, addr);
280+
if (!p4dp)
281+
return NULL;
282+
280283
pudp = pud_alloc(mm, p4dp, addr);
281284
if (!pudp)
282285
return NULL;

arch/arm64/mm/pageattr.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,6 @@ bool kernel_page_present(struct page *page)
219219
pte_t *ptep;
220220
unsigned long addr = (unsigned long)page_address(page);
221221

222-
if (!can_set_direct_map())
223-
return true;
224-
225222
pgdp = pgd_offset_k(addr);
226223
if (pgd_none(READ_ONCE(*pgdp)))
227224
return false;

0 commit comments

Comments
 (0)