Commit 0c42f392 authored by Andi Kleen's avatar Andi Kleen Committed by Ingo Molnar

c_p_a(): do a simple self test at boot

When CONFIG_DEBUG_RODATA is enabled undo the ro mapping and redo it again.
This gives some simple testing for change_page_attr().
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Acked-by: default avatarJan Beulich <jbeulich@novell.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent b4416a1b
...@@ -204,4 +204,9 @@ config DEBUG_BOOT_PARAMS ...@@ -204,4 +204,9 @@ config DEBUG_BOOT_PARAMS
help help
This option will cause struct boot_params to be exported via debugfs. This option will cause struct boot_params to be exported via debugfs.
config CPA_DEBUG
bool "CPA self test code"
help
Do change_page_attr self tests at boot.
endmenu endmenu
...@@ -799,6 +799,20 @@ void mark_rodata_ro(void) ...@@ -799,6 +799,20 @@ void mark_rodata_ro(void)
change_page_attr(virt_to_page(start), change_page_attr(virt_to_page(start),
size >> PAGE_SHIFT, PAGE_KERNEL_RX); size >> PAGE_SHIFT, PAGE_KERNEL_RX);
printk("Write protecting the kernel text: %luk\n", size >> 10); printk("Write protecting the kernel text: %luk\n", size >> 10);
#ifdef CONFIG_CPA_DEBUG
global_flush_tlb();
printk("Testing CPA: Reverting %lx-%lx\n", start, start+size);
change_page_attr(virt_to_page(start), size>>PAGE_SHIFT,
PAGE_KERNEL_EXEC);
global_flush_tlb();
printk("Testing CPA: write protecting again\n");
change_page_attr(virt_to_page(start), size>>PAGE_SHIFT,
PAGE_KERNEL_RX);
global_flush_tlb();
#endif
} }
#endif #endif
start += size; start += size;
...@@ -815,6 +829,18 @@ void mark_rodata_ro(void) ...@@ -815,6 +829,18 @@ void mark_rodata_ro(void)
* of who is the culprit. * of who is the culprit.
*/ */
global_flush_tlb(); global_flush_tlb();
#ifdef CONFIG_CPA_DEBUG
printk("Testing CPA: undo %lx-%lx\n", start, start + size);
change_page_attr(virt_to_page(start), size >> PAGE_SHIFT,
PAGE_KERNEL);
global_flush_tlb();
printk("Testing CPA: write protecting again\n");
change_page_attr(virt_to_page(start), size >> PAGE_SHIFT,
PAGE_KERNEL_RO);
global_flush_tlb();
#endif
} }
#endif #endif
......
...@@ -606,6 +606,16 @@ void mark_rodata_ro(void) ...@@ -606,6 +606,16 @@ void mark_rodata_ro(void)
* of who is the culprit. * of who is the culprit.
*/ */
global_flush_tlb(); global_flush_tlb();
#ifdef CONFIG_CPA_DEBUG
printk("Testing CPA: undo %lx-%lx\n", start, end);
change_page_attr_addr(start, (end - start) >> PAGE_SHIFT, PAGE_KERNEL);
global_flush_tlb();
printk("Testing CPA: again\n");
change_page_attr_addr(start, (end - start) >> PAGE_SHIFT, PAGE_KERNEL_RO);
global_flush_tlb();
#endif
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment