diff options
author | dfr <dfr@FreeBSD.org> | 1999-09-01 09:11:14 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 1999-09-01 09:11:14 +0000 |
commit | 780e80b50782553f48d800ffd0e9f9830fb85364 (patch) | |
tree | 08eb96f597e6ba09e1d80f6443db86127437e530 | |
parent | f6c539b7049c35b0ee6eea4a8a7cd3c49d2f8770 (diff) | |
download | FreeBSD-src-780e80b50782553f48d800ffd0e9f9830fb85364.zip FreeBSD-src-780e80b50782553f48d800ffd0e9f9830fb85364.tar.gz |
* Fix a stack of warnings.
* Make it possible to type a filename to boot1 so that it is possible to
recover from fatally broken versions of /boot/loader.
* Make a start at a CD boot program (not yet functional).
-rw-r--r-- | sys/boot/alpha/Makefile | 2 | ||||
-rw-r--r-- | sys/boot/alpha/boot1/boot1.c | 58 | ||||
-rw-r--r-- | sys/boot/alpha/boot1/sys.c | 1 | ||||
-rw-r--r-- | sys/boot/alpha/cdboot/Makefile | 70 | ||||
-rw-r--r-- | sys/boot/alpha/cdboot/conf.c | 86 | ||||
-rw-r--r-- | sys/boot/alpha/cdboot/version | 7 | ||||
-rw-r--r-- | sys/boot/alpha/common/main.c | 7 | ||||
-rw-r--r-- | sys/boot/alpha/libalpha/bootinfo.c | 2 | ||||
-rw-r--r-- | sys/boot/alpha/libalpha/srmdisk.c | 11 | ||||
-rw-r--r-- | sys/boot/alpha/libalpha/start.S | 4 | ||||
-rw-r--r-- | sys/boot/common/dev_net.c | 18 | ||||
-rw-r--r-- | sys/boot/common/load_aout.c | 4 |
12 files changed, 228 insertions, 42 deletions
diff --git a/sys/boot/alpha/Makefile b/sys/boot/alpha/Makefile index a36f2cf..bc612ca 100644 --- a/sys/boot/alpha/Makefile +++ b/sys/boot/alpha/Makefile @@ -1,6 +1,6 @@ # $FreeBSD$ SUBDIR= libalpha -SUBDIR+= boot1 boot2 netboot +SUBDIR+= boot1 boot2 netboot cdboot .include <bsd.subdir.mk> diff --git a/sys/boot/alpha/boot1/boot1.c b/sys/boot/alpha/boot1/boot1.c index e3f52a9..afae04a 100644 --- a/sys/boot/alpha/boot1/boot1.c +++ b/sys/boot/alpha/boot1/boot1.c @@ -33,6 +33,7 @@ #include <sys/param.h> #include <machine/prom.h> +#include <machine/rpb.h> #define DEBUGxx @@ -152,7 +153,7 @@ devread(char *buf, int block, size_t size) prom_read(prom_fd, size, buf, block); } -void +static void devclose() { if (prom_fd) { @@ -161,35 +162,36 @@ devclose() } } -void +static void getfilename(char *filename) { int c; - char *p; + char *p = filename; puts("Boot: "); - while ((c = getchar()) != '\n') { - if (c == '\b') { + while ((c = getchar()) != '\r') { + if (c == '\b' || c == 0177) { if (p > filename) { puts("\b \b"); p--; } - } else + } else { + putchar(c); *p++ = c; + } } + putchar('\n'); *p = '\0'; return; } -void +static void loadfile(char *name, char *addr) { int n; - char filename[512]; char *p; - restart: puts("Loading "); puts(name); puts("\n"); @@ -205,32 +207,46 @@ loadfile(char *name, char *addr) do { n = readit(p, 1024); p += n; - if (ischar()) { - puts("Stop!\n"); - devclose(); - getfilename(filename); - name = filename; - goto restart; - } twiddle(); } while (n > 0); devclose(); } -void +static inline u_long rpcc() +{ + u_long v; + __asm__ __volatile__ ("rpcc %0" : "=r"(v)); + return v & 0xffffffff; +} + +int main() { char *loadaddr = (char*) SECONDARY_LOAD_ADDRESS; + char *name = "/boot/loader"; char *p; + char filename[512]; void (*entry) __P((void)); - - int i; + u_long start, freq; + int i; init_prom_calls(); - - loadfile("/boot/loader", loadaddr); + + start = rpcc(); + freq = ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq; + while (rpcc() < start + freq) { + if (ischar()) { + getfilename(filename); + name = filename; + break; + } + } + + loadfile(name, loadaddr); entry = (void (*)())loadaddr; (*entry)(); + + return 0; } diff --git a/sys/boot/alpha/boot1/sys.c b/sys/boot/alpha/boot1/sys.c index 4766c9a..9dea3df 100644 --- a/sys/boot/alpha/boot1/sys.c +++ b/sys/boot/alpha/boot1/sys.c @@ -28,6 +28,7 @@ * $FreeBSD$ */ +#include <string.h> #include <sys/param.h> #include <sys/time.h> diff --git a/sys/boot/alpha/cdboot/Makefile b/sys/boot/alpha/cdboot/Makefile new file mode 100644 index 0000000..2cee898 --- /dev/null +++ b/sys/boot/alpha/cdboot/Makefile @@ -0,0 +1,70 @@ +# $NetBSD: Makefile,v 1.12 1998/02/19 14:18:36 drochner Exp $ + +BASE= cdboot +PROG= ${BASE} +NOMAN= +NEWVERSWHAT= "SRM CD9660 boot" alpha + +.PATH: ${.CURDIR}/../common + +# i386-specific bootstrap sources +SRCS+= main.c conf.c + +# Always add MI sources +.PATH: ${.CURDIR}/../../common +.include <${.CURDIR}/../../common/Makefile.inc> +CFLAGS+= -mno-fp-regs +CFLAGS+= -I${.CURDIR}/../../common -I${.CURDIR} +CFLAGS+= -I${.CURDIR}/../../.. -I. +CFLAGS+= -I${.OBJDIR} +CFLAGS+= -DCDBOOT + +CLEANFILES+= vers.c vers.o gensetdefs.o gensetdefs setdef0.o setdef1.o \ + setdefs.h start.o +CLEANFILES+= ${BASE} ${BASE}.sym ${BASE}.list + +CFLAGS+= -Wall + +CFLAGS+= -I${LIBSTANDDIR} +CFLAGS+= -I${.CURDIR}/.. +CRT= start.o +STRIP= +BINDIR?= /boot + +all: ${BASE} + +vers.o: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version + sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT} + ${CC} -c vers.c + +${BASE}: ${BASE}.sym + objcopy -O binary ${BASE}.sym ${BASE} + +${BASE}.nosym: ${BASE}.sym + cp ${BASE}.sym ${BASE}.nosym + strip ${BASE}.nosym + +${BASE}.sym: ${OBJS} ${LIBSTAND} ${LIBALPHA} ${CRT} vers.o setdef0.o setdef1.o + ${LD} -o ${BASE}.sym -M -e start -N -Ttext ${PRIMARY_LOAD_ADDRESS} \ + ${CRT} setdef0.o ${OBJS} setdef1.o \ + vers.o ${LIBSTAND} ${LIBALPHA} ${LIBSTAND} >${.OBJDIR}/${BASE}.list + +start.o: ${.CURDIR}/../libalpha/start.S + ${CC} -c ${CFLAGS} $< + +setdef0.o: setdefs.h + +setdef1.o: setdefs.h + +.include <bsd.prog.mk> + +setdefs.h: gensetdefs ${OBJS} + @echo Generating linker sets + @./gensetdefs ${OBJS} >setdefs.h + +gensetdefs: gensetdefs.o + ${CC} -static gensetdefs.o -o $@ + +gensetdefs.o: gensetdefs.c + ${CC} -c $< + diff --git a/sys/boot/alpha/cdboot/conf.c b/sys/boot/alpha/cdboot/conf.c new file mode 100644 index 0000000..c6e0a44 --- /dev/null +++ b/sys/boot/alpha/cdboot/conf.c @@ -0,0 +1,86 @@ +/* + * $Id$ + * From: $NetBSD: conf.c,v 1.2 1997/03/22 09:03:29 thorpej Exp $ + */ + +/* + * Copyright (c) 1997 + * Matthias Drochner. 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project + * by Matthias Drochner. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 <stand.h> +#include "libalpha/libalpha.h" +#include "dev_net.h" + +/* + * We could use linker sets for some or all of these, but + * then we would have to control what ended up linked into + * the bootstrap. So it's easier to conditionalise things + * here. + * + * XXX rename these arrays to be consistent and less namespace-hostile + */ + +/* Exported for libstand */ +struct devsw *devsw[] = { + &srmdisk, + NULL +}; + +struct fs_ops *file_system[] = { + &cd9660_fsops, + &zipfs_fsops, + NULL +}; + +/* Exported for alpha only */ +/* + * Sort formats so that those that can detect based on arguments + * rather than reading the file go first. + */ +extern struct module_format alpha_elf; + +struct module_format *module_formats[] = { + &alpha_elf, + NULL +}; + +/* + * Consoles + * + * We don't prototype these in libalpha.h because they require + * data structures from bootstrap.h as well. + */ +extern struct console promconsole; + +struct console *consoles[] = { + &promconsole, + NULL +}; diff --git a/sys/boot/alpha/cdboot/version b/sys/boot/alpha/cdboot/version new file mode 100644 index 0000000..23262b9 --- /dev/null +++ b/sys/boot/alpha/cdboot/version @@ -0,0 +1,7 @@ +$Id: version,v 1.1.1.1 1998/08/21 03:17:42 msmith Exp $ + +NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this +file is important. Make sure the current version number is on line 6. + +0.1: Initial i386 version, germinated from the NetBSD i386 + standalone, but enormously modified. diff --git a/sys/boot/alpha/common/main.c b/sys/boot/alpha/common/main.c index b9c5ff7..9c802ae 100644 --- a/sys/boot/alpha/common/main.c +++ b/sys/boot/alpha/common/main.c @@ -68,9 +68,8 @@ extend_heap() { struct rpb *hwrpb = (struct rpb *)HWRPB_ADDR; struct mddt *mddtp; - struct mddt_cluster *memc; + struct mddt_cluster *memc = 0; int i; - unsigned long total = 0; unsigned long startpfn; vm_offset_t startva; vm_offset_t startpte; @@ -107,7 +106,7 @@ extend_heap() } } -void +int main(void) { int i; @@ -188,6 +187,8 @@ main(void) open("/boot", O_RDONLY); interact(); /* doesn't return */ + + return 0; } COMMAND_SET(reboot, "reboot", "reboot the system", command_reboot); diff --git a/sys/boot/alpha/libalpha/bootinfo.c b/sys/boot/alpha/libalpha/bootinfo.c index 5513583..1e23f51 100644 --- a/sys/boot/alpha/libalpha/bootinfo.c +++ b/sys/boot/alpha/libalpha/bootinfo.c @@ -37,6 +37,8 @@ #include <machine/bootinfo.h> #include "bootstrap.h" +extern char *alpha_fmtdev(void *vdev); + /* * Copy the environment into the load area starting at (addr). * Each variable is formatted as <name>=<value>, with a single nul diff --git a/sys/boot/alpha/libalpha/srmdisk.c b/sys/boot/alpha/libalpha/srmdisk.c index 6039a72..5fb0379 100644 --- a/sys/boot/alpha/libalpha/srmdisk.c +++ b/sys/boot/alpha/libalpha/srmdisk.c @@ -63,7 +63,7 @@ static int bd_init(void); static int bd_strategy(void *devdata, int flag, daddr_t dblk, size_t size, void *buf, size_t *rsize); static int bd_realstrategy(void *devdata, int flag, daddr_t dblk, size_t size, void *buf, size_t *rsize); -static int bd_open(struct open_file *f, void *vdev); +static int bd_open(struct open_file *f, ...); static int bd_close(struct open_file *f); static void bd_print(int verbose); @@ -147,9 +147,10 @@ bd_print(int verbose) * slice before it?) */ static int -bd_open(struct open_file *f, void *vdev) +bd_open(struct open_file *f, ...) { - struct alpha_devdesc *dev = vdev; + va_list args; + struct alpha_devdesc *dev; struct dos_partition *dptr; struct open_disk *od; struct disklabel *lp; @@ -158,6 +159,10 @@ bd_open(struct open_file *f, void *vdev) int unit; prom_return_t ret; + va_start(args, f); + dev = va_arg(args, struct alpha_devdesc*); + va_end(args); + unit = dev->d_kind.srmdisk.unit; if (unit >= nbdinfo) { D(printf("attempt to open nonexistent disk\n")); diff --git a/sys/boot/alpha/libalpha/start.S b/sys/boot/alpha/libalpha/start.S index fcc5406..96be32f 100644 --- a/sys/boot/alpha/libalpha/start.S +++ b/sys/boot/alpha/libalpha/start.S @@ -57,7 +57,7 @@ Lstartgp: subq a1,a0,a1 CALL(bzero) -#if defined(NETBOOT) || defined(LOADER) +#if defined(CDBOOT) || defined(NETBOOT) || defined(LOADER) lda sp,stack + STACK_SIZE - ENTRY_FRAME #endif @@ -84,6 +84,6 @@ LEAF(cpu_number, 0) RET END(cpu_number) -#if defined(NETBOOT) || defined(LOADER) +#if defined(CDBOOT) || defined(NETBOOT) || defined(LOADER) BSS(stack, STACK_SIZE) #endif diff --git a/sys/boot/common/dev_net.c b/sys/boot/common/dev_net.c index cf12680..c944e59 100644 --- a/sys/boot/common/dev_net.c +++ b/sys/boot/common/dev_net.c @@ -79,9 +79,8 @@ static int netdev_sock = -1; static int netdev_opens; static int net_init(void); -static int net_open(struct open_file *, void *vdev); +static int net_open(struct open_file *, ...); static int net_close(struct open_file *); -static int net_ioctl(); static int net_strategy(); static int net_getparams(int sock); @@ -108,12 +107,15 @@ net_init(void) * This is declared with variable arguments... */ int -net_open(struct open_file *f, void *vdev) +net_open(struct open_file *f, ...) { + va_list args; char *devname; /* Device part of file name (or NULL). */ int error = 0; - devname = vdev; + va_start(args, f); + devname = va_arg(args, char*); + va_end(args); /* On first open, do netif open, mount, etc. */ if (netdev_opens == 0) { @@ -173,12 +175,6 @@ net_close(f) } int -net_ioctl() -{ - return EIO; -} - -int net_strategy() { return EIO; @@ -202,6 +198,8 @@ int try_bootp = 1; int bootp(int sock); #endif +extern n_long ip_convertaddr(char *p); + static int net_getparams(sock) int sock; diff --git a/sys/boot/common/load_aout.c b/sys/boot/common/load_aout.c index 8947a73..4384ac9 100644 --- a/sys/boot/common/load_aout.c +++ b/sys/boot/common/load_aout.c @@ -227,7 +227,7 @@ aout_loadimage(struct loaded_module *mp, int fd, vm_offset_t loadaddr, struct ex addr += sizeof(ehdr->a_syms); /* symbol table */ - printf("symbols=[0x%x+0x%lx", sizeof(ehdr->a_syms), ehdr->a_syms); + printf("symbols=[0x%lx+0x%lx", sizeof(ehdr->a_syms), ehdr->a_syms); if (archsw.arch_readin(fd, addr, ehdr->a_syms) != ehdr->a_syms) return(0); addr += ehdr->a_syms; @@ -237,7 +237,7 @@ aout_loadimage(struct loaded_module *mp, int fd, vm_offset_t loadaddr, struct ex archsw.arch_copyin(&ss, addr, sizeof(ss)); addr += sizeof(ss); ss -= sizeof(ss); - printf("+0x%x+0x%x]", sizeof(ss), ss); + printf("+0x%lx+0x%x]", sizeof(ss), ss); if (archsw.arch_readin(fd, addr, ss) != ss) return(0); addr += ss; |