• Laurentiu Tudor's avatar
    powerpc/booke: Fix boot crash due to null hugepd · 3fb66a70
    Laurentiu Tudor authored
    On 32-bit book-e machines, hugepd_ok() no longer takes into account null
    hugepd values, causing this crash at boot:
    
      Unable to handle kernel paging request for data at address 0x80000000
      ...
      NIP [c0018378] follow_huge_addr+0x38/0xf0
      LR [c001836c] follow_huge_addr+0x2c/0xf0
      Call Trace:
       follow_huge_addr+0x2c/0xf0 (unreliable)
       follow_page_mask+0x40/0x3e0
       __get_user_pages+0xc8/0x450
       get_user_pages_remote+0x8c/0x250
       copy_strings+0x110/0x390
       copy_strings_kernel+0x2c/0x50
       do_execveat_common+0x478/0x630
       do_execve+0x2c/0x40
       try_to_run_init_process+0x18/0x60
       kernel_init+0xbc/0x110
       ret_from_kernel_thread+0x5c/0x64
    
    This impacts all nxp (ex-freescale) 32-bit booke platforms.
    
    This was caused by the change of hugepd_t.pd from signed to unsigned,
    and the update to the nohash version of hugepd_ok(). Previously
    hugepd_ok() could exclude all non-huge and NULL pgds using > 0, whereas
    now we need to explicitly check that the value is not zero and also that
    PD_HUGE is *clear*.
    
    This isn't protected by the pgd_none() check in __find_linux_pte_or_hugepte()
    because on 32-bit we use pgtable-nopud.h, which causes the pgd_none()
    check to be always false.
    
    Fixes: 20717e1f ("powerpc/mm: Fix little-endian 4K hugetlb")
    Cc: stable@vger.kernel.org # v4.7+
    Reported-by: default avatarMadalin-Cristian Bucur <madalin.bucur@nxp.com>
    Signed-off-by: default avatarLaurentiu Tudor <laurentiu.tudor@nxp.com>
    [mpe: Flesh out change log details.]
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    3fb66a70
pgtable.h 7.31 KB