x86/mm: A _PAGE_NX fixlet and a kmap cleanup
Andy Lutomirski
maintainerv2 cover x86/mm: A _PAGE_NX fixlet and a kmap cleanup
The fixlet might help with some WX warnings. The kmap cleanup is just a cleanup.
This is very lightly tested.
Changes from v1:
- Rebased on top of the cpu_has_xyz cleanups.
Andy Lutomirski (2):
x86_32/mm: Set NX in __supported_pte_mask before enabling paging x86/mm: Make kmap_prot into a #define
arch/x86/include/asm/fixmap.h | 2 +- arch/x86/kernel/head_32.S | 6 ++++++ arch/x86/mm/init_32.c | 3 --- arch/x86/mm/setup_nx.c | 5 ++--- 4 files changed, 9 insertions(+), 7 deletions(-)
Signature · 1 line
2.5.0
Andy Lutomirski
maintainerPATCH v2 1/2 x86_32/mm: Set NX in __supported_pte_mask before enabling paging
There's a short window in which very early mappings can end up with NX clear because they are created before we've noticed that we have NX.
It turns out that we detect NX very early, so there's no need to defer __supported_pte_mask setup.
--- arch/x86/kernel/head_32.S | 6 ++++++ arch/x86/mm/setup_nx.c | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-)
arch/x86/kernel/head_32.S +6 -0
@@ -389,6 +389,12 @@ default_entry: /* Make changes effective */ wrmsr + /* + * And make sure that all the mappings we set up have NX set from + * the beginning. + */ + orl $(1 << (_PAGE_BIT_NX - 32)), pa(__supported_pte_mask + 4) + enable_paging: /*
arch/x86/mm/setup_nx.c +2 -3
@@ -31,9 +31,8 @@ early_param("noexec", noexec_setup);void x86_configure_nx (void ) { -if (boot_cpu_has (X86_FEATURE_NX ) && !disable_nx) - __supported_pte_mask |= _PAGE_NX; -else +/* If disable_nx is set, clear NX on all new mappings going forward. */ +if (disable_nx) __supported_pte_mask &= ~_PAGE_NX; }
Signature · 1 line
2.5.0
tip-bot for Andy Lutomirski
merge bot[tip:x86/mm] x86/mm/32: Set NX in __supported_pte_mask before enabling paging
x86/mm/32: Set NX in __supported_pte_mask before enabling paging
Commit-ID: 320d25b6a05f8b73c23fc21025d2906ecdd2d4fc Gitweb: http://git.kernel.org/tip/320d25b6a05f8b73c23fc21025d2906ecdd2d4fc Author: Andy Lutomirski <[email protected]> AuthorDate: Tue, 19 Jan 2016 13:38:58 -0800 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 20 Jan 2016 11:39:14 +0100
x86/mm/32: Set NX in __supported_pte_mask before enabling paging
There's a short window in which very early mappings can end up with NX clear because they are created before we've noticed that we have NX.
It turns out that we detect NX very early, so there's no need to defer __supported_pte_mask setup.
--- arch/x86/kernel/head_32.S | 6 ++++++ arch/x86/mm/setup_nx.c | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-)
arch/x86/kernel/head_32.S +6 -0
@@ -389,6 +389,12 @@ default_entry: /* Make changes effective */ wrmsr + /* + * And make sure that all the mappings we set up have NX set from + * the beginning. + */ + orl $(1 << (_PAGE_BIT_NX - 32)), pa(__supported_pte_mask + 4) + enable_paging: /*
arch/x86/mm/setup_nx.c +2 -3
@@ -31,9 +31,8 @@ early_param("noexec", noexec_setup);void x86_configure_nx (void ) { -if (boot_cpu_has (X86_FEATURE_NX ) && !disable_nx) - __supported_pte_mask |= _PAGE_NX; -else +/* If disable_nx is set, clear NX on all new mappings going forward. */ +if (disable_nx) __supported_pte_mask &= ~_PAGE_NX; }
Andy Lutomirski
maintainerPATCH v2 2/2 x86/mm: Make kmap_prot into a #define
In reply to Andy LutomirskiThe value (once we initialize it) is a foregone conclusion. Make it a #define to save a tiny amount of text and data size and to make it more comprehensible.
--- arch/x86/include/asm/fixmap.h | 2 +- arch/x86/mm/init_32.c | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-)
arch/x86/include/asm/fixmap.h +1 -1
@@ -142,7 +142,7 @@ extern void reserve_top_address(unsigned long reserve);extern int fixmaps_set;extern pte_t *kmap_pte; -extern pgprot_t kmap_prot; +#define kmap_prot PAGE_KERNELextern pte_t *pkmap_page_table;void __native_set_fixmap (enum fixed_addresses idx,pte_t pte);
arch/x86/mm/init_32.c +0 -3
@@ -388,7 +388,6 @@ repeat: }pte_t *kmap_pte; -pgprot_t kmap_prot;static inline pte_t *kmap_get_fixmap_pte (unsigned long vaddr) {
@@ -405,8 +404,6 @@ static void __init kmap_init(void)*/ kmap_vstart =__fix_to_virt (FIX_KMAP_BEGIN ); kmap_pte =kmap_get_fixmap_pte (kmap_vstart); - - kmap_prot =PAGE_KERNEL ; }#ifdef CONFIG_HIGHMEM
Signature · 1 line
2.5.0
tip-bot for Andy Lutomirski
merge bot[tip:x86/mm] x86/mm: Make kmap_prot into a #define
x86/mm: Make kmap_prot into a #define
Commit-ID: 7c360572b430a0e9757bafc0c20f26c920f2a07f Gitweb: http://git.kernel.org/tip/7c360572b430a0e9757bafc0c20f26c920f2a07f Author: Andy Lutomirski <[email protected]> AuthorDate: Tue, 19 Jan 2016 13:38:59 -0800 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 20 Jan 2016 11:39:14 +0100
x86/mm: Make kmap_prot into a #define
The value (once we initialize it) is a foregone conclusion. Make it a #define to save a tiny amount of text and data size and to make it more comprehensible.
--- arch/x86/include/asm/fixmap.h | 2 +- arch/x86/mm/init_32.c | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-)
arch/x86/include/asm/fixmap.h +1 -1
@@ -138,7 +138,7 @@ extern void reserve_top_address(unsigned long reserve);extern int fixmaps_set;extern pte_t *kmap_pte; -extern pgprot_t kmap_prot; +#define kmap_prot PAGE_KERNELextern pte_t *pkmap_page_table;void __native_set_fixmap (enum fixed_addresses idx,pte_t pte);
arch/x86/mm/init_32.c +0 -3
@@ -388,7 +388,6 @@ repeat: }pte_t *kmap_pte; -pgprot_t kmap_prot;static inline pte_t *kmap_get_fixmap_pte (unsigned long vaddr) {
@@ -405,8 +404,6 @@ static void __init kmap_init(void)*/ kmap_vstart =__fix_to_virt (FIX_KMAP_BEGIN ); kmap_pte =kmap_get_fixmap_pte (kmap_vstart); - - kmap_prot =PAGE_KERNEL ; }#ifdef CONFIG_HIGHMEM