lkml.org 
[lkml]   [2018]   [Aug]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/3] x86/mm/pti: Don't clear permissions in pti_clone_pmd()
    Date
    From: Joerg Roedel <jroedel@suse.de>

    The function sets the global-bit on cloned PMD entries,
    which only makes sense when the permissions are identical
    between the user and the kernel page-table.

    Further, only write-permissions are cleared for entry-text
    and kernel-text sections, which are not writeable anyway.

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    ---
    arch/x86/mm/pti.c | 11 +++++------
    1 file changed, 5 insertions(+), 6 deletions(-)

    diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c
    index 113ba14..5164c98 100644
    --- a/arch/x86/mm/pti.c
    +++ b/arch/x86/mm/pti.c
    @@ -291,7 +291,7 @@ static void __init pti_setup_vsyscall(void) { }
    #endif

    static void
    -pti_clone_pmds(unsigned long start, unsigned long end, pmdval_t clear)
    +pti_clone_pmds(unsigned long start, unsigned long end)
    {
    unsigned long addr;

    @@ -352,7 +352,7 @@ pti_clone_pmds(unsigned long start, unsigned long end, pmdval_t clear)
    * tables will share the last-level page tables of this
    * address range
    */
    - *target_pmd = pmd_clear_flags(*pmd, clear);
    + *target_pmd = *pmd;
    }
    }

    @@ -398,7 +398,7 @@ static void __init pti_clone_user_shared(void)
    start = CPU_ENTRY_AREA_BASE;
    end = start + (PAGE_SIZE * CPU_ENTRY_AREA_PAGES);

    - pti_clone_pmds(start, end, 0);
    + pti_clone_pmds(start, end);
    }
    #endif /* CONFIG_X86_64 */

    @@ -418,8 +418,7 @@ static void __init pti_setup_espfix64(void)
    static void pti_clone_entry_text(void)
    {
    pti_clone_pmds((unsigned long) __entry_text_start,
    - (unsigned long) __irqentry_text_end,
    - _PAGE_RW);
    + (unsigned long) __irqentry_text_end);
    }

    /*
    @@ -501,7 +500,7 @@ static void pti_clone_kernel_text(void)
    * pti_set_kernel_image_nonglobal() did to clear the
    * global bit.
    */
    - pti_clone_pmds(start, end_clone, _PAGE_RW);
    + pti_clone_pmds(start, end_clone);

    /*
    * pti_clone_pmds() will set the global bit in any PMDs
    --
    2.7.4
    \
     
     \ /
      Last update: 2018-08-07 12:25    [W:2.891 / U:0.444 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site