]> git.karo-electronics.de Git - linux-beck.git/commitdiff
vmlinux.lds.h: allow arch specific handling of ro_after_init data section
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 7 Jun 2016 10:20:51 +0000 (12:20 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 13 Jun 2016 13:58:22 +0000 (15:58 +0200)
commit c74ba8b3480d ("arch: Introduce post-init read-only memory")
introduced the __ro_after_init attribute which allows to add variables
to the ro_after_init data section.

This new section was added to rodata, even though it contains writable
data. This in turn causes problems on architectures which mark the
page table entries read-only that point to rodata very early.

This patch allows architectures to implement an own handling of the
.data..ro_after_init section.
Usually that would be:
- mark the rodata section read-only very early
- mark the ro_after_init section read-only within mark_rodata_ro

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
include/asm-generic/vmlinux.lds.h

index 6a67ab94b553363934bc9c2e07eb12d6c8a977f7..c4436d072d371bceea3ba788ecd295f2a0ab158d 100644 (file)
        *(.data..init_task)                                             \
        VMLINUX_SYMBOL(__end_init_task) = .;
 
+/*
+ * Allow architectures to handle ro_after_init data on their
+ * own by defining an empty RO_AFTER_INIT_DATA.
+ */
+#ifndef RO_AFTER_INIT_DATA
+#define RO_AFTER_INIT_DATA *(.data..ro_after_init)
+#endif
+
 /*
  * Read only Data
  */
        .rodata           : AT(ADDR(.rodata) - LOAD_OFFSET) {           \
                VMLINUX_SYMBOL(__start_rodata) = .;                     \
                *(.rodata) *(.rodata.*)                                 \
-               *(.data..ro_after_init) /* Read only after init */      \
+               RO_AFTER_INIT_DATA      /* Read only after init */      \
                *(__vermagic)           /* Kernel version magic */      \
                . = ALIGN(8);                                           \
                VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .;         \