Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Oct 2008 06:55:07 GMT
From:      Oleksandr Tymoshenko <gonzo@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 152078 for review
Message-ID:  <200810280655.m9S6t7rd059745@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=152078

Change 152078 by gonzo@gonzo_jeeves on 2008/10/28 06:54:49

	Add some trampoline magic for MIPS: CFE on WRT160n does not 
	support ELF binaries, so we should use ELF trampoline to load 
	kernel:
	- .text start address is configurable like in arm tree
	- KERNVIRTADDR is not really relevant to MIPS because KSEG0
	    where kernel is usually loaded is directly mapped. So
	    there is no sense in [KERNPHYS/KERNVIRT]ADDR. These
	    two variables are converted to KERNLOADADDR and 
	    TRAMPLOADADDR
	- Default for KERNLOADADDR is 0x80001000. It's de-facto standard
	    for MIPS loaders. Previous value 0x80010000 was chosen by
	    me with extra-precautions in order not to overlap exception
	    vectors.
	- No compressed kernel support (yet)

Affected files ...

.. //depot/projects/mips2/src/sys/conf/Makefile.mips#15 edit
.. //depot/projects/mips2/src/sys/conf/ldscript.mips#10 edit
.. //depot/projects/mips2/src/sys/conf/options.mips#10 edit

Differences ...

==== //depot/projects/mips2/src/sys/conf/Makefile.mips#15 (text+ko) ====

@@ -28,35 +28,73 @@
 .endif
 .include "$S/conf/kern.pre.mk"
 
+SYSTEM_LD:= ${SYSTEM_LD:$S/conf/ldscript.$M=ldscript.$M}
+SYSTEM_DEP:= ${SYSTEM_DEP:$S/conf/ldscript.$M=ldscript.$M}
+
 # XXX: Such sweeping assumptions...
 MACHINE=mips
 MACHINE_ARCH=mips
+KERNLOADADDR?=0x80001000
+# This obscure value is defined by CFE for WR160N
+# To be changed later
+TRAMPLOADADDR?=0x807963c0
 
 MKMODULESENV+=	MACHINE=${MACHINE} MACHINE_ARCH=${MACHINE_ARCH}
 
 # We default to the MIPS32 ISA, if none specified in the
 # kernel configuration file.
 ARCH_FLAGS?=-march=mips32
+EXTRA_FLAGS=-fno-pic -mno-abicalls -mno-dsp -G0
 
 HACK_EXTRA_FLAGS=-shared
 .if defined(TARGET_BIG_ENDIAN)
 CFLAGS+=-EB
 SYSTEM_LD+=-EB
+EXTRA_FLAGS+=-EB 
+TRAMP_LDFLAGS+=-Wl,-EB 
 HACK_EXTRA_FLAGS+=-EB -Wl,-EB
 .else
 CFLAGS+=-EL
 SYSTEM_LD+=-EL
+EXTRA_FLAGS+=-EL
+TRAMP_LDFLAGS+=-Wl,-EL
 HACK_EXTRA_FLAGS+=-EL -Wl,-EL
 .endif
 
 # We add the -fno-pic flag to kernels because otherwise performance
 # is extremely poor, as well as -mno-abicalls to force no ABI usage.
-CFLAGS+=-fno-pic -mno-abicalls -G0 $(ARCH_FLAGS)
-HACK_EXTRA_FLAGS+=-fno-pic -mno-abicalls -G0 $(ARCH_FLAGS)
+CFLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
+HACK_EXTRA_FLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
 
 # XXX hardcoded kernel entry point
 ASM_CFLAGS+=${CFLAGS} -D_LOCORE -DLOCORE
 
+KERNEL_EXTRA=trampoline
+trampoline: ${KERNEL_KO}.tramp.bin
+${KERNEL_KO}.tramp.bin: ${KERNEL_KO} $S/$M/$M/elf_trampoline.c \
+	$S/$M/$M/inckern.S 
+	${OBJCOPY} --strip-symbol '$$d' --strip-symbol '$$a' \
+	-g --strip-symbol '$$t' ${FULLKERNEL} ${KERNEL_KO}.tmp
+	sed s/${KERNLOADADDR}/${TRAMPLOADADDR}/ ldscript.$M | \
+		sed s/" + SIZEOF_HEADERS"//  > ldscript.$M.tramp.noheader
+	# Generate .S file that setups stack and jumps to trampoline
+	echo "#include <machine/asm.h>" >tmphack.S
+	echo "ENTRY(_start)" >>tmphack.S
+	echo "la t0, kernel_end" >>tmphack.S
+	echo "move sp, t0" >>tmphack.S
+	echo "add sp, 0x2000" >>tmphack.S
+	echo "and sp, ~0x7" >>tmphack.S
+	echo "la t0, _startC" >>tmphack.S
+	echo "j t0" >>tmphack.S
+	echo "END(_start)" >>tmphack.S
+	echo "#define KERNNAME \"${KERNEL_KO}.tmp\""  >opt_kernname.h 
+	${CC} -O -nostdlib -I. -I$S ${EXTRA_FLAGS} ${TRAMP_LDFLAGS} -Xlinker \
+		-T -Xlinker ldscript.$M.tramp.noheader tmphack.S \
+		$S/$M/$M/elf_trampoline.c $S/$M/$M/inckern.S \
+		-o ${KERNEL_KO}.tramp.noheader 
+	${OBJCOPY} -S -O binary ${KERNEL_KO}.tramp.noheader \
+		${KERNEL_KO}.tramp.bin \
+
 %BEFORE_DEPEND
 
 %OBJS
@@ -69,6 +107,12 @@
 
 %CLEAN
 
+CLEAN+=	ldscript.$M ldscript.$M.tramp.noheader \
+	${KERNEL_KO}.tramp.noheader ${KERNEL_KO}.tramp.bin
+
+ldscript.$M: $S/conf/ldscript.$M
+	cat $S/conf/ldscript.$M|sed s/KERNLOADADDR/${KERNLOADADDR}/g \
+		> ldscript.$M
 %RULES
 
 .include "$S/conf/kern.post.mk"

==== //depot/projects/mips2/src/sys/conf/ldscript.mips#10 (text+ko) ====

@@ -43,7 +43,7 @@
 SECTIONS
 {
   /* Read-only sections, merged into text segment: */
-  . = 0x80100000 + SIZEOF_HEADERS;
+  . = KERNLOADADDR + SIZEOF_HEADERS;
   .interp     : { *(.interp) 	}
   .hash          : { *(.hash)		}
   .dynsym        : { *(.dynsym)		}

==== //depot/projects/mips2/src/sys/conf/options.mips#10 (text+ko) ====

@@ -45,8 +45,8 @@
 CFE		opt_global.h
 CFE_CONSOLE	opt_global.h
 
-KERNPHYSADDR	opt_global.h
-KERNVIRTADDR	opt_global.h
+KERNLOADADDR	opt_global.h
+TRAMPLOADADDR	opt_global.h
 PHYSADDR	opt_global.h
 SOFTFLOAT       opt_global.h
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810280655.m9S6t7rd059745>