summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>1999-09-01 09:11:14 +0000
committerdfr <dfr@FreeBSD.org>1999-09-01 09:11:14 +0000
commit780e80b50782553f48d800ffd0e9f9830fb85364 (patch)
tree08eb96f597e6ba09e1d80f6443db86127437e530
parentf6c539b7049c35b0ee6eea4a8a7cd3c49d2f8770 (diff)
downloadFreeBSD-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/Makefile2
-rw-r--r--sys/boot/alpha/boot1/boot1.c58
-rw-r--r--sys/boot/alpha/boot1/sys.c1
-rw-r--r--sys/boot/alpha/cdboot/Makefile70
-rw-r--r--sys/boot/alpha/cdboot/conf.c86
-rw-r--r--sys/boot/alpha/cdboot/version7
-rw-r--r--sys/boot/alpha/common/main.c7
-rw-r--r--sys/boot/alpha/libalpha/bootinfo.c2
-rw-r--r--sys/boot/alpha/libalpha/srmdisk.c11
-rw-r--r--sys/boot/alpha/libalpha/start.S4
-rw-r--r--sys/boot/common/dev_net.c18
-rw-r--r--sys/boot/common/load_aout.c4
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;
OpenPOWER on IntegriCloud