From owner-p4-projects@FreeBSD.ORG Wed Apr 3 16:12:47 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8CC5C804; Wed, 3 Apr 2013 16:12:47 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 4D127802 for ; Wed, 3 Apr 2013 16:12:47 +0000 (UTC) (envelope-from brooks@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 3BD89D76 for ; Wed, 3 Apr 2013 16:12:47 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r33GClpL011496 for ; Wed, 3 Apr 2013 16:12:47 GMT (envelope-from brooks@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r33GClR5011493 for perforce@freebsd.org; Wed, 3 Apr 2013 16:12:47 GMT (envelope-from brooks@freebsd.org) Date: Wed, 3 Apr 2013 16:12:47 GMT Message-Id: <201304031612.r33GClR5011493@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to brooks@freebsd.org using -f From: Brooks Davis Subject: PERFORCE change 227349 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 03 Apr 2013 16:12:47 -0000 http://p4web.freebsd.org/@@227349?ac=10 Change 227349 by brooks@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 ==== //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 -__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 #include #include #include +#include #include +#include #include #include -#include "cons.h" -#include "drv.h" +#include +#include +#include + +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) <<<