lkml.org 
[lkml]   [2017]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.10 23/48] powerpc/booke: Fix boot crash due to null hugepd
    Date
    4.10-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Laurentiu Tudor <laurentiu.tudor@nxp.com>

    commit 3fb66a70a4ae886445743354e4b60e54058bb3ff upstream.

    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: 20717e1ff526 ("powerpc/mm: Fix little-endian 4K hugetlb")
    Reported-by: Madalin-Cristian Bucur <madalin.bucur@nxp.com>
    Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com>
    [mpe: Flesh out change log details.]
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/powerpc/include/asm/nohash/pgtable.h | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/arch/powerpc/include/asm/nohash/pgtable.h
    +++ b/arch/powerpc/include/asm/nohash/pgtable.h
    @@ -230,7 +230,7 @@ static inline int hugepd_ok(hugepd_t hpd
    return ((hpd_val(hpd) & 0x4) != 0);
    #else
    /* We clear the top bit to indicate hugepd */
    - return ((hpd_val(hpd) & PD_HUGE) == 0);
    + return (hpd_val(hpd) && (hpd_val(hpd) & PD_HUGE) == 0);
    #endif
    }


    \
     
     \ /
      Last update: 2017-03-16 15:37    [W:4.035 / U:0.356 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site