PERFORCE change 227349 for review

Brooks Davis brooks at FreeBSD.org
Wed Apr 3 16:12:47 UTC 2013


http://p4web.freebsd.org/@@227349?ac=10

Change 227349 by brooks at brooks_zenith on 2013/04/03 16:12:06

	Integrate the latest changes to beribsd.  This includes Robert's
	work on boot2 and the loader as well as devinfo improvements.

Affected files ...

.. //depot/projects/ctsrd/cheribsd/src/lib/libdevinfo/devinfo.3#3 integrate
.. //depot/projects/ctsrd/cheribsd/src/lib/libdevinfo/devinfo.c#3 integrate
.. //depot/projects/ctsrd/cheribsd/src/lib/libdevinfo/devinfo.h#3 integrate
.. //depot/projects/ctsrd/cheribsd/src/lib/libstand/Makefile#4 integrate
.. //depot/projects/ctsrd/cheribsd/src/lib/libstand/mips/_setjmp.S#3 integrate
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/ficl/Makefile#4 integrate
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/ficl/mips/sysdep.h#3 integrate
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/Makefile#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/Makefile.inc#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/Makefile#3 integrate
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/altera_jtag_uart.c#2 delete
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/boot2.c#3 integrate
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/cons.h#2 delete
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/drv.h#2 delete
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/flash.c#2 delete
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/linker.cfg#2 integrate
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/mips.h#2 delete
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/start.S#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/start.s#2 delete
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/common/altera_jtag_uart.c#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/common/cfi.c#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/common/cfi.h#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/common/cons.h#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/common/mips.h#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/Makefile#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/beri_console.c#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/beri_disk.c#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/exec.c#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/help.mips#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/linker.cfg#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/loader.h#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/main.c#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/metadata.c#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/start.S#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/loader/version#1 branch
.. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/simplebus.c#5 integrate
.. //depot/projects/ctsrd/cheribsd/src/sys/kern/subr_bus.c#5 integrate
.. //depot/projects/ctsrd/cheribsd/src/sys/mips/beri/beri_pic.c#2 integrate
.. //depot/projects/ctsrd/cheribsd/src/sys/mips/include/bootinfo.h#3 integrate
.. //depot/projects/ctsrd/cheribsd/src/sys/sys/bus.h#4 integrate
.. //depot/projects/ctsrd/cheribsd/src/usr.sbin/devinfo/devinfo.c#3 integrate

Differences ...

==== //depot/projects/ctsrd/cheribsd/src/lib/libdevinfo/devinfo.3#3 (text+ko) ====

@@ -36,6 +36,7 @@
 .Nm devinfo_handle_to_resource ,
 .Nm devinfo_handle_to_rman ,
 .Nm devinfo_foreach_device_child ,
+.Nm devinfo_foreach_device_intr_child ,
 .Nm devinfo_foreach_device_resource ,
 .Nm devinfo_foreach_rman_resource ,
 .Nm devinfo_foreach_rman
@@ -61,6 +62,12 @@
 .Fa "void *arg"
 .Fc
 .Ft int
+.Fo devinfo_foreach_device_intr_child
+.Fa "struct devinfo_dev *parent"
+.Fa "int \*[lp]*fn\*[rp]\*[lp]struct devinfo_dev *child, void *arg\*[rp]"
+.Fa "void *arg"
+.Fc
+.Ft int
 .Fo devinfo_foreach_device_resource
 .Fa "struct devinfo_dev *dev"
 .Fa "int \*[lp]*fn\*[rp]\*[lp]struct devinfo_dev *dev, \:struct devinfo_res *res, void *arg\*[rp]"
@@ -163,9 +170,11 @@
 it will return the handle to the root of the device tree.
 .Pp
 .Fn devinfo_foreach_device_child
-invokes its callback argument
+and
+.Fn devinfo_foreach_device_intr_child
+invoke its callback argument
 .Fa fn
-on every device which is an immediate child of
+on every device which is an immediate child or interrupt child of
 .Fa device .
 The
 .Fa fn

==== //depot/projects/ctsrd/cheribsd/src/lib/libdevinfo/devinfo.c#3 (text+ko) ====

@@ -171,7 +171,7 @@
 	int			dev_ptr;
 	int			name2oid[2];
 	int			oid[CTL_MAXNAME + 12];
-	size_t			oidlen, rlen;
+	size_t			newfields, oidlen, rlen;
 	char			*name;
 	int			error;
 
@@ -217,6 +217,12 @@
 				warn("sysctl hw.bus.devices.%d", dev_idx);
 			return(errno);
 		}
+		if (rlen < sizeof(struct ou_device)) {
+			warnx("impossibly small u_device");
+			return(EINVAL);
+		}
+		if (rlen > sizeof(struct ou_device))
+			newfields = 1;
 		if ((dd = malloc(sizeof(*dd))) == NULL)
 			return(ENOMEM);
 		dd->dd_dev.dd_handle = udev.dv_handle;
@@ -237,6 +243,11 @@
 		dd->dd_dev.dd_devflags = udev.dv_devflags;
 		dd->dd_dev.dd_flags = udev.dv_flags;
 		dd->dd_dev.dd_state = udev.dv_state;
+		if (newfields && (udev.dv_fields & DV_FIELD_INTR_PARENT) &&
+		    udev.dv_intr_parent != 0)
+			dd->dd_dev.dd_intr_parent = udev.dv_intr_parent;
+		else
+			dd->dd_dev.dd_intr_parent = udev.dv_parent;
 		TAILQ_INSERT_TAIL(&devinfo_dev, dd, dd_link);
 	}
 	debug("fetched %d devices", dev_idx);
@@ -448,6 +459,25 @@
 }
 
 /*
+ * Iterate over the interrupt children of a device, calling (fn) on each.
+ * If (fn) returns nonzero, abort the scan and return.
+ */
+int
+devinfo_foreach_device_intr_child(struct devinfo_dev *parent, 
+    int (* fn)(struct devinfo_dev *child, void *arg), 
+    void *arg)
+{
+	struct devinfo_i_dev	*dd;
+	int				error;
+
+	TAILQ_FOREACH(dd, &devinfo_dev, dd_link)
+	    if (dd->dd_dev.dd_intr_parent == parent->dd_handle)
+		    if ((error = fn(&dd->dd_dev, arg)) != 0)
+			    return(error);
+	return(0);
+}
+
+/*
  * Iterate over all the resources owned by a device, calling (fn) on each.
  * If (fn) returns nonzero, abort the scan and return.
  */

==== //depot/projects/ctsrd/cheribsd/src/lib/libdevinfo/devinfo.h#3 (text+ko) ====

@@ -51,6 +51,7 @@
 	uint32_t		dd_devflags;	/* API flags */
 	uint16_t		dd_flags;	/* internal dev flags */
 	devinfo_state_t		dd_state;	/* attacement state of dev */
+	devinfo_handle_t	dd_intr_parent;	/* Interrupt parent */
 };
 
 struct devinfo_rman {
@@ -108,6 +109,15 @@
 	    void *arg);
 
 /*
+ * Iterate over the interrupt children of a device, calling (fn) on each.  If
+ * If (fn) returns nonzero, abort the scan and return.
+ */
+extern int
+	devinfo_foreach_device_intr_child(struct devinfo_dev *parent, 
+	    int (* fn)(struct devinfo_dev *child, void *arg), 
+	    void *arg);
+
+/*
  * Iterate over all the resources owned by a device, calling (fn) on each.
  * If (fn) returns nonzero, abort the scan and return.
  */

==== //depot/projects/ctsrd/cheribsd/src/lib/libstand/Makefile#4 (text+ko) ====

@@ -36,6 +36,9 @@
 .if ${MACHINE_CPUARCH} == "arm"
 CFLAGS+=	-msoft-float -D_STANDALONE
 .endif
+.if ${MACHINE_CPUARCH} == "mips"
+CFLAGS+=	-G0 -fno-pic -mno-abicalls
+.endif
 
 # standalone components and stuff we have modified locally
 SRCS+=	gzguts.h zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \
@@ -53,7 +56,7 @@
 .PATH: ${.CURDIR}/../libc/string
 .if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "powerpc" || \
 	${MACHINE_CPUARCH} == "sparc64" || ${MACHINE_CPUARCH} == "amd64" || \
-	${MACHINE_CPUARCH} == "arm"
+	${MACHINE_CPUARCH} == "arm" || ${MACHINE_CPUARCH} == "mips"
 SRCS+=	bcmp.c bcopy.c bzero.c ffs.c memccpy.c memchr.c memcmp.c memcpy.c \
 	memmove.c memset.c qdivrem.c strcat.c strchr.c strcmp.c strcpy.c \
 	strcspn.c strlen.c strncat.c strncmp.c strncpy.c strpbrk.c \
@@ -90,6 +93,8 @@
 .PATH: ${.CURDIR}/i386
 .elif ${MACHINE_ARCH} == "powerpc64"
 .PATH: ${.CURDIR}/powerpc
+.elif ${MACHINE_ARCH} == "mips64"
+.PATH: ${.CURDIR}/mips
 .else
 .PATH: ${.CURDIR}/${MACHINE_CPUARCH}
 .endif

==== //depot/projects/ctsrd/cheribsd/src/lib/libstand/mips/_setjmp.S#3 (text+ko) ====

@@ -59,33 +59,36 @@
 
 LEAF(_setjmp)
 	.set	noreorder
-	li	v0, 0xACEDBADE			# sigcontext magic number
-	sw	ra, (2 * 4)(a0)			# sc_pc = return address
-	sw	v0, (3 * 4)(a0)			#   saved in sc_regs[0]
-	sw	s0, ((S0 + 3) * 4)(a0)
-	sw	s1, ((S1 + 3) * 4)(a0)
-	sw	s2, ((S2 + 3) * 4)(a0)
-	sw	s3, ((S3 + 3) * 4)(a0)
-	sw	s4, ((S4 + 3) * 4)(a0)
-	sw	s5, ((S5 + 3) * 4)(a0)
-	sw	s6, ((S6 + 3) * 4)(a0)
-	sw	s7, ((S7 + 3) * 4)(a0)
-	sw	sp, ((SP + 3) * 4)(a0)
-	sw	s8, ((S8 + 3) * 4)(a0)
+	REG_LI	v0, 0xACEDBADE			# sigcontext magic number
+	REG_S	ra, (2 * SZREG)(a0)		# sc_pc = return address
+	REG_S	v0, (3 * SZREG)(a0)		#   saved in sc_regs[0]
+	REG_S	s0, ((S0 + 3) * SZREG)(a0)
+	REG_S	s1, ((S1 + 3) * SZREG)(a0)
+	REG_S	s2, ((S2 + 3) * SZREG)(a0)
+	REG_S	s3, ((S3 + 3) * SZREG)(a0)
+	REG_S	s4, ((S4 + 3) * SZREG)(a0)
+	REG_S	s5, ((S5 + 3) * SZREG)(a0)
+	REG_S	s6, ((S6 + 3) * SZREG)(a0)
+	REG_S	s7, ((S7 + 3) * SZREG)(a0)
+	REG_S	sp, ((SP + 3) * SZREG)(a0)
+	REG_S	s8, ((S8 + 3) * SZREG)(a0)
+/* XXXRW: Don't try to save/restore FP in libstand. */
+#if 0
 	cfc1	v0, $31				# too bad cant check if FP used
-	swc1	$f20, ((20 + 38) * 4)(a0)
-	swc1	$f21, ((21 + 38) * 4)(a0)
-	swc1	$f22, ((22 + 38) * 4)(a0)
-	swc1	$f23, ((23 + 38) * 4)(a0)
-	swc1	$f24, ((24 + 38) * 4)(a0)
-	swc1	$f25, ((25 + 38) * 4)(a0)
-	swc1	$f26, ((26 + 38) * 4)(a0)
-	swc1	$f27, ((27 + 38) * 4)(a0)
-	swc1	$f28, ((28 + 38) * 4)(a0)
-	swc1	$f29, ((29 + 38) * 4)(a0)
-	swc1	$f30, ((30 + 38) * 4)(a0)
-	swc1	$f31, ((31 + 38) * 4)(a0)
-	sw	v0, ((32 + 38) * 4)(a0)
+	FP_S	$f20, ((20 + 38) * SZREG)(a0)
+	FP_S	$f21, ((21 + 38) * SZREG)(a0)
+	FP_S	$f22, ((22 + 38) * SZREG)(a0)
+	FP_S	$f23, ((23 + 38) * SZREG)(a0)
+	FP_S	$f24, ((24 + 38) * SZREG)(a0)
+	FP_S	$f25, ((25 + 38) * SZREG)(a0)
+	FP_S	$f26, ((26 + 38) * SZREG)(a0)
+	FP_S	$f27, ((27 + 38) * SZREG)(a0)
+	FP_S	$f28, ((28 + 38) * SZREG)(a0)
+	FP_S	$f29, ((29 + 38) * SZREG)(a0)
+	FP_S	$f30, ((30 + 38) * SZREG)(a0)
+	FP_S	$f31, ((31 + 38) * SZREG)(a0)
+#endif
+	REG_S	v0, ((32 + 38) * SZREG)(a0)
 	j	ra
 	move	v0, zero
 END(_setjmp)
@@ -96,38 +99,41 @@
 	.cprestore 16
 #endif  
 	.set    noreorder
-	lw	v0, (3 * 4)(a0)			# get magic number
-	lw	ra, (2 * 4)(a0)
+	REG_L	v0, (3 * SZREG)(a0)		# get magic number
+	REG_L	ra, (2 * SZREG)(a0)
 	bne	v0, 0xACEDBADE, botch		# jump if error
 
 	addu	sp, sp, 32			# does not matter, sanity
-	lw	s0, ((S0 + 3) * 4)(a0)
-	lw	s1, ((S1 + 3) * 4)(a0)
-	lw	s2, ((S2 + 3) * 4)(a0)
-	lw	s3, ((S3 + 3) * 4)(a0)
-	lw	s4, ((S4 + 3) * 4)(a0)
-	lw	s5, ((S5 + 3) * 4)(a0)
-	lw	s6, ((S6 + 3) * 4)(a0)
-	lw	s7, ((S7 + 3) * 4)(a0)
-	lw	v0, ((32 + 38) * 4)(a0)		# get fpu status
-	lw	sp, ((SP + 3) * 4)(a0)
-	lw	s8, ((S8 + 3) * 4)(a0)
+	REG_L	s0, ((S0 + 3) * SZREG)(a0)
+	REG_L	s1, ((S1 + 3) * SZREG)(a0)
+	REG_L	s2, ((S2 + 3) * SZREG)(a0)
+	REG_L	s3, ((S3 + 3) * SZREG)(a0)
+	REG_L	s4, ((S4 + 3) * SZREG)(a0)
+	REG_L	s5, ((S5 + 3) * SZREG)(a0)
+	REG_L	s6, ((S6 + 3) * SZREG)(a0)
+	REG_L	s7, ((S7 + 3) * SZREG)(a0)
+	REG_L	v0, ((32 + 38) * SZREG)(a0)	# get fpu status
+	REG_L	sp, ((SP + 3) * SZREG)(a0)
+	REG_L	s8, ((S8 + 3) * SZREG)(a0)
+/* XXXRW: Don't try to save/restore FP in libstand. */
+#if 0
 /* Octeon does not have an FPU */
 #if !defined(_MIPS_ARCH_OCTEON)
 	ctc1	v0, $31
-	lwc1	$f20, ((20 + 38) * 4)(a0)
-	lwc1	$f21, ((21 + 38) * 4)(a0)
-	lwc1	$f22, ((22 + 38) * 4)(a0)
-	lwc1	$f23, ((23 + 38) * 4)(a0)
-	lwc1	$f24, ((24 + 38) * 4)(a0)
-	lwc1	$f25, ((25 + 38) * 4)(a0)
-	lwc1	$f26, ((26 + 38) * 4)(a0)
-	lwc1	$f27, ((27 + 38) * 4)(a0)
-	lwc1	$f28, ((28 + 38) * 4)(a0)
-	lwc1	$f29, ((29 + 38) * 4)(a0)
-	lwc1	$f30, ((30 + 38) * 4)(a0)
-	lwc1	$f31, ((31 + 38) * 4)(a0)
+	FP_L	$f20, ((20 + 38) * SZREG)(a0)
+	FP_L	$f21, ((21 + 38) * SZREG)(a0)
+	FP_L	$f22, ((22 + 38) * SZREG)(a0)
+	FP_L	$f23, ((23 + 38) * SZREG)(a0)
+	FP_L	$f24, ((24 + 38) * SZREG)(a0)
+	FP_L	$f25, ((25 + 38) * SZREG)(a0)
+	FP_L	$f26, ((26 + 38) * SZREG)(a0)
+	FP_L	$f27, ((27 + 38) * SZREG)(a0)
+	FP_L	$f28, ((28 + 38) * SZREG)(a0)
+	FP_L	$f29, ((29 + 38) * SZREG)(a0)
+	FP_L	$f30, ((30 + 38) * SZREG)(a0)
+	FP_L	$f31, ((31 + 38) * SZREG)(a0)
 #endif /*  _MIPS_ARCH_OCTEON */
+#endif
 
 	j	ra
 	move	v0, a1

==== //depot/projects/ctsrd/cheribsd/src/sys/boot/ficl/Makefile#4 (text+ko) ====

@@ -27,6 +27,9 @@
 .if ${MACHINE} == "pc98"
 CFLAGS+=	-Os -DPC98
 .endif
+.if ${MACHINE_CPUARCH} == "mips"
+CFLAGS+=	-G0 -fno-pic -mno-abicalls
+.endif
 .if HAVE_PNP
 CFLAGS+=	-DHAVE_PNP
 .endif

==== //depot/projects/ctsrd/cheribsd/src/sys/boot/ficl/mips/sysdep.h#3 (text+ko) ====

@@ -105,11 +105,11 @@
 ** (11/2000: same for FICL_FLOAT)
 */
 #if !defined FICL_INT
-#define FICL_INT INT32
+#define FICL_INT long
 #endif
 
 #if !defined FICL_UNS
-#define FICL_UNS UNS32
+#define FICL_UNS unsigned long
 #endif
 
 #if !defined FICL_FLOAT
@@ -120,7 +120,7 @@
 ** Ficl presently supports values of 32 and 64 for BITS_PER_CELL
 */
 #if !defined BITS_PER_CELL
-#define BITS_PER_CELL 32
+#define BITS_PER_CELL 64
 #endif
 
 #if ((BITS_PER_CELL != 32) && (BITS_PER_CELL != 64))
@@ -366,7 +366,7 @@
 ** machine. 3 would be appropriate for a 64 bit machine.
 */
 #if !defined FICL_ALIGN
-#define FICL_ALIGN 2
+#define FICL_ALIGN 3
 #define FICL_ALIGN_ADD ((1 << FICL_ALIGN) - 1)
 #endif
 

==== //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/Makefile#3 (text+ko) ====

@@ -1,14 +1,14 @@
 #  $FreeBSD$
 
-PROG=		boot2
+PROG=		boot2.elf
 BINDIR?=	/boot
 INSTALLFLAGS=	-b
 
 FILES=		${PROG}
-SRCS=		start.s			\
+SRCS=		start.S			\
 		boot2.c			\
 		altera_jtag_uart.c	\
-		flash.c
+		cfi.c
 
 NO_MAN=
 
@@ -24,15 +24,23 @@
 		-fno-pic -mno-abicalls		\
 		-g
 
-LDFLAGS=	-nostdlib		\
-		-static			\
-		-N			\
-		-T linker.cfg		\
+LDFLAGS=	-nostdlib			\
+		-static				\
+		-N				\
+		-T ${.CURDIR}/linker.cfg	\
 		-G0
 
-boot2: linker.cfg
+.PATH:		${.CURDIR}/../common
+CFLAGS+=	-I${.CURDIR}/../common
+
+boot2.elf: linker.cfg
+
+boot2: boot2.elf
+	objcopy -S -O binary boot2.elf boot2
+
+boot2.dump: boot2.elf
+	objdump -dS boot2.elf > boot2.dump
 
-boot2.img: boot2
-	objcopy -S -O binary boot2 boot2.img
+all: boot2 boot2.dump
 
 .include <bsd.prog.mk>

==== //depot/projects/ctsrd/cheribsd/src/sys/boot/mips/beri/boot2/boot2.c#3 (text+ko) ====

@@ -27,8 +27,6 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * Copyright (c) 2008 John Hay
- * Copyright (c) 2006 Warner Losh
  * Copyright (c) 1998 Robert Nordier
  * All rights reserved.
  *
@@ -44,23 +42,30 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/sys/boot/arm/at91/boot2/boot2.c 235988 2012-05-25 09:36:39Z gleb $");
+__FBSDID("$FreeBSD: head/sys/boot/i386/boot2/boot2.c 241301 2012-10-06 20:08:29Z avg $");
 
 #include <sys/param.h>
 #include <sys/disklabel.h>
 #include <sys/diskmbr.h>
 #include <sys/dirent.h>
+#include <sys/endian.h>
 #include <sys/reboot.h>
 
+#include <machine/bootinfo.h>
 #include <machine/elf.h>
 
 #include <stdarg.h>
 
-#include "cons.h"
-#include "drv.h"
+#include <beri.h>
+#include <cfi.h>
+#include <cons.h>
+
+extern register_t	beri_argc, beri_argv, beri_envv, beri_memsize;
+
+#define IO_KEYBOARD	1
+#define IO_SERIAL	2
 
-//#include "lib.h"
-//#include "board.h"
+#define SECOND		1	/* Circa that many ticks in a second. */
 
 #define RBX_ASKNAME	0x0	/* -a */
 #define RBX_SINGLE	0x1	/* -s */
@@ -68,363 +73,601 @@
 /* 0x3 is reserved for log2(RB_HALT). */
 /* 0x4 is reserved for log2(RB_INITNAME). */
 #define RBX_DFLTROOT	0x5	/* -r */
-/* #define RBX_KDB 	0x6	   -d */
+#define RBX_KDB 	0x6	/* -d */
 /* 0x7 is reserved for log2(RB_RDONLY). */
 /* 0x8 is reserved for log2(RB_DUMP). */
 /* 0x9 is reserved for log2(RB_MINIROOT). */
 #define RBX_CONFIG	0xa	/* -c */
 #define RBX_VERBOSE	0xb	/* -v */
-/* #define RBX_SERIAL	0xc	   -h */
-/* #define RBX_CDROM	0xd	   -C */
+#define RBX_SERIAL	0xc	/* -h */
+#define RBX_CDROM	0xd	/* -C */
 /* 0xe is reserved for log2(RB_POWEROFF). */
 #define RBX_GDB 	0xf	/* -g */
-/* #define RBX_MUTE	0x10	   -m */
+#define RBX_MUTE	0x10	/* -m */
 /* 0x11 is reserved for log2(RB_SELFTEST). */
 /* 0x12 is reserved for boot programs. */
 /* 0x13 is reserved for boot programs. */
-/* #define RBX_PAUSE	0x14	   -p */
-/* #define RBX_QUIET	0x15	   -q */
+#define RBX_PAUSE	0x14	/* -p */
+#define RBX_QUIET	0x15	/* -q */
 #define RBX_NOINTR	0x1c	/* -n */
 /* 0x1d is reserved for log2(RB_MULTIPLE) and is just misnamed here. */
-/* #define RBX_DUAL	0x1d	   -D */
+#define RBX_DUAL	0x1d	/* -D */
 /* 0x1f is reserved for log2(RB_BOOTINFO). */
 
-/* pass: -a, -s, -r, -v, -g */
+/* pass: -a, -s, -r, -d, -c, -v, -h, -C, -g, -m, -p, -D */
 #define RBX_MASK	(OPT_SET(RBX_ASKNAME) | OPT_SET(RBX_SINGLE) | \
-			OPT_SET(RBX_DFLTROOT) | \
-			OPT_SET(RBX_VERBOSE) | \
-			OPT_SET(RBX_GDB))
+			OPT_SET(RBX_DFLTROOT) | OPT_SET(RBX_KDB ) | \
+			OPT_SET(RBX_CONFIG) | OPT_SET(RBX_VERBOSE) | \
+			OPT_SET(RBX_SERIAL) | OPT_SET(RBX_CDROM) | \
+			OPT_SET(RBX_GDB ) | OPT_SET(RBX_MUTE) | \
+			OPT_SET(RBX_PAUSE) | OPT_SET(RBX_DUAL))
 
 #define PATH_DOTCONFIG	"/boot.config"
 #define PATH_CONFIG	"/boot/config"
+#define PATH_BOOT3	"/boot/loader"
 #define PATH_KERNEL	"/boot/kernel/kernel"
 
-extern uint32_t _end;
+#define ARGS		0x900
+#define NOPT		14
+#define NDEV		3
+#define MEM_BASE	0x12
+#define MEM_EXT 	0x15
+
+#define DRV_HARD	0x80
+#define DRV_MASK	0x7f
 
-#define NOPT		6
+#define TYPE_AD		0
+#define TYPE_DA		1
+#define TYPE_MAXHARD	TYPE_DA
+#define TYPE_FD		2
 
 #define OPT_SET(opt)	(1 << (opt))
 #define OPT_CHECK(opt)	((opts) & OPT_SET(opt))
 
-static const char optstr[NOPT] = "agnrsv";
+extern uint32_t _end;
+
+static const char optstr[NOPT] = "DhaCcdgmnpqrsv"; /* Also 'P', 'S' */
 static const unsigned char flags[NOPT] = {
-	RBX_ASKNAME,
-	RBX_GDB,
-	RBX_NOINTR,
-	RBX_DFLTROOT,
-	RBX_SINGLE,
-	RBX_VERBOSE
+    RBX_DUAL,
+    RBX_SERIAL,
+    RBX_ASKNAME,
+    RBX_CDROM,
+    RBX_CONFIG,
+    RBX_KDB,
+    RBX_GDB,
+    RBX_MUTE,
+    RBX_NOINTR,
+    RBX_PAUSE,
+    RBX_QUIET,
+    RBX_DFLTROOT,
+    RBX_SINGLE,
+    RBX_VERBOSE
 };
 
-unsigned board_id; /* board type to pass to kernel, if set by board_* code */
-unsigned dsk_start;
-static char cmd[512];
-static char kname[1024];
+static const char *const dev_nm[NDEV] = {"ad", "da", "fd"};
+static const unsigned char dev_maj[NDEV] = {30, 4, 2};
+
+static struct dmadat __dmadat;
+
+static struct dsk {
+    unsigned drive;
+    unsigned type;
+    unsigned unit;
+    uint8_t slice;
+    uint8_t part;
+    unsigned start;
+    int init;
+} dsk;
+static char cmd[512], cmddup[512], knamebuf[1024];
+static const char *kname;
 static uint32_t opts;
-static uint8_t dsk_meta;
+#if 0
+static int comspeed = SIOSPD;
+#endif
+struct bootinfo bootinfo;
+static uint8_t ioctrl = IO_KEYBOARD;
 
+void exit(int);
 static void load(void);
 static int parse(void);
 static int dskread(void *, unsigned, unsigned);
-#ifdef FIXUP_BOOT_DRV
-static void fixup_boot_drv(caddr_t, int, int, int);
+static void printf(const char *,...);
+static void putchar(int);
+static int xputc(int);
+static int xgetc(int);
+
+#if 0
+void memcpy(void *, const void *, int);
 #endif
+void
+memcpy(void *dst, const void *src, int len)
+{
+    const char *s = src;
+    char *d = dst;
 
-#include "util.c"
+    while (len--)
+        *d++ = *s++;
+}
+
+static inline int
+strcmp(const char *s1, const char *s2)
+{
+    for (; *s1 == *s2 && *s1; s1++, s2++);
+    return (unsigned char)*s1 - (unsigned char)*s2;
+}
+
 #define	UFS_SMALL_CGBASE
 #include "ufsread.c"
 
-static struct dmadat __dmadat;
-
-#ifdef DEBUG
-#define	DPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
-#else
-#define	DPRINTF(fmt, ...)
-#endif
-
 static inline int
 xfsread(ufs_ino_t inode, void *buf, size_t nbyte)
 {
-	if ((size_t)fsread(inode, buf, nbyte) != nbyte)
-		return -1;
-	return 0;
+    if ((size_t)fsread(inode, buf, nbyte) != nbyte) {
+	printf("Invalid %s\n", "format");
+	return -1;
+    }
+    return 0;
 }
 
 static inline void
-getstr(int c)
+getstr(void)
 {
-	char *s;
+    char *s;
+    int c;
 
-	s = cmd;
-	if (c == 0)
-		c = getc(10000);
-	for (;;) {
-		switch (c) {
-		case 0:
-			break;
-		case '\177':
-		case '\b':
-			if (s > cmd) {
-				s--;
-				printf("\b \b");
-			}
-			break;
-		case '\n':
-		case '\r':
-			*s = 0;
-			return;
-		default:
-			if (s - cmd < sizeof(cmd) - 1)
-				*s++ = c;
-			putchar(c);
-		}
-		c = getc(10000);
+    s = cmd;
+    for (;;) {
+	switch (c = xgetc(0)) {
+	case 0:
+	    break;
+	case '\177':
+	case '\b':
+	    if (s > cmd) {
+		s--;
+		printf("\b \b");
+	    }
+	    break;
+	case '\n':
+	case '\r':
+	    *s = 0;
+	    return;
+	default:
+	    if (s - cmd < sizeof(cmd) - 1)
+		*s++ = c;
+	    putchar(c);
 	}
+    }
 }
 
 int
 main(void)
 {
-	int autoboot, c = 0;
-	ufs_ino_t ino;
+    uint8_t autoboot;
+    ufs_ino_t ino;
+    size_t nbyte;
+
+    dmadat = &__dmadat;
+#if 0
+    /* XXXRW: more here. */
+    v86.ctl = V86_FLAGS;
+    v86.efl = PSL_RESERVED_DEFAULT | PSL_I;
+    dsk.drive = *(uint8_t *)PTOV(ARGS);
+    dsk.type = dsk.drive & DRV_HARD ? TYPE_AD : TYPE_FD;
+    dsk.unit = dsk.drive & DRV_MASK;
+    dsk.slice = *(uint8_t *)PTOV(ARGS + 1) + 1;
+#endif
+    bootinfo.bi_version = BOOTINFO_VERSION;
+    bootinfo.bi_size = sizeof(bootinfo);
+
+    /* Process configuration file */
+
+    autoboot = 1;
 
-	dmadat = &__dmadat;
-	//board_init();
+    if ((ino = lookup(PATH_CONFIG)) ||
+        (ino = lookup(PATH_DOTCONFIG))) {
+	nbyte = fsread(ino, cmd, sizeof(cmd) - 1);
+	cmd[nbyte] = '\0';
+    }
 
-	autoboot = 1;
+    if (*cmd) {
+	memcpy(cmddup, cmd, sizeof(cmd));
+	if (parse())
+	    autoboot = 0;
+	if (!OPT_CHECK(RBX_QUIET))
+	    printf("%s: %s", PATH_CONFIG, cmddup);
+	/* Do not process this command twice */
+	*cmd = 0;
+    }
 
-	/* Process configuration file */
-	if ((ino = lookup(PATH_CONFIG)) ||
-	    (ino = lookup(PATH_DOTCONFIG)))
-		fsread(ino, cmd, sizeof(cmd));
+    /*
+     * Try to exec stage 3 boot loader. If interrupted by a keypress,
+     * or in case of failure, try to load a kernel directly instead.
+     */
 
-	if (*cmd) {
-		if (parse())
-			autoboot = 0;
-		printf("%s: %s\n", PATH_CONFIG, cmd);
-		/* Do not process this command twice */
-		*cmd = 0;
+    if (!kname) {
+	kname = PATH_BOOT3;
+	if (autoboot && !keyhit(3*SECOND)) {
+	    load();
+	    kname = PATH_KERNEL;
 	}
+    }
 
-	if (*kname == '\0')
-		strcpy(kname, PATH_KERNEL);
+    /* Present the user with the boot2 prompt. */
+
+    for (;;) {
+	if (!autoboot || !OPT_CHECK(RBX_QUIET))
+	    printf("\nFreeBSD/mips boot\n"
+		   "Default: %u:%s(%u,%c)%s\n"
+		   "boot: ",
+		   dsk.drive & DRV_MASK, dev_nm[dsk.type], dsk.unit,
+		   'a' + dsk.part, kname);
+#if 0
+	if (ioctrl & IO_SERIAL)
+	    sio_flush();
+#endif
+	if (!autoboot || keyhit(3*SECOND))
+	    getstr();
+	else if (!autoboot || !OPT_CHECK(RBX_QUIET))
+	    putchar('\n');
+	autoboot = 0;
+	if (parse())
+	    putchar('\a');
+	else
+	    load();
+    }
+}
 
-	/* Present the user with the boot2 prompt. */
-	for (;;) {
-		printf("\nDefault: %s\nboot: ", kname);
-		if (!autoboot ||
-		    (OPT_CHECK(RBX_NOINTR) == 0 && (c = getc(2)) != 0))
-			getstr(c);
-		printf("\n");
-		autoboot = 0;
-		c = 0;
-		if (parse())
-			putchar('\a');
-		else
-			load();
-	}
+/* XXX - Needed for btxld to link the boot2 binary; do not remove. */
+void
+exit(int x)
+{
 }
 
 static void
 load(void)
 {
+    union {
 	Elf64_Ehdr eh;
-	static Elf64_Phdr ep[2];
-	caddr_t p;
-	ufs_ino_t ino;
-	uint64_t addr;
-	int i, j;
-#ifdef FIXUP_BOOT_DRV
-	caddr_t staddr;
-	int klen;
+    } hdr;
+    static Elf64_Phdr ep[2];
+#if 0
+    static Elf64_Shdr es[2];
+#endif
+    caddr_t p;
+    ufs_ino_t ino;
+    uint64_t addr;
+    int i, j;
+
+    if (!(ino = lookup(kname))) {
+	if (!ls)
+	    printf("No %s\n", kname);
+	return;
+    }
+    if (xfsread(ino, &hdr, sizeof(hdr)))
+	return;
 
-	staddr = (caddr_t)0xffffffff;
-	klen = 0;
-#endif
-	if (!(ino = lookup(kname))) {
-		if (!ls)
-			printf("No %s\n", kname);
+    if (IS_ELF(hdr.eh)) {
+	fs_off = hdr.eh.e_phoff;
+	for (j = i = 0; i < hdr.eh.e_phnum && j < 2; i++) {
+	    if (xfsread(ino, ep + j, sizeof(ep[0])))
 		return;
+	    if (ep[j].p_type == PT_LOAD)
+		j++;
 	}
-	if (xfsread(ino, &eh, sizeof(eh)))
+	for (i = 0; i < 2; i++) {
+	    p = (caddr_t)ep[i].p_paddr;
+	    fs_off = ep[i].p_offset;
+	    if (xfsread(ino, p, ep[i].p_filesz))
 		return;
-	if (!IS_ELF(eh)) {
-		printf("Invalid %s\n", "format");
+	}
+	p += roundup2(ep[1].p_memsz, PAGE_SIZE);
+#if 0
+	bootinfo.bi_symtab = VTOP(p);
+	if (hdr.eh.e_shnum == hdr.eh.e_shstrndx + 3) {
+	    fs_off = hdr.eh.e_shoff + sizeof(es[0]) *
+		(hdr.eh.e_shstrndx + 1);
+	    if (xfsread(ino, &es, sizeof(es)))
 		return;
+	    for (i = 0; i < 2; i++) {
+		*(Elf32_Word *)p = es[i].sh_size;
+		p += sizeof(es[i].sh_size);
+		fs_off = es[i].sh_offset;
+		if (xfsread(ino, p, es[i].sh_size))
+		    return;
+		p += es[i].sh_size;
+	    }
 	}
-	fs_off = eh.e_phoff;
-	for (j = i = 0; i < eh.e_phnum && j < 2; i++) {
-		if (xfsread(ino, ep + j, sizeof(ep[0])))
-			return;
-		if (ep[j].p_type == PT_LOAD)
-			j++;
-	}
-	for (i = 0; i < 2; i++) {
-		p = (caddr_t)ep[i].p_paddr;
-		fs_off = ep[i].p_offset;
-#ifdef FIXUP_BOOT_DRV
-		if (staddr == (caddr_t)0xffffffff)
-			staddr = p;
-		klen += ep[i].p_filesz;
+#endif
+	addr = hdr.eh.e_entry;
+#if 0
+	bootinfo.bi_esymtab = VTOP(p);
 #endif
-		if (xfsread(ino, p, ep[i].p_filesz))
-			return;
-	}
-	addr = eh.e_entry;
-#ifdef FIXUP_BOOT_DRV
-	fixup_boot_drv(staddr, klen, bootslice, bootpart);
+    } else {
+	printf("Invalid %s\n", "format");
+	return;
+    }
+
+#if 0
+    bootinfo.bi_kernelname = VTOP(kname);
+    bootinfo.bi_bios_dev = dsk.drive;
+    __exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),
+	   MAKEBOOTDEV(dev_maj[dsk.type], dsk.slice, dsk.unit, dsk.part),
+	   0, 0, 0, VTOP(&bootinfo));
 #endif
-	((void(*)(int, int, int, int))addr)(opts & RBX_MASK, board_id, 0, 0);
+    bootinfo.bi_kernelname = kname;
+    bootinfo.bi_boot2opts = opts & RBX_MASK;
+    if (beri_memsize <= BERI_MEMVSDTB)
+	bootinfo.bi_memsize = beri_memsize;
+    else
+	bootinfo.bi_dtb = beri_memsize;
+    ((void(*)(int, int, int, void *))addr)(beri_argc, beri_argv, beri_envv,
+	&bootinfo);
 }
 
 static int
 parse()
 {
-	char *arg = cmd;
-	char *ep, *p;
-	int c, i;
+    char *arg = cmd;
+    char *ep, *p, *q;
+#if 0
+    const char *cp;
+#endif
+    unsigned int drv;
+#if 0
+    int c, i, j;
+#else
+    int c, i;
+#endif
 
-	while ((c = *arg++)) {
-		if (c == ' ' || c == '\t' || c == '\n')
-			continue;
-		for (p = arg; *p && *p != '\n' && *p != ' ' && *p != '\t'; p++);
-		ep = p;
-		if (*p)
-			*p++ = 0;
-		if (c == '-') {
-			while ((c = *arg++)) {
-				for (i = 0; c != optstr[i]; i++)
-					if (i == NOPT - 1)
-						return -1;
-				opts ^= OPT_SET(flags[i]);
-			}
-		} else {
-			arg--;
-			if ((i = ep - arg)) {
-				if ((size_t)i >= sizeof(kname))
-					return -1;
-				memcpy(kname, arg, i + 1);
-			}
+    while ((c = *arg++)) {
+	if (c == ' ' || c == '\t' || c == '\n')

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list