|
@@ -498,6 +498,29 @@ void free_initmem(void)
|
|
|
printk ("Freeing unused kernel memory: %luk freed\n", (__init_end - __init_begin) >> 10);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_DEBUG_RODATA
|
|
|
+
|
|
|
+extern char __start_rodata, __end_rodata;
|
|
|
+void mark_rodata_ro(void)
|
|
|
+{
|
|
|
+ unsigned long addr = (unsigned long)&__start_rodata;
|
|
|
+
|
|
|
+ for (; addr < (unsigned long)&__end_rodata; addr += PAGE_SIZE)
|
|
|
+ change_page_attr_addr(addr, 1, PAGE_KERNEL_RO);
|
|
|
+
|
|
|
+ printk ("Write protecting the kernel read-only data: %luk\n",
|
|
|
+ (&__end_rodata - &__start_rodata) >> 10);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * change_page_attr_addr() requires a global_flush_tlb() call after it.
|
|
|
+ * We do this after the printk so that if something went wrong in the
|
|
|
+ * change, the printk gets out at least to give a better debug hint
|
|
|
+ * of who is the culprit.
|
|
|
+ */
|
|
|
+ global_flush_tlb();
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
|
void free_initrd_mem(unsigned long start, unsigned long end)
|
|
|
{
|