Module Name: src Committed By: maxv Date: Thu May 12 07:21:18 UTC 2016
Modified Files: src/sys/arch/amd64/amd64: locore.S src/sys/arch/amd64/conf: kern.ldscript Log Message: Map the rodata segment independently on amd64, and remove the W permission on it. To generate a diff of this commit: cvs rdiff -u -r1.87 -r1.88 src/sys/arch/amd64/amd64/locore.S cvs rdiff -u -r1.19 -r1.20 src/sys/arch/amd64/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/amd64/amd64/locore.S diff -u src/sys/arch/amd64/amd64/locore.S:1.87 src/sys/arch/amd64/amd64/locore.S:1.88 --- src/sys/arch/amd64/amd64/locore.S:1.87 Thu May 12 06:45:16 2016 +++ src/sys/arch/amd64/amd64/locore.S Thu May 12 07:21:18 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.87 2016/05/12 06:45:16 maxv Exp $ */ +/* $NetBSD: locore.S,v 1.88 2016/05/12 07:21:18 maxv Exp $ */ /* * Copyright-o-rama! @@ -564,6 +564,8 @@ no_NOX: * * (PROC0 STK + L4 + L3 + L2 + L1) is later referred to as BOOTSTRAP TABLES. * + * Important note: the kernel segments are properly 4k-aligned + * (see kern.ldscript), so there's no need to enforce alignment. */ /* Find end of kernel image; brings us on (1). */ @@ -616,16 +618,16 @@ no_NOX: shrl $(PGSHIFT-3),%ecx /* ((n >> PGSHIFT) << 3) for # PDEs */ addl %ecx,%ebx - /* - * Compute &__rodata_start - KERNBASE. This can't be > 4G, or we can't - * deal with it anyway, since we can't load it in 32 bit mode. So use - * the bottom 32 bits. - */ - movl $RELOC(__rodata_start),%edx - andl $~PGOFSET,%edx + /* Map the kernel text RX. */ + movl $RELOC(__rodata_start),%ecx + subl %eax,%ecx + shrl $PGSHIFT,%ecx + orl $(PG_V|PG_KR),%eax + fillkpt - /* Map the kernel text read-only. */ - movl %edx,%ecx + /* Map the kernel rodata ROX. */ + movl $RELOC(__rodata_start),%eax + movl $RELOC(__data_start),%ecx subl %eax,%ecx shrl $PGSHIFT,%ecx orl $(PG_V|PG_KR),%eax @@ -639,11 +641,12 @@ no_NOX: * +--------+----------+-------------------+------------------+ * We just map everything from < to > with RWX rights. */ - leal (PG_V|PG_KW)(%edx),%eax - movl $TABLESIZE,%ecx - addl %esi,%ecx /* end of tables */ - subl %edx,%ecx /* subtract end of text */ + movl $RELOC(__data_start),%eax + movl %esi,%ecx /* start of BOOTSTRAP TABLES */ + addl $TABLESIZE,%ecx /* end of BOOTSTRAP TABLES */ + subl %eax,%ecx /* subtract start of DATA */ shrl $PGSHIFT,%ecx + orl $(PG_V|PG_KW),%eax fillkpt /* We are on (4). Map ISA I/O mem (later atdevbase) RWX. */ Index: src/sys/arch/amd64/conf/kern.ldscript diff -u src/sys/arch/amd64/conf/kern.ldscript:1.19 src/sys/arch/amd64/conf/kern.ldscript:1.20 --- src/sys/arch/amd64/conf/kern.ldscript:1.19 Thu May 12 06:45:16 2016 +++ src/sys/arch/amd64/conf/kern.ldscript Thu May 12 07:21:18 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: kern.ldscript,v 1.19 2016/05/12 06:45:16 maxv Exp $ */ +/* $NetBSD: kern.ldscript,v 1.20 2016/05/12 07:21:18 maxv Exp $ */ #include "assym.h" @@ -36,6 +36,8 @@ SECTIONS *(.rodata.*) } + . = ALIGN(__PAGE_SIZE); + __data_start = . ; .data : {