Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/aarch64 set kernel text/rodata readonly when not de...
details: https://anonhg.NetBSD.org/src/rev/a5a920e2ce58
branches: trunk
changeset: 365178:a5a920e2ce58
user: ryo <ryo%NetBSD.org@localhost>
date: Fri Aug 03 16:32:55 2018 +0000
description:
set kernel text/rodata readonly when not defined DDB.
set readonly segment on 2Mbytes aligned. (kernel image is mapped with 2Mbytes L2 block)
diffstat:
sys/arch/aarch64/aarch64/genassym.cf | 4 ++-
sys/arch/aarch64/aarch64/locore.S | 41 +++++++++++++++++++++++++++++++++--
sys/arch/aarch64/conf/kern.ldscript | 10 ++++++--
3 files changed, 48 insertions(+), 7 deletions(-)
diffs (106 lines):
diff -r c109ce295346 -r a5a920e2ce58 sys/arch/aarch64/aarch64/genassym.cf
--- a/sys/arch/aarch64/aarch64/genassym.cf Fri Aug 03 16:31:04 2018 +0000
+++ b/sys/arch/aarch64/aarch64/genassym.cf Fri Aug 03 16:32:55 2018 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.5 2018/07/17 10:01:59 ryo Exp $
+# $NetBSD: genassym.cf,v 1.6 2018/08/03 16:32:55 ryo Exp $
#-
# Copyright (c) 2014 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -120,6 +120,8 @@
define LX_BLKPAG_UXN LX_BLKPAG_UXN
define LX_BLKPAG_PXN LX_BLKPAG_PXN
define LX_BLKPAG_AF LX_BLKPAG_AF
+define LX_BLKPAG_AP LX_BLKPAG_AP
+define LX_BLKPAG_AP_RO LX_BLKPAG_AP_RO
define LX_BLKPAG_AP_RW LX_BLKPAG_AP_RW
define LX_BLKPAG_SH_IS LX_BLKPAG_SH_IS
define LX_BLKPAG_ATTR_INDX_0 LX_BLKPAG_ATTR_INDX_0
diff -r c109ce295346 -r a5a920e2ce58 sys/arch/aarch64/aarch64/locore.S
--- a/sys/arch/aarch64/aarch64/locore.S Fri Aug 03 16:31:04 2018 +0000
+++ b/sys/arch/aarch64/aarch64/locore.S Fri Aug 03 16:32:55 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.13 2018/07/17 18:08:36 christos Exp $ */
+/* $NetBSD: locore.S,v 1.14 2018/08/03 16:32:55 ryo Exp $ */
/*
* Copyright (c) 2017 Ryo Shimizu <ryo%nerv.org@localhost>
@@ -35,7 +35,7 @@
#include <aarch64/hypervisor.h>
#include "assym.h"
-RCSID("$NetBSD: locore.S,v 1.13 2018/07/17 18:08:36 christos Exp $")
+RCSID("$NetBSD: locore.S,v 1.14 2018/08/03 16:32:55 ryo Exp $")
/* #define DEBUG_LOCORE */
/* #define DEBUG_MMU */
@@ -650,9 +650,44 @@
lsr x4, x4, #L2_SHIFT
bl l2_setblocks
+#ifndef DDB
+ /* map READONLY from VM_MIN_KERNEL_ADDRESS to __data_start */
+ VERBOSE("Set kernel text/rodata READONLY\r\n")
+ ldr x3, =__data_start
+ ands x0, x3, #(L2_SIZE - 1)
+ beq 1f
+ ldr x1, =_erodata
+ and x1, x1, #L2_ADDR_BITS /* _erodata & L2_ADDR_BIT */
+ and x0, x3, #L2_ADDR_BITS /* __data_start & L2_ADDR_BIT */
+ cmp x0, x1
+ bne 1f
+ /* __data_start and _erodata are in same L2 block */
+ PRINT("Warning: data section not aligned on size of L2 block\r\n")
+1:
+ /* x3 = l2pde_index(__data_start) */
+ and x3, x3, #L2_ADDR_BITS
+ lsr x3, x3, #L2_SHIFT
+
+ /* x2 = l2pde_inex(VM_MIN_KERNEL_ADDRESS) */
+ mov x2, #VM_MIN_KERNEL_ADDRESS
+ and x2, x2, #L2_ADDR_BITS
+ lsr x2, x2, #L2_SHIFT
+
+ ADDR x1, ttbr1_l2table_kva
+ b 9f
+1:
+ ldr x0, [x1, x2, lsl #3] /* x0 = l2table[x2] */
+ and x0, x0, #~LX_BLKPAG_AP
+ orr x0, x0, #LX_BLKPAG_AP_RO
+ str x0, [x1, x2, lsl #3] /* l2table[x2] = x0 */
+ add x2, x2, #1
+9:
+ cmp x2, x3
+ blo 1b
+#endif
+
VERBOSE("Creating devmap tables\r\n")
/* devmap=PA table for L1 */
-nop
ADDR x0, ttbr1_l1table_kva
ldr x1, .L_devmap_addr
ADDR x2, ttbr1_l2table_devmap
diff -r c109ce295346 -r a5a920e2ce58 sys/arch/aarch64/conf/kern.ldscript
--- a/sys/arch/aarch64/conf/kern.ldscript Fri Aug 03 16:31:04 2018 +0000
+++ b/sys/arch/aarch64/conf/kern.ldscript Fri Aug 03 16:32:55 2018 +0000
@@ -1,3 +1,5 @@
+#include "assym.h"
+
/* Default linker script, for normal executables */
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-bigaarch64",
"elf64-littleaarch64")
@@ -30,9 +32,11 @@
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
- /* Adjust the address for the data segment. We want to adjust up to
- the same address within the page on the next page up. */
- . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
+ /* Adjust the address for the data segment. Move .data to the next L2 block,
+ and .text and .rodata will be set readonly if needed. */
+ PROVIDE (_erodata = .);
+ . = ALIGN (L2_SIZE);
+ . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
/* Exception handling */
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) }
.gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
Home |
Main Index |
Thread Index |
Old Index