Change format of path for device. A current form strangely feels dissatisfied.
This new format looks like the format of BootROM of BeBox.
This commit is contained in:
parent
246f73effa
commit
9fe16975a7
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: boot.c,v 1.20 2010/10/14 06:17:57 kiyohara Exp $ */
|
||||
/* $NetBSD: boot.c,v 1.21 2010/10/14 06:39:52 kiyohara Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
|
||||
@ -42,10 +42,9 @@
|
||||
#include "boot.h"
|
||||
|
||||
char *names[] = {
|
||||
"in()",
|
||||
"fd(0,1,0)netbsd", "fd(0,1,0)netbsd.gz",
|
||||
"fd(0,1,0)netbsd.old", "fd(0,1,0)netbsd.old.gz",
|
||||
"fd(0,1,0)onetbsd", "fd(0,1,0)onetbsd.gz"
|
||||
"/dev/disk/floppy:netbsd", "/dev/disk/floppy:netbsd.gz",
|
||||
"/dev/disk/floppy:onetbsd", "/dev/disk/floppy:onetbsd.gz"
|
||||
"in",
|
||||
};
|
||||
#define NUMNAMES (sizeof (names) / sizeof (names[0]))
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: conf.c,v 1.6 2005/12/11 12:17:04 christos Exp $ */
|
||||
/* $NetBSD: conf.c,v 1.7 2010/10/14 06:39:52 kiyohara Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1982, 1986, 1990, 1993
|
||||
@ -34,17 +34,19 @@
|
||||
#include <sys/param.h>
|
||||
#include <lib/libsa/stand.h>
|
||||
|
||||
int fdstrategy(void *, int, daddr_t, size_t, void *, size_t *);
|
||||
int fdopen(struct open_file *, ...);
|
||||
int fdclose(struct open_file *);
|
||||
extern int fdstrategy(void *, int, daddr_t, size_t, void *, size_t *);
|
||||
extern int fdopen(struct open_file *, ...);
|
||||
extern int fdclose(struct open_file *);
|
||||
|
||||
int instrategy(void *, int, daddr_t, size_t, void *, size_t *);
|
||||
int inopen(struct open_file *, ...);
|
||||
int inclose(struct open_file *);
|
||||
extern int instrategy(void *, int, daddr_t, size_t, void *, size_t *);
|
||||
extern int inopen(struct open_file *, ...);
|
||||
extern int inclose(struct open_file *);
|
||||
|
||||
struct devsw devsw[] = {
|
||||
{ "fd", fdstrategy, fdopen, fdclose, noioctl },
|
||||
{ "in", instrategy, inopen, inclose, noioctl },
|
||||
|
||||
{ NULL, NULL, NULL, NULL, NULL },
|
||||
};
|
||||
struct devsw pseudo_devsw = { "in", instrategy, inopen, inclose, noioctl };
|
||||
|
||||
int ndevs = sizeof(devsw) / sizeof(devsw[0]);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: devopen.c,v 1.9 2008/05/26 16:28:39 kiyohara Exp $ */
|
||||
/* $NetBSD: devopen.c,v 1.10 2010/10/14 06:39:52 kiyohara Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1993 John Brezak
|
||||
@ -33,125 +33,132 @@
|
||||
#include <sys/param.h>
|
||||
#include <sys/reboot.h>
|
||||
|
||||
#define ispart(c) ((c) >= 'a' && (c) <= 'h')
|
||||
|
||||
static int atoi(char *);
|
||||
static int devlookup(char *);
|
||||
static int devparse(const char *, int *, int *, int *, int *, int *, char **);
|
||||
|
||||
|
||||
static int
|
||||
atoi(char *cp)
|
||||
{
|
||||
int val = 0;
|
||||
|
||||
while (isdigit(*cp))
|
||||
val = val * 10 + (*cp++ - '0');
|
||||
return val;
|
||||
}
|
||||
|
||||
static int
|
||||
devlookup(char *d)
|
||||
{
|
||||
struct devsw *dp = devsw;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ndevs; i++, dp++)
|
||||
if (dp->dv_name && strcmp(dp->dv_name, d) == 0)
|
||||
return i;
|
||||
|
||||
printf("No such device - Configured devices are:\n");
|
||||
for (dp = devsw, i = 0; i < ndevs; i++, dp++)
|
||||
if (dp->dv_name)
|
||||
printf(" %s", dp->dv_name);
|
||||
printf("\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse a device spec in one of two forms.
|
||||
* dev(ctlr, unit, part)file
|
||||
* Parse a device spec.
|
||||
* i.e.
|
||||
* /dev/disk/floppy
|
||||
* /dev/disk/ide/0/master/0
|
||||
* /dev/disk/ide/0/slave/0
|
||||
* /dev/disk/scsi/0/0/0
|
||||
* /dev/disk/scsi/0/3/0
|
||||
*/
|
||||
static int
|
||||
devparse(const char *fname, int *dev, int *adapt, int *ctlr, int *unit,
|
||||
devparse(const char *fname, int *dev, int *ctlr, int *unit, int *lunit,
|
||||
int *part, char **file)
|
||||
{
|
||||
int argc, flag;
|
||||
char *s, *args[3];
|
||||
extern char nametmp[];
|
||||
int i;
|
||||
char devdir[] = "/dev/disk/";
|
||||
char floppy[] = "floppy";
|
||||
char ide[] = "ide";
|
||||
char scsi[] = "scsi";
|
||||
char *p;
|
||||
|
||||
/* get device name and make lower case */
|
||||
strcpy(nametmp, (char *)fname);
|
||||
for (s = nametmp; *s && *s != '('; s++)
|
||||
if (isupper(*s)) *s = tolower(*s);
|
||||
if (strncmp(fname, devdir, strlen(devdir)) != 0)
|
||||
return EINVAL;
|
||||
p = __UNCONST(fname) + strlen(devdir);
|
||||
|
||||
if (*s == '(') {
|
||||
/* lookup device and get index */
|
||||
*s = NULL;
|
||||
if ((*dev = devlookup(nametmp)) < 0)
|
||||
goto baddev;
|
||||
|
||||
/* tokenize device ident */
|
||||
for (++s, flag = 0, argc = 0; *s && *s != ')'; s++) {
|
||||
if (*s != ',') {
|
||||
if (!flag) {
|
||||
flag++;
|
||||
args[argc++] = s;
|
||||
}
|
||||
} else {
|
||||
if (flag) {
|
||||
*s = NULL;
|
||||
flag = 0;
|
||||
}
|
||||
if (strncmp(p, floppy, strlen(floppy)) == 0) {
|
||||
p += strlen(floppy);
|
||||
for (i = 0; devsw[i].dv_name != NULL; i++)
|
||||
if (strcmp(devsw[i].dv_name, "fd") == 0) {
|
||||
*dev = i;
|
||||
*ctlr = 0;
|
||||
*unit = 1;
|
||||
*lunit = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (*s == ')')
|
||||
*s = NULL;
|
||||
} else if (strncmp(p, ide, strlen(ide)) == 0) {
|
||||
char master[] = "master";
|
||||
char slave[] = "slave";
|
||||
|
||||
switch (argc) {
|
||||
case 3:
|
||||
*part = atoi(args[2]);
|
||||
/* FALLTHROUGH */
|
||||
case 2:
|
||||
*unit = atoi(args[1]);
|
||||
/* FALLTHROUGH */
|
||||
case 1:
|
||||
*ctlr = atoi(args[0]);
|
||||
break;
|
||||
}
|
||||
*file = ++s;
|
||||
} else {
|
||||
/* no device present */
|
||||
*file = (char *)fname;
|
||||
p += strlen(ide);
|
||||
if (*p++ != '/' ||
|
||||
!isdigit(*p++) ||
|
||||
*p++ != '/')
|
||||
return EINVAL;
|
||||
*ctlr = *(p - 2) - '0';
|
||||
if (strncmp(p, master, strlen(master)) == 0) {
|
||||
*unit = 0;
|
||||
p += strlen(master);
|
||||
} else if (strncmp(p, slave, strlen(slave)) == 0) {
|
||||
*unit = 1;
|
||||
p += strlen(slave);
|
||||
} else
|
||||
return EINVAL;
|
||||
if (*p++ != '/' ||
|
||||
!isdigit(*p++) ||
|
||||
*p++ != '_' ||
|
||||
!isdigit(*p++))
|
||||
return EINVAL;
|
||||
*lunit = *(p - 3) - '0';
|
||||
*part = *(p - 1) - '0';
|
||||
for (i = 0; devsw[i].dv_name != NULL; i++)
|
||||
if (strcmp(devsw[i].dv_name, "wd") == 0) {
|
||||
*dev = i;
|
||||
break;
|
||||
}
|
||||
if (devsw[i].dv_name == NULL)
|
||||
return EINVAL;
|
||||
} else if (strncmp(p, scsi, strlen(scsi)) == 0) {
|
||||
p += strlen(scsi);
|
||||
if (*p++ != '/' ||
|
||||
!isdigit(*p++) ||
|
||||
*p++ != '/' ||
|
||||
!isdigit(*p++) ||
|
||||
*p++ != '/' ||
|
||||
!isdigit(*p++) ||
|
||||
*p++ != '_' ||
|
||||
!isdigit(*p++))
|
||||
return EINVAL;
|
||||
*ctlr = *(p - 7) - '0';
|
||||
*unit = *(p - 5) - '0';
|
||||
*lunit = *(p - 3) - '0';
|
||||
*part = *(p - 1) - '0';
|
||||
for (i = 0; devsw[i].dv_name != NULL; i++)
|
||||
if (strcmp(devsw[i].dv_name, "sd") == 0) {
|
||||
*dev = i;
|
||||
break;
|
||||
}
|
||||
if (devsw[i].dv_name == NULL)
|
||||
return EINVAL;
|
||||
}
|
||||
return 0;
|
||||
|
||||
baddev:
|
||||
return EINVAL;
|
||||
if (*p++ != ':')
|
||||
return EINVAL;
|
||||
*file = p;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
devopen(struct open_file *f, const char *fname, char **file)
|
||||
{
|
||||
int error;
|
||||
int dev = 0, ctlr = 0, unit = 0, part = 0;
|
||||
int adapt = 0;
|
||||
int dev = 0, ctlr = 0, unit = 0, lunit = 0, part = 0;
|
||||
struct devsw *dp = &devsw[0];
|
||||
extern struct devsw pseudo_devsw;
|
||||
|
||||
if ((error =
|
||||
devparse(fname, &dev, &adapt, &ctlr, &unit, &part, file)) != 0)
|
||||
return error;
|
||||
|
||||
dp = &devsw[dev];
|
||||
if (!dp->dv_open)
|
||||
return ENODEV;
|
||||
**file = '\0';
|
||||
error = devparse(fname, &dev, &ctlr, &unit, &lunit, &part, file);
|
||||
if (error == 0) {
|
||||
dp = &devsw[dev];
|
||||
if (!dp->dv_open)
|
||||
return ENODEV;
|
||||
} else {
|
||||
if (strcmp(fname, "in") == 0)
|
||||
/* special case: kernel in memory */
|
||||
dp = &pseudo_devsw;
|
||||
else
|
||||
return error;
|
||||
}
|
||||
|
||||
f->f_dev = dp;
|
||||
if ((error = (*dp->dv_open)(f, ctlr, unit, part)) == 0)
|
||||
if ((error = (*dp->dv_open)(f, ctlr, unit, lunit, part)) == 0)
|
||||
return 0;
|
||||
|
||||
printf("%s(%d,%d,%d): %s\n", devsw[dev].dv_name,
|
||||
ctlr, unit, part, strerror(error));
|
||||
printf("%s %s\n", fname, strerror(error));
|
||||
|
||||
return error;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: fd.c,v 1.9 2009/03/18 10:22:27 cegger Exp $ */
|
||||
/* $NetBSD: fd.c,v 1.10 2010/10/14 06:39:52 kiyohara Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (C) 1997-1998 Kazuki Sakamoto (sakamoto@NetBSD.org)
|
||||
@ -136,7 +136,6 @@ int fdsectors[] = {128, 256, 512, 1024, 2048, 4096};
|
||||
struct fd_unit {
|
||||
int ctlr;
|
||||
int unit;
|
||||
int part;
|
||||
u_int un_flags; /* unit status flag */
|
||||
int stat[STATUS_MAX]; /* result code */
|
||||
FDDTYPE *un_type; /* floppy type (pointer) */
|
||||
@ -164,7 +163,7 @@ FD_UNIT fd_unit[CTLR_MAX][UNIT_MAX];
|
||||
* function declaration
|
||||
*/
|
||||
int fdinit(FD_UNIT *);
|
||||
int fdopen(struct open_file *, int, int, int);
|
||||
int fdopen(struct open_file *, int, int);
|
||||
int fdclose(struct open_file *);
|
||||
int fdioctl(struct open_file *, u_long, void *);
|
||||
int fdstrategy(void *, int, daddr_t, size_t, void *, size_t *);
|
||||
@ -221,7 +220,7 @@ fdinit(FD_UNIT *un)
|
||||
* fdopen *
|
||||
*===========================================================================*/
|
||||
int
|
||||
fdopen(struct open_file *f, int ctlr, int unit, int part)
|
||||
fdopen(struct open_file *f, int ctlr, int unit)
|
||||
{
|
||||
FD_UNIT *un;
|
||||
int *stat;
|
||||
|
Loading…
Reference in New Issue
Block a user