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