lkml.org 
[lkml]   [2018]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 29/39] x86/mm/pti: Introduce pti_finalize()
    Date
    From: Joerg Roedel <jroedel@suse.de>

    Introduce a new function to finalize the kernel mappings for
    the userspace page-table after all ro/nx protections have been
    applied to the kernel mappings.

    Also move the call to pti_clone_kernel_text() to that
    function so that it will run on 32 bit kernels too.

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    ---
    arch/x86/include/asm/pti.h | 3 +--
    arch/x86/mm/init_64.c | 6 ------
    arch/x86/mm/pti.c | 14 +++++++++++++-
    include/linux/pti.h | 1 +
    init/main.c | 7 +++++++
    5 files changed, 22 insertions(+), 9 deletions(-)

    diff --git a/arch/x86/include/asm/pti.h b/arch/x86/include/asm/pti.h
    index 38a17f1..5df09a0 100644
    --- a/arch/x86/include/asm/pti.h
    +++ b/arch/x86/include/asm/pti.h
    @@ -6,10 +6,9 @@
    #ifdef CONFIG_PAGE_TABLE_ISOLATION
    extern void pti_init(void);
    extern void pti_check_boottime_disable(void);
    -extern void pti_clone_kernel_text(void);
    +extern void pti_finalize(void);
    #else
    static inline void pti_check_boottime_disable(void) { }
    -static inline void pti_clone_kernel_text(void) { }
    #endif

    #endif /* __ASSEMBLY__ */
    diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
    index a688617..9b19f9a 100644
    --- a/arch/x86/mm/init_64.c
    +++ b/arch/x86/mm/init_64.c
    @@ -1291,12 +1291,6 @@ void mark_rodata_ro(void)
    (unsigned long) __va(__pa_symbol(_sdata)));

    debug_checkwx();
    -
    - /*
    - * Do this after all of the manipulation of the
    - * kernel text page tables are complete.
    - */
    - pti_clone_kernel_text();
    }

    int kern_addr_valid(unsigned long addr)
    diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c
    index fc77054..1825f30 100644
    --- a/arch/x86/mm/pti.c
    +++ b/arch/x86/mm/pti.c
    @@ -462,7 +462,7 @@ static inline bool pti_kernel_image_global_ok(void)
    * For some configurations, map all of kernel text into the user page
    * tables. This reduces TLB misses, especially on non-PCID systems.
    */
    -void pti_clone_kernel_text(void)
    +static void pti_clone_kernel_text(void)
    {
    /*
    * rodata is part of the kernel image and is normally
    @@ -526,3 +526,15 @@ void __init pti_init(void)
    pti_setup_espfix64();
    pti_setup_vsyscall();
    }
    +
    +/*
    + * Finalize the kernel mappings in the userspace page-table.
    + */
    +void pti_finalize(void)
    +{
    + /*
    + * Do this after all of the manipulation of the
    + * kernel text page tables are complete.
    + */
    + pti_clone_kernel_text();
    +}
    diff --git a/include/linux/pti.h b/include/linux/pti.h
    index 0174883..1a941ef 100644
    --- a/include/linux/pti.h
    +++ b/include/linux/pti.h
    @@ -6,6 +6,7 @@
    #include <asm/pti.h>
    #else
    static inline void pti_init(void) { }
    +static inline void pti_finalize(void) { }
    #endif

    #endif
    diff --git a/init/main.c b/init/main.c
    index 3b4ada1..fcfef46 100644
    --- a/init/main.c
    +++ b/init/main.c
    @@ -1065,6 +1065,13 @@ static int __ref kernel_init(void *unused)
    jump_label_invalidate_initmem();
    free_initmem();
    mark_readonly();
    +
    + /*
    + * Kernel mappings are now finalized - update the userspace page-table
    + * to finalize PTI.
    + */
    + pti_finalize();
    +
    system_state = SYSTEM_RUNNING;
    numa_default_policy();

    --
    2.7.4
    \
     
     \ /
      Last update: 2018-07-11 13:31    [W:4.125 / U:0.304 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site