• Dave Jones's avatar
    [PATCH] x86: change_page_attr() fix · f8af095d
    Dave Jones authored
    The 'make rodata read-only' patch in -mm exposes a latent bug in the 32-bit
    change_page_attr() function, which causes certain CPUs (Those with NX
    basically) to reboot instantly after pages are marked read-only.
    
    The same bug got fixed a while back on x86-64, but never got propagated to
    i386.
    
    Stuart Hayes from Dell also picked up on this last June, but it never got
    fixed, as the only thing affected by it aparently was the nvidia driver.
    
    Blatantly stealing description from his post..
    
    "It doesn't appear to be fixed (in the i386 arch).  The
     change_page_attr()/split_large_page() code will still still set all the
     4K PTEs to PAGE_KERNEL (setting the _PAGE_NX bit) when a large page
     needs to be split.
    
     This wouldn't be a problem for the bulk of the kernel memory, but there
     are pages in the lower 4MB of memory that's free, and are part of large
     executable pages that also contain kernel code.  If change_page_attr()
     is called on these, it will set the _PAGE_NX bit on the whole 2MB region
     that was covered by the large page, causing a large chunk of kernel code
     to be non-executable."
    Signed-off-by: default avatarArjan van de Ven <arjan@infradead.org>
    Signed-off-by: default avatarDave Jones <davej@redhat.com>
    Cc: <Stuart_Hayes@Dell.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    f8af095d
pageattr.c 5.81 KB