Split early startup code out of locore.S into locore0.S. Adjust link
authorderaadt <deraadt@openbsd.org>
Thu, 8 Jun 2017 05:35:23 +0000 (05:35 +0000)
committerderaadt <deraadt@openbsd.org>
Thu, 8 Jun 2017 05:35:23 +0000 (05:35 +0000)
run so that this locore0.o is always at the start of the executable.
But randomize the link order of all other .o files in the kernel, so
that their exec/rodata/data/bss segments land all over the place.

I haven't worked on the unmap/smashing of the startup code yet.

sys/arch/landisk/conf/Makefile.landisk
sys/arch/landisk/conf/files.landisk
sys/arch/landisk/landisk/locore.S
sys/arch/landisk/landisk/locore0.S [new file with mode: 0644]

index 411c903..d189c74 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile.landisk,v 1.62 2017/06/03 22:21:33 deraadt Exp $
+#      $OpenBSD: Makefile.landisk,v 1.63 2017/06/08 05:35:23 deraadt Exp $
 
 # For instructions on building kernels consult the config(8) and options(4)
 # manual pages.
@@ -31,9 +31,13 @@ CMACHFLAGS=  -m4-nofpu
 CMACHFLAGS+=   -fno-builtin-printf -fno-builtin-snprintf \
                -fno-builtin-vsnprintf -fno-builtin-log \
                -fno-builtin-log2 -fno-builtin-malloc ${NOPIE_FLAGS}
+SORTR=         sort -R
 .if ${IDENT:M-DNO_PROPOLICE}
 CMACHFLAGS+=   -fno-stack-protector
 .endif
+.if ${IDENT:M-DSMALL_KERNEL}
+SORTR=         cat
+.endif
 
 DEBUG?=                -g
 COPTS?=                -O2
@@ -67,13 +71,14 @@ NORMAL_S=   ${CC} ${AFLAGS} ${CPPFLAGS} -c $<
 #      ${SYSTEM_LD_HEAD}
 #      ${SYSTEM_LD} swapxxx.o
 #      ${SYSTEM_LD_TAIL}
-SYSTEM_HEAD=   locore.o param.o ioconf.o
-SYSTEM_OBJ=    ${SYSTEM_HEAD} ${OBJS}
+SYSTEM_HEAD=   locore0.o gap.o
+SYSTEM_OBJ=    ${SYSTEM_HEAD} ${OBJS} param.o ioconf.o
 SYSTEM_DEP=    Makefile ${SYSTEM_OBJ}
 SYSTEM_LD_HEAD=        @rm -f $@
 SYSTEM_LD=     @echo ${LD} ${LINKFLAGS} -o $@ '$${SYSTEM_HEAD} vers.o $${OBJS}'; \
                umask 007; \
-               ${LD} ${LINKFLAGS} -o $@ ${SYSTEM_HEAD} vers.o ${OBJS}
+               echo ${OBJS} param.o ioconf.o vers.o | tr " " "\n" | ${SORTR} > lorder; \
+               ${LD} ${LINKFLAGS} -o $@ ${SYSTEM_HEAD} `cat lorder`
 SYSTEM_LD_TAIL=        @${SIZE} $@
 
 .if ${DEBUG} == "-g"
@@ -117,8 +122,15 @@ vers.o: ${SYSTEM_DEP} ${SYSTEM_SWAP_DEP}
        sh $S/conf/newvers.sh
        ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} -c vers.c
 
+gap.S: ${SYSTEM_SWAP_DEP} Makefile
+       umask 007; sh $S/conf/makegap.sh 0xc3 > gap.S
+
+gap.o: gap.S
+       umask 007; ${CC} ${AFLAGS} ${CPPFLAGS} ${PROF} -c gap.S
+
 clean:
-       rm -f *bsd *bsd.gdb *.[dio] [a-z]*.s assym.* ${DB_STRUCTINFO} param.c
+       rm -f *bsd *bsd.gdb *.[dio] [a-z]*.s assym.* ${DB_STRUCTINFO} \
+           gap.S lorder param.c
 
 cleandir: clean
        rm -f Makefile *.h ioconf.c options machine ${_mach} vers.c
@@ -131,6 +143,7 @@ db_structinfo.h: $S/ddb/db_structinfo.c $S/ddb/parse_structinfo.pl
        rm -f db_structinfo.o
 
 locore.o: ${_machdir}/${_mach}/locore.S assym.h
+locore0.o: ${_machdir}/${_mach}/locore0.S assym.h
 locore_subr.o vectors.o in_cksum.o: assym.h
 
 # The install target can be redefined by putting a
index 5da93ef..ae5ea8b 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: files.landisk,v 1.12 2016/01/08 15:54:13 jcs Exp $
+#      $OpenBSD: files.landisk,v 1.13 2017/06/08 05:35:23 deraadt Exp $
 #      $NetBSD: files.landisk,v 1.2 2006/09/07 01:55:02 uwe Exp $
 
 # maxpartitions must be first item in files.${MACHINE}
@@ -20,6 +20,7 @@ file  arch/landisk/landisk/consinit.c
 file   arch/landisk/landisk/disksubr.c         disk
 file   arch/landisk/landisk/intr.c
 file   arch/landisk/landisk/machdep.c
+file   arch/landisk/landisk/locore.S
 
 #
 # System bus types
index 7a47a86..9b940f6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: locore.S,v 1.3 2008/06/26 05:42:11 ray Exp $  */
+/*     $OpenBSD: locore.S,v 1.4 2017/06/08 05:35:25 deraadt Exp $      */
 /*     $NetBSD: locore.S,v 1.1 2006/09/01 21:26:18 uwe Exp $   */
 
 /*-
 #include <sh/trap.h>
 #include <sh/mmu_sh4.h>
 
-/*
- * void start(int howto, void *bootinfo);
- *     Kernel entry point.
- */    
-NENTRY(start)
-ALTENTRY(kernel_text)
-       /* Set bootstrap stack pointer */
-       mov.l   _L.bootstrap_stack, r15
-
-       /* Mask all interrupt */
-       __INTR_MASK(r0, r1)
-
-       /* MMU off */
-       mov.l   _L.MMUCR, r0
-       xor     r1, r1
-       mov.l   r1, @r0
-       
-       /* Make sure to change register bank 0 */
-       mov     #0x20, r1
-       stc     sr, r0
-       swap.b  r1, r1
-       swap.w  r1, r1
-       not     r1, r1
-       and     r1, r0
-       ldc     r0, sr  /* SR.RB = 0 */
-
-       /* Go! */
-       mov.l   _L.landisk_startup, r0
-       jmp     @r0
-        nop
-
-       /* NOTREACHED */        
-       .align  2
-_L.landisk_startup:    .long   _C_LABEL(landisk_startup)
-_L.bootstrap_stack:    .long   _C_LABEL(start)
-_L.MMUCR:              .long   SH4_MMUCR
-
 ENTRY(getramsize)
        mov     #4, r0
        trapa   #0x3f
diff --git a/sys/arch/landisk/landisk/locore0.S b/sys/arch/landisk/landisk/locore0.S
new file mode 100644 (file)
index 0000000..29d710d
--- /dev/null
@@ -0,0 +1,72 @@
+/*     $OpenBSD: locore0.S,v 1.1 2017/06/08 05:35:25 deraadt Exp $     */
+/*     $NetBSD: locore.S,v 1.1 2006/09/01 21:26:18 uwe Exp $   */
+
+/*-
+ * Copyright (c) 2002 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "assym.h"
+
+#include <sh/asm.h>
+#include <sh/locore.h>
+#include <sh/trap.h>
+#include <sh/mmu_sh4.h>
+
+/*
+ * void start(int howto, void *bootinfo);
+ *     Kernel entry point.
+ */    
+NENTRY(start)
+ALTENTRY(kernel_text)
+       /* Set bootstrap stack pointer */
+       mov.l   _L.bootstrap_stack, r15
+
+       /* Mask all interrupt */
+       __INTR_MASK(r0, r1)
+
+       /* MMU off */
+       mov.l   _L.MMUCR, r0
+       xor     r1, r1
+       mov.l   r1, @r0
+       
+       /* Make sure to change register bank 0 */
+       mov     #0x20, r1
+       stc     sr, r0
+       swap.b  r1, r1
+       swap.w  r1, r1
+       not     r1, r1
+       and     r1, r0
+       ldc     r0, sr  /* SR.RB = 0 */
+
+       /* Go! */
+       mov.l   _L.landisk_startup, r0
+       jmp     @r0
+        nop
+
+       /* NOTREACHED */        
+       .align  2
+_L.landisk_startup:    .long   _C_LABEL(landisk_startup)
+_L.bootstrap_stack:    .long   _C_LABEL(start)
+_L.MMUCR:              .long   SH4_MMUCR