Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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()

+9 -6
+5 -2
arch/arm64/kernel/head.S
··· 289 289 adr_l x1, __hyp_text_end 290 290 adr_l x2, dcache_clean_poc 291 291 blr x2 292 + 293 + mov_q x0, INIT_SCTLR_EL2_MMU_OFF 294 + pre_disable_mmu_workaround 295 + msr sctlr_el2, x0 296 + isb 292 297 0: 293 298 mov_q x0, HCR_HOST_NVHE_FLAGS 294 299 ··· 328 323 cbz x0, 2f 329 324 330 325 /* Set a sane SCTLR_EL1, the VHE way */ 331 - pre_disable_mmu_workaround 332 326 msr_s SYS_SCTLR_EL12, x1 333 327 mov x2, #BOOT_CPU_FLAG_E2H 334 328 b 3f 335 329 336 330 2: 337 - pre_disable_mmu_workaround 338 331 msr sctlr_el1, x1 339 332 mov x2, xzr 340 333 3:
+4 -1
arch/arm64/mm/hugetlbpage.c
··· 276 276 pte_t *ptep = NULL; 277 277 278 278 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 + 280 283 pudp = pud_alloc(mm, p4dp, addr); 281 284 if (!pudp) 282 285 return NULL;
-3
arch/arm64/mm/pageattr.c
··· 219 219 pte_t *ptep; 220 220 unsigned long addr = (unsigned long)page_address(page); 221 221 222 - if (!can_set_direct_map()) 223 - return true; 224 - 225 222 pgdp = pgd_offset_k(addr); 226 223 if (pgd_none(READ_ONCE(*pgdp))) 227 224 return false;