From: Arjan van de Ven Date: Wed, 30 Jan 2008 12:34:07 +0000 (+0100) Subject: x86: make sure initmem is writable X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=3c1df68b848b39270752ff8d4b956cc4a4dce0f6;p=deliverable%2Flinux.git x86: make sure initmem is writable When we free initmem, various rodata and CPA checks may have left memory read only.. this patch ensures that the memory is writable before we free it. Signed-off-by: Arjan van de Ven Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner --- diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 0d3369b900e9..4d1156545194 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c @@ -780,6 +780,13 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end) { unsigned long addr; + /* + * 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. + */ + set_memory_rw(begin, (end - begin) >> PAGE_SHIFT); + for (addr = begin; addr < end; addr += PAGE_SIZE) { ClearPageReserved(virt_to_page(addr)); init_page_count(virt_to_page(addr)); diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 9b69fa54a831..f97ace7a55e5 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -570,6 +570,7 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end) * 2Mb kernel mapping just for this debug feature. */ if (begin >= __START_KERNEL_map) { + set_memory_rw(begin, (end - begin)/PAGE_SIZE); set_memory_np(begin, (end - begin)/PAGE_SIZE); set_memory_nx(begin, (end - begin)/PAGE_SIZE); }