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)
committerAlex Shi <alex.shi@linaro.org>
Thu, 23 Mar 2017 08:30:11 +0000 (16:30 +0800)
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>
(cherry picked from commit 32fb2fc5c357fb99616bbe100dbcb27bc7f5d045)
Signed-off-by: Alex Shi <alex.shi@linaro.org>
include/asm-generic/vmlinux.lds.h

index 772c784ba76301dbceca9f3c0991c626a893e076..33eb2fe23071978ed95e41c5308d8d9f57674a3c 100644 (file)
        . = ALIGN(align);                                               \
        *(.data..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) = .;         \