Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/x68k/stand Add SCSI host adaptor selector to "boot"...
details: https://anonhg.NetBSD.org/src/rev/c79e49fc99b2
branches: trunk
changeset: 346108:c79e49fc99b2
user: isaki <isaki%NetBSD.org@localhost>
date: Sun Jun 26 04:17:17 2016 +0000
description:
Add SCSI host adaptor selector to "boot" command of /boot.
By this function, /boot which booted from non-SCSI
(in other words, floppy) can load SCSI kernel.
Now, single /boot can load kernel of all supported filesystems
of all supported boot devices.
---
New "boot" command's syntax is: boot [hostadaptor@][dev:][file]
If you booted from SCSI, hostadaptor is already set (from IOCS)
and you can omit hostadaptor in this case. You can type like
"boot sd0a:netbsd" as before.
If you booted from floppy (hostadaptor is not set) and want to
load the SCSI kernel (hostadaptor is needed), you have to select
your hostadaptor in boot command, like "boot spc0@sd0a:netbsd".
diffstat:
sys/arch/x68k/stand/boot/boot.c | 54 ++++++++++++++++++++++++++----------
sys/arch/x68k/stand/libsa/devopen.c | 28 +++++++++++++++---
sys/arch/x68k/stand/libsa/libx68k.h | 4 +-
3 files changed, 63 insertions(+), 23 deletions(-)
diffs (202 lines):
diff -r f4205197e09d -r c79e49fc99b2 sys/arch/x68k/stand/boot/boot.c
--- a/sys/arch/x68k/stand/boot/boot.c Sun Jun 26 04:01:30 2016 +0000
+++ b/sys/arch/x68k/stand/boot/boot.c Sun Jun 26 04:17:17 2016 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: boot.c,v 1.28 2016/06/25 16:05:43 isaki Exp $ */
+/* $NetBSD: boot.c,v 1.29 2016/06/26 04:17:17 isaki Exp $ */
/*
* Copyright (c) 2001 Minoura Makoto
@@ -78,13 +78,21 @@
static int
get_scsi_host_adapter(void)
{
+ uint32_t bootinf;
char *bootrom;
int ha;
- bootrom = (char *) (IOCS_BOOTINF() & 0x00ffffe0);
+ bootinf = IOCS_BOOTINF();
+ if (bootinf < 0xa0) {
+ /* boot from FD */
+ return 0;
+ }
+
+ /* Or, bootinf indicates the boot address */
+ bootrom = (char *)(bootinf & 0x00ffffe0);
/*
- * bootrom+0x24 "SCSIIN" ... Internal SCSI (spc@0)
- * "SCSIEX" ... External SCSI (spc@1 or mha@0)
+ * bootrom+0x24 "SCSIIN" ... Internal SCSI (spc0@)
+ * "SCSIEX" ... External SCSI (spc1@ or mha0@)
*/
if (*(u_short *)(bootrom + 0x24 + 4) == 0x494e) { /* "IN" */
ha = (X68K_BOOT_SCSIIF_SPC << 4) | 0;
@@ -101,7 +109,8 @@
help(void)
{
printf("Usage:\n");
- printf("boot [dev:][file] -[flags]\n");
+ printf("boot [ha@][dev:][file] -[flags]\n");
+ printf(" ha: spc0, spc1, mha0\n");
printf(" dev: sd<ID><PART>, ID=0-7, PART=a-p\n");
printf(" cd<ID>a, ID=0-7\n");
printf(" fd<UNIT>a, UNIT=0-3, format is detected.\n");
@@ -118,10 +127,12 @@
{
u_long marks[MARK_MAX];
int fd;
+ int ha; /* host adaptor */
int dev; /* device number in devspec[] */
int unit;
int part;
int bootdev;
+ int maj;
char *name;
short *p;
int loadflag;
@@ -129,7 +140,7 @@
printf("Starting %s, flags 0x%x\n", file, flags);
- if (devparse(file, &dev, &unit, &part, &name) != 0) {
+ if (devparse(file, &ha, &dev, &unit, &part, &name) != 0) {
printf("XXX: unknown corruption in /boot.\n");
}
@@ -138,29 +149,40 @@
printf("dev = %x, unit = %d, name = %s\n",
dev, unit, name);
} else {
- printf("dev = %x, unit = %d, part = %c, name = %s\n",
- dev, unit, part + 'a', name);
+ printf("ha = 0x%x, dev = %x, unit = %d, part = %c, name = %s\n",
+ ha, dev, unit, part + 'a', name);
}
#endif
if (dev == 3) { /* netboot */
bootdev = X68K_MAKEBOOTDEV(X68K_MAJOR_NE, unit, 0);
- } else if (dev == 0) { /* SCSI */
- bootdev = X68K_MAKESCSIBOOTDEV(X68K_MAJOR_SD,
- hostadaptor >> 4,
- hostadaptor & 15,
- unit & 7, 0, 0);
- } else {
+ } else if (dev == 2) { /* FD */
bootdev = X68K_MAKEBOOTDEV(X68K_MAJOR_FD, unit & 3, 0);
+ } else { /* SCSI */
+ if (ha != 0) {
+ hostadaptor = ha;
+ }
+ if (hostadaptor == 0) {
+ printf("host adaptor must be specified.\n");
+ return;
+ }
+
+ maj = (dev == 0) ? X68K_MAJOR_SD : X68K_MAJOR_CD;
+ bootdev = X68K_MAKESCSIBOOTDEV(maj,
+ hostadaptor >> 4,
+ hostadaptor & 15,
+ unit & 7, 0, 0);
}
#ifdef DEBUG
printf("boot device = %x\n", bootdev);
if (file[0] == 'n') {
- printf("if = %d, unit = %d\n",
+ printf("type = %x, if = %d, unit = %d\n",
+ B_TYPE(bootdev),
B_X68K_SCSI_IF(bootdev),
B_X68K_SCSI_IF_UN(bootdev));
} else {
- printf("if = %d, unit = %d, id = %d, lun = %d, part = %c\n",
+ printf("type = %x, if = %d, unit = %d, id = %d, lun = %d, part = %c\n",
+ B_TYPE(bootdev),
B_X68K_SCSI_IF(bootdev),
B_X68K_SCSI_IF_UN(bootdev),
B_X68K_SCSI_ID(bootdev),
diff -r f4205197e09d -r c79e49fc99b2 sys/arch/x68k/stand/libsa/devopen.c
--- a/sys/arch/x68k/stand/libsa/devopen.c Sun Jun 26 04:01:30 2016 +0000
+++ b/sys/arch/x68k/stand/libsa/devopen.c Sun Jun 26 04:17:17 2016 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: devopen.c,v 1.6 2012/10/12 20:15:52 tsutsui Exp $ */
+/* $NetBSD: devopen.c,v 1.7 2016/06/26 04:17:17 isaki Exp $ */
/*
* Copyright (c) 2001 Minoura Makoto
@@ -28,6 +28,7 @@
#include <sys/param.h>
#include <sys/disklabel.h>
+#include <machine/bootinfo.h>
#include <lib/libkern/libkern.h>
#include <lib/libsa/stand.h>
#include "libx68k.h"
@@ -38,17 +39,34 @@
/*
* Parse a device spec.
*
- * sd<unit><part>:<file>
+ * [ha@]<dev><unit><part>:<file>
+ * ha - host adaptor ("spc0", "spc1", "mha0")
+ * dev - device name (e.g., "sd")
* unit - 0-7
* part - a-p
*/
int
-devparse(const char *fname, int *dev, int *unit, int *part, char **file)
+devparse(const char *fname, int *ha, int *dev, int *unit, int *part,
+ char **file)
{
char const *s;
int i;
s = fname;
+
+ if (strncmp(s, "spc0@", 5) == 0) {
+ *ha = (X68K_BOOT_SCSIIF_SPC << 4) | 0;
+ s += 5;
+ } else if (strncmp(s, "spc1@", 5) == 0) {
+ *ha = (X68K_BOOT_SCSIIF_SPC << 4) | 1;
+ s += 5;
+ } else if (strncmp(s, "mha0@", 5) == 0) {
+ *ha = (X68K_BOOT_SCSIIF_MHA << 4) | 0;
+ s += 5;
+ } else {
+ *ha = 0;
+ }
+
for (i = 0; devspec[i].ds_name != 0; i++) {
if (strncmp (devspec[i].ds_name, s,
strlen(devspec[i].ds_name)) == 0)
@@ -91,10 +109,10 @@
devopen(struct open_file *f, const char *fname, char **file)
{
int error;
- int dev, unit, part;
+ int ha, dev, unit, part;
struct devsw *dp = &devsw[0];
- error = devparse(fname, &dev, &unit, &part, file);
+ error = devparse(fname, &ha, &dev, &unit, &part, file);
if (error)
return error;
diff -r f4205197e09d -r c79e49fc99b2 sys/arch/x68k/stand/libsa/libx68k.h
--- a/sys/arch/x68k/stand/libsa/libx68k.h Sun Jun 26 04:01:30 2016 +0000
+++ b/sys/arch/x68k/stand/libsa/libx68k.h Sun Jun 26 04:17:17 2016 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: libx68k.h,v 1.6 2012/10/12 20:15:52 tsutsui Exp $ */
+/* $NetBSD: libx68k.h,v 1.7 2016/06/26 04:17:17 isaki Exp $ */
/*
* Copyright (c) 2001 Minoura Makoto
@@ -64,7 +64,7 @@
int fdclose(struct open_file *);
/* devopen.c */
-int devparse(const char *, int *, int *, int *, char **);
+int devparse(const char *, int *, int *, int *, int *, char **);
extern int devopen_open_dir;
/* chdsk.c */
Home |
Main Index |
Thread Index |
Old Index