Module Name:    src
Committed By:   ryo
Date:           Fri Aug  3 16:32:55 UTC 2018

Modified Files:
        src/sys/arch/aarch64/aarch64: genassym.cf locore.S
        src/sys/arch/aarch64/conf: kern.ldscript

Log Message:
set kernel text/rodata readonly when not defined DDB.
set readonly segment on 2Mbytes aligned. (kernel image is mapped with 2Mbytes 
L2 block)


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/aarch64/aarch64/genassym.cf
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/aarch64/aarch64/locore.S
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/aarch64/conf/kern.ldscript

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/aarch64/aarch64/genassym.cf
diff -u src/sys/arch/aarch64/aarch64/genassym.cf:1.5 src/sys/arch/aarch64/aarch64/genassym.cf:1.6
--- src/sys/arch/aarch64/aarch64/genassym.cf:1.5	Tue Jul 17 10:01:59 2018
+++ src/sys/arch/aarch64/aarch64/genassym.cf	Fri Aug  3 16:32:55 2018
@@ -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	L2_SIZE			L2_SIZE
 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

Index: src/sys/arch/aarch64/aarch64/locore.S
diff -u src/sys/arch/aarch64/aarch64/locore.S:1.13 src/sys/arch/aarch64/aarch64/locore.S:1.14
--- src/sys/arch/aarch64/aarch64/locore.S:1.13	Tue Jul 17 18:08:36 2018
+++ src/sys/arch/aarch64/aarch64/locore.S	Fri Aug  3 16:32:55 2018
@@ -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 <r...@nerv.org>
@@ -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 @@ arm_boot_l0pt_init:
 	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

Index: src/sys/arch/aarch64/conf/kern.ldscript
diff -u src/sys/arch/aarch64/conf/kern.ldscript:1.5 src/sys/arch/aarch64/conf/kern.ldscript:1.6
--- src/sys/arch/aarch64/conf/kern.ldscript:1.5	Sun Apr  1 04:35:03 2018
+++ src/sys/arch/aarch64/conf/kern.ldscript	Fri Aug  3 16:32:55 2018
@@ -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 @@ SECTIONS
   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.*) }

Reply via email to