summaryrefslogtreecommitdiffstats
path: root/sys/boot/pc98
diff options
context:
space:
mode:
authornyan <nyan@FreeBSD.org>2000-11-05 12:35:41 +0000
committernyan <nyan@FreeBSD.org>2000-11-05 12:35:41 +0000
commit48503b7c5c0457713d7787367598c6e68425e6f7 (patch)
tree4dac50c841b6a9cbbe20300875cdc3fe1d5c83bc /sys/boot/pc98
parentc3b27201d1fa4f0149196757101c35192e8d247c (diff)
downloadFreeBSD-src-48503b7c5c0457713d7787367598c6e68425e6f7.zip
FreeBSD-src-48503b7c5c0457713d7787367598c6e68425e6f7.tar.gz
Merged from the following changes.
sys/boot/i386/btx/btx/Makefile 1.9 sys/boot/i386/btx/btx/btx.s 1.23 sys/boot/i386/libi386/biosdisk.c 1.32 and 1.33 sys/boot/i386/libi386/biosmem.c 1.5 sys/boot/i386/libi386/comconsole.c 1.8 sys/boot/i386/libi386/gatea20.c 1.3 sys/boot/i386/libi386/time.c 1.4 sys/boot/i386/libi386/vidconsole.c 1.13 sys/boot/i386/loader/Makefile 1.48 sys/boot/i386/loader/main.c 1.22
Diffstat (limited to 'sys/boot/pc98')
-rw-r--r--sys/boot/pc98/btx/btx/Makefile9
-rw-r--r--sys/boot/pc98/btx/btx/btx.S2
-rw-r--r--sys/boot/pc98/btx/btx/btx.s2
-rw-r--r--sys/boot/pc98/libpc98/biosdisk.c197
-rw-r--r--sys/boot/pc98/libpc98/biosmem.c1
-rw-r--r--sys/boot/pc98/libpc98/comconsole.c2
-rw-r--r--sys/boot/pc98/libpc98/gatea20.c8
-rw-r--r--sys/boot/pc98/libpc98/time.c10
-rw-r--r--sys/boot/pc98/libpc98/vidconsole.c19
-rw-r--r--sys/boot/pc98/loader/Makefile5
-rw-r--r--sys/boot/pc98/loader/main.c49
11 files changed, 179 insertions, 125 deletions
diff --git a/sys/boot/pc98/btx/btx/Makefile b/sys/boot/pc98/btx/btx/Makefile
index fd29676..2299632 100644
--- a/sys/boot/pc98/btx/btx/Makefile
+++ b/sys/boot/pc98/btx/btx/Makefile
@@ -6,10 +6,17 @@ M4?= m4
M4FLAGS+= -DPAGING
.endif
-ORG= 0x9000
+.if defined(BOOT_BTX_NOHANG)
+BOOT_BTX_FLAGS=0x1
+.else
+BOOT_BTX_FLAGS=0x0
+.endif
+AFLAGS+= --defsym BTX_FLAGS=${BOOT_BTX_FLAGS}
AFLAGS+= --defsym PC98=1
+ORG= 0x9000
+
all: btx
btx: btx.o
diff --git a/sys/boot/pc98/btx/btx/btx.S b/sys/boot/pc98/btx/btx/btx.S
index 14a5b0d..cc8f0f5 100644
--- a/sys/boot/pc98/btx/btx/btx.S
+++ b/sys/boot/pc98/btx/btx/btx.S
@@ -114,7 +114,7 @@ btx_hdr: .byte 0xeb # Machine ID
.ascii "BTX" # Magic
.byte 0x1 # Major version
.byte 0x1 # Minor version
- .byte 0x0 # Flags
+ .byte BTX_FLAGS # Flags
.word PAG_CNT-MEM_ORG>>0xc # Paging control
.word break-start # Text size
.long 0x0 # Entry address
diff --git a/sys/boot/pc98/btx/btx/btx.s b/sys/boot/pc98/btx/btx/btx.s
index 14a5b0d..cc8f0f5 100644
--- a/sys/boot/pc98/btx/btx/btx.s
+++ b/sys/boot/pc98/btx/btx/btx.s
@@ -114,7 +114,7 @@ btx_hdr: .byte 0xeb # Machine ID
.ascii "BTX" # Magic
.byte 0x1 # Major version
.byte 0x1 # Minor version
- .byte 0x0 # Flags
+ .byte BTX_FLAGS # Flags
.word PAG_CNT-MEM_ORG>>0xc # Paging control
.word break-start # Text size
.long 0x0 # Entry address
diff --git a/sys/boot/pc98/libpc98/biosdisk.c b/sys/boot/pc98/libpc98/biosdisk.c
index b0269a3..e6675a4 100644
--- a/sys/boot/pc98/libpc98/biosdisk.c
+++ b/sys/boot/pc98/libpc98/biosdisk.c
@@ -107,14 +107,15 @@ static int bd_read(struct open_disk *od, daddr_t dblk, int blks,
static int bd_int13probe(struct bdinfo *bd);
static void bd_printslice(struct open_disk *od, struct dos_partition *dp,
- char *prefix);
-static void bd_printbsdslice(struct open_disk *od, int offset, char *prefix);
+ char *prefix, int verbose);
+static void bd_printbsdslice(struct open_disk *od, daddr_t offset,
+ char *prefix, int verbose);
static int bd_init(void);
static int bd_strategy(void *devdata, int flag, daddr_t dblk,
- size_t size, void *buf, size_t *rsize);
+ size_t size, char *buf, size_t *rsize);
static int bd_realstrategy(void *devdata, int flag, daddr_t dblk,
- size_t size, void *buf, size_t *rsize);
+ size_t size, char *buf, size_t *rsize);
static int bd_open(struct open_file *f, ...);
static int bd_close(struct open_file *f);
static void bd_print(int verbose);
@@ -127,7 +128,8 @@ struct devsw biosdisk = {
bd_open,
bd_close,
noioctl,
- bd_print
+ bd_print,
+ NULL
};
static int bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev);
@@ -210,7 +212,7 @@ bd_init(void)
for (unit = base; (nbdinfo < MAXBDDEV); unit++) {
/* check the BIOS equipment list for number of fixed disks */
if((base == 0x80) &&
- (nfd >= *(unsigned short *)PTOV(BIOS_NUMDRIVES)))
+ (nfd >= *(unsigned char *)PTOV(BIOS_NUMDRIVES)))
break;
bdinfo[nbdinfo].bd_unit = unit;
@@ -261,7 +263,7 @@ bd_int13probe(struct bdinfo *bd)
v86int();
if (!(v86.efl & 0x1) && /* carry clear */
- ((v86.edx & 0xff) > (bd->bd_unit & 0x7f))) { /* unit # OK */
+ ((v86.edx & 0xff) > ((unsigned)bd->bd_unit & 0x7f))) { /* unit # OK */
bd->bd_flags |= BD_MODEINT13;
bd->bd_type = v86.ebx & 0xff;
@@ -274,7 +276,7 @@ bd_int13probe(struct bdinfo *bd)
((v86.ebx & 0xffff) == 0xaa55) && /* signature */
(v86.ecx & 0x1)) { /* packets mode ok */
bd->bd_flags |= BD_MODEEDD1;
- if(v86.eax & 0xff00 > 0x300)
+ if((v86.eax & 0xff00) > 0x300)
bd->bd_flags |= BD_MODEEDD3;
}
return(1);
@@ -315,7 +317,7 @@ bd_print(int verbose)
if (od->od_flags & BD_PARTTABOK) {
dptr = &od->od_slicetab[0];
- /* Check for a "truly dedicated" disk */
+ /* Check for a "dedicated" disk */
#ifdef PC98
for (j = 0; j < od->od_nslices; j++) {
switch(dptr[j].dp_mid) {
@@ -324,7 +326,7 @@ bd_print(int verbose)
bd_printbsdslice(od,
dptr[j].dp_scyl * od->od_hds * od->od_sec +
dptr[j].dp_shd * od->od_sec + dptr[j].dp_ssect,
- line);
+ line, verbose);
break;
default:
}
@@ -334,11 +336,11 @@ bd_print(int verbose)
(dptr[3].dp_start == 0) &&
(dptr[3].dp_size == 50000)) {
sprintf(line, " disk%d", i);
- bd_printbsdslice(od, 0, line);
+ bd_printbsdslice(od, 0, line, verbose);
} else {
for (j = 0; j < od->od_nslices; j++) {
sprintf(line, " disk%ds%d", i, j + 1);
- bd_printslice(od, &dptr[j], line);
+ bd_printslice(od, &dptr[j], line, verbose);
}
}
#endif
@@ -348,69 +350,94 @@ bd_print(int verbose)
}
}
+#ifndef PC98
/*
- * Print information about slices on a disk
+ * Print information about slices on a disk. For the size calculations we
+ * assume a 512 byte sector.
*/
-#ifndef PC98
static void
-bd_printslice(struct open_disk *od, struct dos_partition *dp, char *prefix)
+bd_printslice(struct open_disk *od, struct dos_partition *dp, char *prefix,
+ int verbose)
{
char line[80];
switch (dp->dp_typ) {
case DOSPTYP_386BSD:
- bd_printbsdslice(od, dp->dp_start, prefix);
+ bd_printbsdslice(od, (daddr_t)dp->dp_start, prefix, verbose);
return;
case DOSPTYP_LINSWP:
- sprintf(line, "%s: Linux swap %.6dMB (%d - %d)\n", prefix,
- dp->dp_size / 2048, /* 512-byte sector assumption */
- dp->dp_start, dp->dp_start + dp->dp_size);
+ if (verbose)
+ sprintf(line, "%s: Linux swap %.6dMB (%d - %d)\n",
+ prefix, dp->dp_size / 2048,
+ dp->dp_start, dp->dp_start + dp->dp_size);
+ else
+ sprintf(line, "%s: Linux swap\n", prefix);
break;
case DOSPTYP_LINUX:
/*
* XXX
* read the superblock to confirm this is an ext2fs partition?
*/
- sprintf(line, "%s: ext2fs %.6dMB (%d - %d)\n", prefix,
- dp->dp_size / 2048, /* 512-byte sector assumption */
- dp->dp_start, dp->dp_start + dp->dp_size);
+ if (verbose)
+ sprintf(line, "%s: ext2fs %.6dMB (%d - %d)\n", prefix,
+ dp->dp_size / 2048, dp->dp_start,
+ dp->dp_start + dp->dp_size);
+ else
+ sprintf(line, "%s: ext2fs\n", prefix);
break;
case 0x00: /* unused partition */
case DOSPTYP_EXT:
return;
case 0x01:
- sprintf(line, "%s: FAT-12 %.6dMB (%d - %d)\n", prefix,
- dp->dp_size / 2048, /* 512-byte sector assumption */
- dp->dp_start, dp->dp_start + dp->dp_size);
+ if (verbose)
+ sprintf(line, "%s: FAT-12 %.6dMB (%d - %d)\n", prefix,
+ dp->dp_size / 2048, dp->dp_start,
+ dp->dp_start + dp->dp_size);
+ else
+ sprintf(line, "%s: FAT-12\n", prefix);
break;
case 0x04:
case 0x06:
case 0x0e:
- sprintf(line, "%s: FAT-16 %.6dMB (%d - %d)\n", prefix,
- dp->dp_size / 2048, /* 512-byte sector assumption */
- dp->dp_start, dp->dp_start + dp->dp_size);
+ if (verbose)
+ sprintf(line, "%s: FAT-16 %.6dMB (%d - %d)\n", prefix,
+ dp->dp_size / 2048, dp->dp_start,
+ dp->dp_start + dp->dp_size);
+ else
+ sprintf(line, "%s: FAT-16\n", prefix);
break;
case 0x0b:
case 0x0c:
- sprintf(line, "%s: FAT-32 %.6dMB (%d - %d)\n", prefix,
- dp->dp_size / 2048, /* 512-byte sector assumption */
- dp->dp_start, dp->dp_start + dp->dp_size);
+ if (verbose)
+ sprintf(line, "%s: FAT-32 %.6dMB (%d - %d)\n", prefix,
+ dp->dp_size / 2048, dp->dp_start,
+ dp->dp_start + dp->dp_size);
+ else
+ sprintf(line, "%s: FAT-32\n", prefix);
break;
default:
- sprintf(line, "%s: Unknown fs: 0x%x %.6dMB (%d - %d)\n",
- prefix, dp->dp_typ,
- dp->dp_size / 2048, /* 512-byte sector assumption */
- dp->dp_start, dp->dp_start + dp->dp_size);
+ if (verbose)
+ sprintf(line, "%s: Unknown fs: 0x%x %.6dMB (%d - %d)\n",
+ prefix, dp->dp_typ, dp->dp_size / 2048,
+ dp->dp_start, dp->dp_start + dp->dp_size);
+ else
+ sprintf(line, "%s: Unknown fs: 0x%x\n", prefix,
+ dp->dp_typ);
}
pager_output(line);
}
#endif
+/*
+ * Print out each valid partition in the disklabel of a FreeBSD slice.
+ * For size calculations, we assume a 512 byte sector size.
+ */
static void
-bd_printbsdslice(struct open_disk *od, int offset, char *prefix)
+bd_printbsdslice(struct open_disk *od, daddr_t offset, char *prefix,
+ int verbose)
{
char line[80];
- u_char buf[BIOSDISK_SECSIZE];
+ char buf[BIOSDISK_SECSIZE];
struct disklabel *lp;
int i;
@@ -426,16 +453,32 @@ bd_printbsdslice(struct open_disk *od, int offset, char *prefix)
/* Print partitions */
for (i = 0; i < lp->d_npartitions; i++) {
+ /*
+ * For each partition, make sure we know what type of fs it is. If
+ * not, then skip it. However, since floppies often have bogus
+ * fstypes, print the 'a' partition on a floppy even if it is marked
+ * unused.
+ */
if ((lp->d_partitions[i].p_fstype == FS_BSDFFS) ||
(lp->d_partitions[i].p_fstype == FS_SWAP) ||
(lp->d_partitions[i].p_fstype == FS_VINUM) ||
((lp->d_partitions[i].p_fstype == FS_UNUSED) &&
- (od->od_flags & BD_FLOPPY) && (i == 0))) { /* Floppies often have bogus fstype, print 'a' */
- sprintf(line, " %s%c: %s %.6dMB (%d - %d)\n", prefix, 'a' + i,
+ (od->od_flags & BD_FLOPPY) && (i == 0))) {
+
+ /* Only print out statistics in verbose mode */
+ if (verbose)
+ sprintf(line, " %s%c: %s %.6dMB (%d - %d)\n", prefix, 'a' + i,
(lp->d_partitions[i].p_fstype == FS_SWAP) ? "swap" :
- (lp->d_partitions[i].p_fstype == FS_VINUM) ? "vinum" : "FFS",
- lp->d_partitions[i].p_size / 2048, /* 512-byte sector assumption */
- lp->d_partitions[i].p_offset, lp->d_partitions[i].p_offset + lp->d_partitions[i].p_size);
+ (lp->d_partitions[i].p_fstype == FS_VINUM) ? "vinum" :
+ "FFS",
+ lp->d_partitions[i].p_size / 2048,
+ lp->d_partitions[i].p_offset,
+ lp->d_partitions[i].p_offset + lp->d_partitions[i].p_size);
+ else
+ sprintf(line, " %s%c: %s\n", prefix, 'a' + i,
+ (lp->d_partitions[i].p_fstype == FS_SWAP) ? "swap" :
+ (lp->d_partitions[i].p_fstype == FS_VINUM) ? "vinum" :
+ "FFS");
pager_output(line);
}
}
@@ -482,7 +525,7 @@ bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev)
struct open_disk *od;
int sector, slice, i;
int error;
- u_char buf[BUFSIZE];
+ char buf[BUFSIZE];
if (dev->d_kind.biosdisk.unit >= nbdinfo) {
DEBUG("attempt to open nonexistent disk");
@@ -537,7 +580,7 @@ bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev)
/*
* Check the slice table magic.
*/
- if ((buf[0x1fe] != 0x55) || (buf[0x1ff] != 0xaa)) {
+ if (((u_char)buf[0x1fe] != 0x55) || ((u_char)buf[0x1ff] != 0xaa)) {
/* If a slice number was explicitly supplied, this is an error */
if (dev->d_kind.biosdisk.slice > 0) {
DEBUG("no slice table/MBR (no magic)");
@@ -675,10 +718,12 @@ bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev)
}
- /* Complain if the partition type is wrong */
+#ifdef DISK_DEBUG
+ /* Complain if the partition is unused unless this is a floppy. */
if ((lp->d_partitions[dev->d_kind.biosdisk.partition].p_fstype == FS_UNUSED) &&
- !(od->od_flags & BD_FLOPPY)) /* Floppies often have bogus fstype */
+ !(od->od_flags & BD_FLOPPY))
DEBUG("warning, partition marked as unused");
+#endif
od->od_boff = lp->d_partitions[dev->d_kind.biosdisk.partition].p_offset;
}
@@ -696,7 +741,7 @@ bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev)
static void
bd_checkextended(struct open_disk *od, int slicenum)
{
- u_char buf[BIOSDISK_SECSIZE];
+ char buf[BIOSDISK_SECSIZE];
struct dos_partition *dp;
u_int base;
int i, start, end;
@@ -708,9 +753,9 @@ bd_checkextended(struct open_disk *od, int slicenum)
goto done;
if (dp->dp_typ != DOSPTYP_EXT)
goto done;
- if (bd_read(od, dp->dp_start, 1, buf))
+ if (bd_read(od, (daddr_t)dp->dp_start, 1, buf))
goto done;
- if ((buf[0x1fe] != 0x55) || (buf[0x1ff] != 0xaa)) {
+ if (((u_char)buf[0x1fe] != 0x55) || ((u_char)buf[0x1ff] != 0xaa)) {
DEBUG("no magic in extended table");
goto done;
}
@@ -853,7 +898,7 @@ bd_closedisk(struct open_disk *od)
}
static int
-bd_strategy(void *devdata, int rw, daddr_t dblk, size_t size, void *buf, size_t *rsize)
+bd_strategy(void *devdata, int rw, daddr_t dblk, size_t size, char *buf, size_t *rsize)
{
struct bcache_devdata bcd;
struct open_disk *od = (struct open_disk *)(((struct i386_devdesc *)devdata)->d_kind.biosdisk.data);
@@ -864,7 +909,7 @@ bd_strategy(void *devdata, int rw, daddr_t dblk, size_t size, void *buf, size_t
}
static int
-bd_realstrategy(void *devdata, int rw, daddr_t dblk, size_t size, void *buf, size_t *rsize)
+bd_realstrategy(void *devdata, int rw, daddr_t dblk, size_t size, char *buf, size_t *rsize)
{
struct open_disk *od = (struct open_disk *)(((struct i386_devdesc *)devdata)->d_kind.biosdisk.data);
int blks;
@@ -913,9 +958,13 @@ bd_realstrategy(void *devdata, int rw, daddr_t dblk, size_t size, void *buf, siz
static int
bd_read(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest)
{
- int x, bpc, cyl, hd, sec, result, resid, cnt, retry, maxfer;
+ u_int x, bpc, cyl, hd, sec, result, resid, retry, maxfer;
caddr_t p, xp, bbuf, breg;
+ /* Just in case some idiot actually tries to read -1 blocks... */
+ if (blks < 0)
+ return (-1);
+
bpc = (od->od_sec * od->od_hds); /* blocks per cylinder */
resid = blks;
p = dest;
@@ -935,9 +984,9 @@ bd_read(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest)
* use the top half.
*/
#ifdef PC98
- x = min(od->od_sec, blks);
+ x = min(od->od_sec, (unsigned)blks);
#else
- x = min(FLOPPY_BOUNCEBUF, blks);
+ x = min(FLOPPY_BOUNCEBUF, (unsigned)blks);
#endif
bbuf = malloc(x * 2 * BIOSDISK_SECSIZE);
if (((u_int32_t)VTOP(bbuf) & 0xffff0000) == ((u_int32_t)VTOP(dest + x * BIOSDISK_SECSIZE) & 0xffff0000)) {
@@ -947,7 +996,7 @@ bd_read(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest)
}
maxfer = x; /* limit transfers to bounce region size */
} else {
- bbuf = NULL;
+ breg = bbuf = NULL;
maxfer = 0;
}
@@ -1115,7 +1164,7 @@ bd_getgeom(struct open_disk *od)
v86int();
if ((v86.efl & 0x1) || /* carry set */
- ((v86.edx & 0xff) <= (od->od_unit & 0x7f))) /* unit # bad */
+ ((v86.edx & 0xff) <= (unsigned)(od->od_unit & 0x7f))) /* unit # bad */
return(1);
/* convert max cyl # -> # of cylinders */
@@ -1236,21 +1285,22 @@ bd_getdev(struct i386_devdesc *dev)
major = WDMAJOR;
}
}
+ /* default root disk unit number */
+#ifdef PC98
+ if ((biosdev & 0xf0) == 0xa0)
+ unit = bdinfo[dev->d_kind.biosdisk.unit].bd_da_unit;
+ else
+ unit = biosdev & 0xf;
+#else
+ unit = (biosdev & 0x7f) - unitofs;
+#endif
+
/* XXX a better kludge to set the root disk unit number */
if ((nip = getenv("root_disk_unit")) != NULL) {
i = strtol(nip, &cp, 0);
/* check for parse error */
if ((cp != nip) && (*cp == 0))
unit = i;
- } else {
-#ifdef PC98
- if ((biosdev & 0xf0) == 0xa0)
- unit = bdinfo[dev->d_kind.biosdisk.unit].bd_da_unit;
- else
- unit = biosdev & 0xf;
-#else
- unit = (biosdev & 0x7f) - unitofs; /* allow for #wd compenstation in da case */
-#endif
}
rootdev = MAKEBOOTDEV(major,
@@ -1261,20 +1311,3 @@ bd_getdev(struct i386_devdesc *dev)
DEBUG("dev is 0x%x\n", rootdev);
return(rootdev);
}
-
-/*
- * Fix (dev) so that it refers to the 'real' disk/slice/partition that it implies.
- */
-int
-bd_fixupdev(struct i386_devdesc *dev)
-{
- struct open_disk *od;
-
- /*
- * Open the disk. This will fix up the slice and partition fields.
- */
- if (bd_opendisk(&od, dev) != 0)
- return(ENOENT);
-
- bd_closedisk(od);
-}
diff --git a/sys/boot/pc98/libpc98/biosmem.c b/sys/boot/pc98/libpc98/biosmem.c
index e786470..d111755 100644
--- a/sys/boot/pc98/libpc98/biosmem.c
+++ b/sys/boot/pc98/libpc98/biosmem.c
@@ -30,6 +30,7 @@
* Obtain memory configuration information from the BIOS
*/
#include <stand.h>
+#include "libi386.h"
#include "btxv86.h"
vm_offset_t memtop;
diff --git a/sys/boot/pc98/libpc98/comconsole.c b/sys/boot/pc98/libpc98/comconsole.c
index 958b4e0..4f065f5 100644
--- a/sys/boot/pc98/libpc98/comconsole.c
+++ b/sys/boot/pc98/libpc98/comconsole.c
@@ -118,7 +118,7 @@ comc_putchar(int c)
for (wait = COMC_TXWAIT; wait > 0; wait--)
if (inb(COMPORT + com_lsr) & LSR_TXRDY) {
- outb(COMPORT + com_data, c);
+ outb(COMPORT + com_data, (u_char)c);
break;
}
}
diff --git a/sys/boot/pc98/libpc98/gatea20.c b/sys/boot/pc98/libpc98/gatea20.c
index cad48c1..4006bb6 100644
--- a/sys/boot/pc98/libpc98/gatea20.c
+++ b/sys/boot/pc98/libpc98/gatea20.c
@@ -5,10 +5,10 @@
/* extracted from freebsd:sys/i386/boot/biosboot/io.c */
-#include <sys/types.h>
+#include <stand.h>
#include <machine/cpufunc.h>
-#include <stand.h>
+#include <bootstrap.h>
#include "libi386.h"
@@ -40,7 +40,7 @@ void gateA20()
#else /* IBM PC */
#ifdef IBM_L40
outb(0x92, 0x2);
-#else IBM_L40
+#else /* !IBM_L40 */
while (inb(K_STATUS) & K_IBUF_FUL);
while (inb(K_STATUS) & K_OBUF_FUL)
(void)inb(K_RDWR);
@@ -51,7 +51,7 @@ void gateA20()
outb(K_RDWR, x_20);
delay(100);
while (inb(K_STATUS) & K_IBUF_FUL);
-#endif IBM_L40
+#endif /* IBM_L40 */
#endif /* IBM PC */
__asm("popfl");
}
diff --git a/sys/boot/pc98/libpc98/time.c b/sys/boot/pc98/libpc98/time.c
index 72938b0..707fc95 100644
--- a/sys/boot/pc98/libpc98/time.c
+++ b/sys/boot/pc98/libpc98/time.c
@@ -31,6 +31,8 @@
#ifdef PC98
#include <machine/cpufunc.h>
#endif
+#include "bootstrap.h"
+#include "libi386.h"
/*
* Return the time in seconds since the beginning of the day.
@@ -44,7 +46,7 @@ time_t
time(time_t *t)
{
static time_t lasttime, now;
- int hr, min, sec;
+ int hr, minute, sec;
#ifdef PC98
unsigned char bios_time[6];
@@ -64,15 +66,15 @@ time(time_t *t)
#ifdef PC98
hr = bcd2bin(bios_time[3]);
- min = bcd2bin(bios_time[4]);
+ minute = bcd2bin(bios_time[4]);
sec = bcd2bin(bios_time[5]);
#else
hr = bcd2bin((v86.ecx & 0xff00) >> 8); /* hour in %ch */
- min = bcd2bin(v86.ecx & 0xff); /* minute in %cl */
+ minute = bcd2bin(v86.ecx & 0xff); /* minute in %cl */
sec = bcd2bin((v86.edx & 0xff00) >> 8); /* second in %dh */
#endif
- now = hr * 3600 + min * 60 + sec;
+ now = hr * 3600 + minute * 60 + sec;
if (now < lasttime)
now += 24 * 3600;
lasttime = now;
diff --git a/sys/boot/pc98/libpc98/vidconsole.c b/sys/boot/pc98/libpc98/vidconsole.c
index d2b1987..a2360c4 100644
--- a/sys/boot/pc98/libpc98/vidconsole.c
+++ b/sys/boot/pc98/libpc98/vidconsole.c
@@ -33,10 +33,10 @@
#include <bootstrap.h>
#include <btxv86.h>
#include <machine/psl.h>
-#include "libi386.h"
#ifdef PC98
#include <machine/cpufunc.h>
#endif
+#include "libi386.h"
#if KEYBOARD_PROBE
#include <machine/cpufunc.h>
@@ -52,13 +52,14 @@ static int vidc_ischar(void);
static int vidc_started;
#ifdef TERM_EMU
-void end_term();
+void end_term(void);
void bail_out(int c);
void vidc_term_emu(int c);
void get_pos(void);
void curs_move(int x, int y);
void write_char(int c, int fg, int bg);
void scroll_up(int rows, int fg, int bg);
+int pow10(int i);
void AB(void);
void AF(void);
void CD(void);
@@ -117,7 +118,7 @@ vidc_init(int arg)
#endif
if (vidc_started && arg == 0)
- return;
+ return(0);
vidc_started = 1;
#ifdef PC98
Crtat = (unsigned short *)PTOV(0xA0000);
@@ -341,7 +342,7 @@ curs_move(int x, int y)
* inserted in the window.
*/
void
-scroll_up(int rows, int fg, int bg)
+scroll_up(int rows, int fgcol, int bgcol)
{
#ifdef PC98
unsigned short *cp;
@@ -354,7 +355,7 @@ scroll_up(int rows, int fg, int bg)
cp += col;
}
for (i = 0; i < col; i++) {
- *(cp + 0x1000) = at2pc98(fg, bg);
+ *(cp + 0x1000) = at2pc98(fgcol, bgcol);
*cp++ = ' ';
}
#else
@@ -362,7 +363,7 @@ scroll_up(int rows, int fg, int bg)
v86.ctl = 0;
v86.addr = 0x10;
v86.eax = 0x0600+(0x00ff & rows);
- v86.ebx = (bg<<12)+(fg<<8);
+ v86.ebx = (bgcol<<12)+(fgcol<<8);
v86.ecx = 0x0;
v86.edx = 0x184f;
v86int();
@@ -371,16 +372,16 @@ scroll_up(int rows, int fg, int bg)
/* Write character and attribute at cursor position. */
void
-write_char(int c, int fg, int bg)
+write_char(int c, int fgcol, int bgcol)
{
#ifdef PC98
*crtat = (c == 0x5c ? 0xfc : c);
- *(crtat + 0x1000) = at2pc98(fg, bg);
+ *(crtat + 0x1000) = at2pc98(fgcol, bgcol);
#else
v86.ctl=0;
v86.addr = 0x10;
v86.eax = 0x0900+(0x00ff & c);
- v86.ebx = (bg<<4)+fg;
+ v86.ebx = (bgcol<<4)+fgcol;
v86.ecx = 0x1;
v86int();
#endif
diff --git a/sys/boot/pc98/loader/Makefile b/sys/boot/pc98/loader/Makefile
index be545d8..274d4ff 100644
--- a/sys/boot/pc98/loader/Makefile
+++ b/sys/boot/pc98/loader/Makefile
@@ -14,8 +14,11 @@ SRCS= main.c conf.c
.PATH: ${.CURDIR}/../../i386/loader
# Enable PXE TFTP or NFS support, not both.
+.if defined(LOADER_TFTP_SUPPORT)
+CFLAGS+= -DLOADER_TFTP_SUPPORT
+.else
CFLAGS+= -DLOADER_NFS_SUPPORT
-#CFLAGS+= -DLOADER_TFTP_SUPPORT
+.endif
# Enable PnP and ISA-PnP code.
HAVE_PNP= yes
diff --git a/sys/boot/pc98/loader/main.c b/sys/boot/pc98/loader/main.c
index a02b1ac..5cfb122 100644
--- a/sys/boot/pc98/loader/main.c
+++ b/sys/boot/pc98/loader/main.c
@@ -63,6 +63,7 @@ struct arch_switch archsw; /* MI/MD interface boundary */
static void extract_currdev(void);
static int isa_inb(int port);
static void isa_outb(int port, int value);
+void exit(int code);
/* from vers.c */
extern char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[];
@@ -70,7 +71,7 @@ extern char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[];
/* XXX debugging */
extern char end[];
-void
+int
main(void)
{
int i;
@@ -140,6 +141,9 @@ main(void)
archsw.arch_isaoutb = isa_outb;
interact(); /* doesn't return */
+
+ /* if we ever get here, it is an error */
+ return (1);
}
/*
@@ -151,40 +155,41 @@ main(void)
static void
extract_currdev(void)
{
- struct i386_devdesc currdev;
+ struct i386_devdesc new_currdev;
int major, biosdev;
/* Assume we are booting from a BIOS disk by default */
- currdev.d_dev = &biosdisk;
- currdev.d_type = currdev.d_dev->dv_type;
+ new_currdev.d_dev = &biosdisk;
+ new_currdev.d_type = new_currdev.d_dev->dv_type;
/* new-style boot loaders such as pxeldr and cdldr */
if (kargs->bootinfo == NULL) {
if ((kargs->bootflags & KARGS_FLAGS_CD) != 0) {
/* we are booting from a CD with cdldr */
- currdev.d_kind.biosdisk.slice = -1;
- currdev.d_kind.biosdisk.partition = 0;
+ new_currdev.d_kind.biosdisk.slice = -1;
+ new_currdev.d_kind.biosdisk.partition = 0;
biosdev = initial_bootdev;
} else if ((kargs->bootflags & KARGS_FLAGS_PXE) != 0) {
/* we are booting from pxeldr */
- currdev.d_dev = &pxedisk;
- currdev.d_type = currdev.d_dev->dv_type;
- currdev.d_kind.netif.unit = 0;
+ new_currdev.d_dev = &pxedisk;
+ new_currdev.d_type = new_currdev.d_dev->dv_type;
+ new_currdev.d_kind.netif.unit = 0;
+ biosdev = -1;
} else {
/* we don't know what our boot device is */
- currdev.d_kind.biosdisk.slice = -1;
- currdev.d_kind.biosdisk.partition = 0;
+ new_currdev.d_kind.biosdisk.slice = -1;
+ new_currdev.d_kind.biosdisk.partition = 0;
biosdev = -1;
}
} else if ((initial_bootdev & B_MAGICMASK) != B_DEVMAGIC) {
/* The passed-in boot device is bad */
- currdev.d_kind.biosdisk.slice = -1;
- currdev.d_kind.biosdisk.partition = 0;
+ new_currdev.d_kind.biosdisk.slice = -1;
+ new_currdev.d_kind.biosdisk.partition = 0;
biosdev = -1;
} else {
- currdev.d_kind.biosdisk.slice = (B_ADAPTOR(initial_bootdev) << 4) +
- B_CONTROLLER(initial_bootdev) - 1;
- currdev.d_kind.biosdisk.partition = B_PARTITION(initial_bootdev);
+ new_currdev.d_kind.biosdisk.slice = (B_ADAPTOR(initial_bootdev) << 4) +
+ B_CONTROLLER(initial_bootdev) - 1;
+ new_currdev.d_kind.biosdisk.partition = B_PARTITION(initial_bootdev);
biosdev = initial_bootinfo->bi_bios_dev;
major = B_TYPE(initial_bootdev);
@@ -211,14 +216,16 @@ extract_currdev(void)
* If we are booting off of a BIOS disk and we didn't succeed in determining
* which one we booted off of, just use disk0: as a reasonable default.
*/
- if ((currdev.d_type == devsw[0]->dv_type) &&
- ((currdev.d_kind.biosdisk.unit = bd_bios2unit(biosdev)) == -1)) {
+ if ((new_currdev.d_type == devsw[0]->dv_type) &&
+ ((new_currdev.d_kind.biosdisk.unit = bd_bios2unit(biosdev)) == -1)) {
printf("Can't work out which disk we are booting from.\n"
"Guessed BIOS device 0x%x not found by probes, defaulting to disk0:\n", biosdev);
- currdev.d_kind.biosdisk.unit = 0;
+ new_currdev.d_kind.biosdisk.unit = 0;
}
- env_setenv("currdev", EV_VOLATILE, i386_fmtdev(&currdev), i386_setcurrdev, env_nounset);
- env_setenv("loaddev", EV_VOLATILE, i386_fmtdev(&currdev), env_noset, env_nounset);
+ env_setenv("currdev", EV_VOLATILE, i386_fmtdev(&new_currdev),
+ i386_setcurrdev, env_nounset);
+ env_setenv("loaddev", EV_VOLATILE, i386_fmtdev(&new_currdev), env_noset,
+ env_nounset);
}
COMMAND_SET(reboot, "reboot", "reboot the system", command_reboot);
OpenPOWER on IntegriCloud