Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -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
+26 −0
Original line number Original line Diff line number Diff line
@@ -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)
	 * 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


+10 −0
Original line number Original line Diff line number Diff line
@@ -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