diff options
| author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2016-06-07 06:20:51 -0400 |
|---|---|---|
| committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2016-06-13 09:58:22 -0400 |
| commit | 32fb2fc5c357fb99616bbe100dbcb27bc7f5d045 (patch) | |
| tree | 81e8a21e7687debcaf46d1af635f64c863262aeb /include/asm-generic | |
| parent | 64f31d5802af11fd87872b4bae07b35cf0acb358 (diff) | |
vmlinux.lds.h: allow arch specific handling of ro_after_init data section
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>
Diffstat (limited to 'include/asm-generic')
| -rw-r--r-- | include/asm-generic/vmlinux.lds.h | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 6a67ab94b553..c4436d072d37 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
| @@ -250,6 +250,14 @@ | |||
| 250 | VMLINUX_SYMBOL(__end_init_task) = .; | 250 | VMLINUX_SYMBOL(__end_init_task) = .; |
| 251 | 251 | ||
| 252 | /* | 252 | /* |
| 253 | * Allow architectures to handle ro_after_init data on their | ||
| 254 | * own by defining an empty RO_AFTER_INIT_DATA. | ||
| 255 | */ | ||
| 256 | #ifndef RO_AFTER_INIT_DATA | ||
| 257 | #define RO_AFTER_INIT_DATA *(.data..ro_after_init) | ||
| 258 | #endif | ||
| 259 | |||
| 260 | /* | ||
| 253 | * Read only Data | 261 | * Read only Data |
| 254 | */ | 262 | */ |
| 255 | #define RO_DATA_SECTION(align) \ | 263 | #define RO_DATA_SECTION(align) \ |
| @@ -257,7 +265,7 @@ | |||
| 257 | .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ | 265 | .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ |
| 258 | VMLINUX_SYMBOL(__start_rodata) = .; \ | 266 | VMLINUX_SYMBOL(__start_rodata) = .; \ |
| 259 | *(.rodata) *(.rodata.*) \ | 267 | *(.rodata) *(.rodata.*) \ |
| 260 | *(.data..ro_after_init) /* Read only after init */ \ | 268 | RO_AFTER_INIT_DATA /* Read only after init */ \ |
| 261 | *(__vermagic) /* Kernel version magic */ \ | 269 | *(__vermagic) /* Kernel version magic */ \ |
| 262 | . = ALIGN(8); \ | 270 | . = ALIGN(8); \ |
| 263 | VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .; \ | 271 | VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .; \ |
