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.*) }