summaryrefslogtreecommitdiffstats
path: root/sys/boot/alpha/boot1
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 /sys/boot/alpha/boot1
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).
Diffstat (limited to 'sys/boot/alpha/boot1')
-rw-r--r--sys/boot/alpha/boot1/boot1.c58
-rw-r--r--sys/boot/alpha/boot1/sys.c1
2 files changed, 38 insertions, 21 deletions
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>
OpenPOWER on IntegriCloud