• Thomas Gleixner's avatar
    x86/pti/32: Size initial_page_table correctly · f490e07c
    Thomas Gleixner authored
    Commit 945fd17a ("x86/cpu_entry_area: Sync cpu_entry_area to
    initial_page_table") introduced the sync for the initial page table for
    32bit.
    
    sync_initial_page_table() uses clone_pgd_range() which does the update for
    the kernel page table. If PTI is enabled it also updates the user space
    page table counterpart, which is assumed to be in the next page after the
    target PGD.
    
    At this point in time 32-bit did not have PTI support, so the user space
    page table update was not taking place.
    
    The support for PTI on 32-bit which was introduced later on, did not take
    that into account and missed to add the user space counter part for the
    initial page table.
    
    As a consequence sync_initial_page_table() overwrites any data which is
    located in the page behing initial_page_table causing random failures,
    e.g. by corrupting doublefault_tss and wreckaging the doublefault handler
    on 32bit.
    
    Fix it by adding a "user" page table right after initial_page_table.
    
    Fixes: 7757d607 ("x86/pti: Allow CONFIG_PAGE_TABLE_ISOLATION for x86_32")
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarJoerg Roedel <jroedel@suse.de>
    Cc: stable@kernel.org
    f490e07c
head_32.S 14.8 KB