lkml.org 
[lkml]   [2008]   [Jan]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [5/31] Don't drop NX bit in pte modifier functions for 32bit
    Date

    The pte_* modifier functions that cleared bits dropped the NX bit on 32bit
    PAE because they only worked in int, but NX is in bit 63. Fix that
    by adding appropiate casts so that the arithmetic happens as long long
    on PAE kernels.

    I decided to just use 64bit arithmetic instead of open coding like
    pte_modify() because gcc should generate good enough code for that now.

    While this looks in theory like a .24 candidate this might trigger
    some subtle latent bugs so it's better to delay it for .25 for more
    testing.

    Signed-off-by: Andi Kleen <ak@suse.de>

    ---
    include/asm-x86/pgtable.h | 12 ++++++------
    1 file changed, 6 insertions(+), 6 deletions(-)

    Index: linux/include/asm-x86/pgtable.h
    ===================================================================
    --- linux.orig/include/asm-x86/pgtable.h
    +++ linux/include/asm-x86/pgtable.h
    @@ -141,17 +141,17 @@ static inline int pmd_large(pmd_t pte) {
    (_PAGE_PSE|_PAGE_PRESENT);
    }

    -static inline pte_t pte_mkclean(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_DIRTY); }
    -static inline pte_t pte_mkold(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_ACCESSED); }
    -static inline pte_t pte_wrprotect(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_RW); }
    -static inline pte_t pte_mkexec(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_NX); }
    +static inline pte_t pte_mkclean(pte_t pte) { return __pte(pte_val(pte) & ~(pteval_t)_PAGE_DIRTY); }
    +static inline pte_t pte_mkold(pte_t pte) { return __pte(pte_val(pte) & ~(pteval_t)_PAGE_ACCESSED); }
    +static inline pte_t pte_wrprotect(pte_t pte) { return __pte(pte_val(pte) & ~(pteval_t)_PAGE_RW); }
    +static inline pte_t pte_mkexec(pte_t pte) { return __pte(pte_val(pte) & ~(pteval_t)_PAGE_NX); }
    static inline pte_t pte_mkdirty(pte_t pte) { return __pte(pte_val(pte) | _PAGE_DIRTY); }
    static inline pte_t pte_mkyoung(pte_t pte) { return __pte(pte_val(pte) | _PAGE_ACCESSED); }
    static inline pte_t pte_mkwrite(pte_t pte) { return __pte(pte_val(pte) | _PAGE_RW); }
    static inline pte_t pte_mkhuge(pte_t pte) { return __pte(pte_val(pte) | _PAGE_PSE); }
    -static inline pte_t pte_clrhuge(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_PSE); }
    +static inline pte_t pte_clrhuge(pte_t pte) { return __pte(pte_val(pte) & ~(pteval_t)_PAGE_PSE); }
    static inline pte_t pte_mkglobal(pte_t pte) { return __pte(pte_val(pte) | _PAGE_GLOBAL); }
    -static inline pte_t pte_clrglobal(pte_t pte) { return __pte(pte_val(pte) & ~_PAGE_GLOBAL); }
    +static inline pte_t pte_clrglobal(pte_t pte) { return __pte(pte_val(pte) & ~(pteval_t)_PAGE_GLOBAL); }

    extern pteval_t __supported_pte_mask;


    \
     
     \ /
      Last update: 2008-01-14 23:21    [W:4.263 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site