| Submitter | Siarhei Liakh |
|---|---|
| Date | 2009-10-13 01:03:17 |
| Message ID | <817ecb6f0910121803p52a4049ep4a712545d28bba76@mail.gmail.com> |
| Download | mbox | patch |
| Permalink | /patch/53269/ |
| State | New |
| Headers | show |
Comments
On Mon, 12 Oct 2009 21:03:17 -0400 Siarhei Liakh <sliakh.lkml@gmail.com> wrote: > This patch expands functionality of CONFIG_DEBUG_RODATA to set main > (static) kernel data area as NX. > The following steps are taken to achieve this: > 1. Linker script is adjusted so .text always starts and ends on a > page boundary 2. Linker script is adjusted so .rodata and .data > always start and end on a page boundary > 3. void mark_nxdata_nx(void) added to arch/x86/mm/init.c with actual > functionality: NX is set for all pages from _etext through _end. > 4. mark_nxdata_nx() called from free_initmem() (after init has been > released) 5. free_init_pages() sets released memory NX in > arch/x86/mm/init.c > > The patch have been developed for Linux 2.6.31-rc7 x86 by Siarhei > Liakh <sliakh.lkml@gmail.com> and Xuxian Jiang <jiang@cs.ncsu.edu>. > I like doing this, but... maybe it is useful to have a diff of the pagetable dump (PT_DUMP config option) to show the effect, in the changelog. That'd be like the proof on the pudding...
* Arjan van de Ven <arjan@infradead.org> wrote: > On Mon, 12 Oct 2009 21:03:17 -0400 > Siarhei Liakh <sliakh.lkml@gmail.com> wrote: > > > This patch expands functionality of CONFIG_DEBUG_RODATA to set main > > (static) kernel data area as NX. > > The following steps are taken to achieve this: > > 1. Linker script is adjusted so .text always starts and ends on a > > page boundary 2. Linker script is adjusted so .rodata and .data > > always start and end on a page boundary > > 3. void mark_nxdata_nx(void) added to arch/x86/mm/init.c with actual > > functionality: NX is set for all pages from _etext through _end. > > 4. mark_nxdata_nx() called from free_initmem() (after init has been > > released) 5. free_init_pages() sets released memory NX in > > arch/x86/mm/init.c > > > > The patch have been developed for Linux 2.6.31-rc7 x86 by Siarhei > > Liakh <sliakh.lkml@gmail.com> and Xuxian Jiang <jiang@cs.ncsu.edu>. > > > > I like doing this, but... maybe it is useful to have a diff of the > pagetable dump (PT_DUMP config option) to show the effect, in the > changelog. That'd be like the proof on the pudding... That's a good suggestion. Siarhei Liakh, mind doing that? Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Siarhei Liakh <sliakh.lkml@gmail.com> wrote: > @@ -440,11 +441,29 @@ void free_init_pages(char *what, unsigned long > begin, unsigned long end) Your mail client is word wrapping your patches. David -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Siarhei Liakh <sliakh.lkml@gmail.com> wrote: > This patch expands functionality of CONFIG_DEBUG_RODATA to set main > (static) kernel data area as NX. > The following steps are taken to achieve this: > 1. Linker script is adjusted so .text always starts and ends on a page boundary > 2. Linker script is adjusted so .rodata and .data always start and > end on a page boundary > 3. void mark_nxdata_nx(void) added to arch/x86/mm/init.c with actual > functionality: NX is set for all pages from _etext through _end. > 4. mark_nxdata_nx() called from free_initmem() (after init has been released) > 5. free_init_pages() sets released memory NX in arch/x86/mm/init.c > > The patch have been developed for Linux 2.6.31-rc7 x86 by Siarhei Liakh > <sliakh.lkml@gmail.com> and Xuxian Jiang <jiang@cs.ncsu.edu>. > > V1: initial patch for 2.6.30 > V2: patch for 2.6.31-rc7 > V3: moved all code into arch/x86, adjusted credits > V4: fixed ifdef, removed credits from CREDITS > V5: fixed an address calculation bug in mark_nxdata_nx() > --- > > Signed-off-by: Siarhei Liakh <sliakh.lkml@gmail.com> > Signed-off-by: Xuxian Jiang <jiang@cs.ncsu.edu> That seems to fix the problem, thanks. Acked-by: David Howells <dhowells@redhat.com> -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Patch
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 78d185d..83ae734 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S @@ -43,14 +43,14 @@ jiffies_64 = jiffies; PHDRS { text PT_LOAD FLAGS(5); /* R_E */ - data PT_LOAD FLAGS(7); /* RWE */ + data PT_LOAD FLAGS(6); /* RW_ */ #ifdef CONFIG_X86_64 - user PT_LOAD FLAGS(7); /* RWE */ - data.init PT_LOAD FLAGS(7); /* RWE */ + user PT_LOAD FLAGS(6); /* RW_ */ + data.init PT_LOAD FLAGS(6); /* RW_ */ #ifdef CONFIG_SMP - percpu PT_LOAD FLAGS(7); /* RWE */ + percpu PT_LOAD FLAGS(6); /* RW_ */ #endif - data.init2 PT_LOAD FLAGS(7); /* RWE */ + data.init2 PT_LOAD FLAGS(6); /* RW_ */ #endif note PT_NOTE FLAGS(0); /* ___ */ } @@ -89,6 +89,8 @@ SECTIONS IRQENTRY_TEXT *(.fixup) *(.gnu.warning) + /* .text should occupy whole number of pages */ + . = ALIGN(PAGE_SIZE); /* End of text section */ _etext = .; } :text = 0x9090 @@ -151,6 +153,8 @@ SECTIONS .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { *(.data.read_mostly) + /* .data should occupy whole number of pages */ + . = ALIGN(PAGE_SIZE); /* End of data section */ _edata = .; } diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index 0607119..7bfd411 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c @@ -423,9 +423,10 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end) /* * We just marked the kernel text read only above, now that * we are going to free part of that, we need to make that - * writeable first. + * writeable and non-executable first. */ set_memory_rw(begin, (end - begin) >> PAGE_SHIFT); + set_memory_nx(begin, (end - begin) >> PAGE_SHIFT); printk(KERN_INFO "Freeing %s: %luk freed\n", what, (end - begin) >> 10);