diff options
author | Arjan van de Ven <arjan@linux.intel.com> | 2008-01-30 13:34:07 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 13:34:07 +0100 |
commit | 3c1df68b848b39270752ff8d4b956cc4a4dce0f6 (patch) | |
tree | 7edffa58f936a55fe6a69ca32cde71c0b9d20354 | |
parent | 488fd99588bf23da951b524a806e44feaa1aa366 (diff) | |
download | kernel_samsung_smdk4412-3c1df68b848b39270752ff8d4b956cc4a4dce0f6.zip kernel_samsung_smdk4412-3c1df68b848b39270752ff8d4b956cc4a4dce0f6.tar.gz kernel_samsung_smdk4412-3c1df68b848b39270752ff8d4b956cc4a4dce0f6.tar.bz2 |
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 <arjan@linux.intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/x86/mm/init_32.c | 7 | ||||
-rw-r--r-- | arch/x86/mm/init_64.c | 1 |
2 files changed, 8 insertions, 0 deletions
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 0d3369b..4d11565 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 9b69fa5..f97ace7 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); } |