diff --git a/sys/boot/alpha/libalpha/elf_freebsd.c b/sys/boot/alpha/libalpha/elf_freebsd.c index b2e59aeef896..402266b084fd 100644 --- a/sys/boot/alpha/libalpha/elf_freebsd.c +++ b/sys/boot/alpha/libalpha/elf_freebsd.c @@ -1,4 +1,4 @@ -/* $Id: elf_freebsd.c,v 1.1.1.1 1998/08/21 03:17:42 msmith Exp $ */ +/* $Id: elf_freebsd.c,v 1.2 1998/08/31 21:10:40 msmith Exp $ */ /* $NetBSD: loadfile.c,v 1.10 1998/06/25 06:45:46 ross Exp $ */ /*- @@ -130,11 +130,10 @@ elf_loadmodule(char *filename, vm_offset_t dest, struct loaded_module **result) /* * Ok, we think this is for us. */ - mp = malloc(sizeof(struct loaded_module)); + mp = mod_allocmodule(); mp->m_name = strdup(filename); /* XXX should we prune the name? */ mp->m_type = strdup("elf kernel"); /* XXX only if that's what we really are */ - mp->m_args = NULL; /* XXX should we put the bootstrap args here and parse later? */ - mp->m_metadata = NULL; + dest = (vm_offset_t) hdr.e_entry; mp->m_addr = dest; if (mod_findmodule(NULL, NULL) != NULL) { diff --git a/sys/boot/common/Makefile.inc b/sys/boot/common/Makefile.inc index 8826353c715a..0eacbe7aa883 100644 --- a/sys/boot/common/Makefile.inc +++ b/sys/boot/common/Makefile.inc @@ -1,4 +1,12 @@ -# $Id: Makefile.inc,v 1.3 1998/09/01 00:41:24 msmith Exp $ +# $Id: Makefile.inc,v 1.4 1998/09/04 02:43:26 msmith Exp $ SRCS+= boot.c commands.c console.c devopen.c interp.c interp_backslash.c -SRCS+= interp_parse.c load_aout.c ls.c misc.c module.c panic.c # pnp.c +SRCS+= interp_parse.c load_aout.c ls.c misc.c module.c panic.c + +# Machine-independant ISA PnP +.if HAVE_ISABUS +SRCS+= isapnp.c +.endif +.if HAVE_PNP +SRCS+= pnp.c +.endif diff --git a/sys/boot/common/bootstrap.h b/sys/boot/common/bootstrap.h index 0d7950cd03f9..f624c295167f 100644 --- a/sys/boot/common/bootstrap.h +++ b/sys/boot/common/bootstrap.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bootstrap.h,v 1.3 1998/09/03 02:10:07 msmith Exp $ + * $Id: bootstrap.h,v 1.4 1998/09/04 02:43:26 msmith Exp $ */ #include @@ -57,6 +57,9 @@ extern char command_errbuf[]; /* XXX blah, length */ extern void interact(void); extern void source(char *filename); +/* interp_parse.c */ +extern int parse(int *argc, char ***argv, char *str); + /* boot.c */ extern int autoboot(int delay, char *prompt); @@ -89,25 +92,33 @@ extern void cons_probe(void); /* * Plug-and-play enumerator/configurator interface. */ +struct pnpident +{ + char *id_ident; /* ASCII identifier, actual format varies with bus/handler */ + struct pnpident *id_next; /* the next identifier */ +}; + +struct pnphandler; struct pnpinfo { - char *pi_ident; /* ASCII identifier, actual format varies with bus/handler */ + struct pnpident *pi_ident; /* list of identifiers */ int pi_revision; /* optional revision (or -1) if not supported */ char *pi_module; /* module/args nominated to handle device */ int pi_argc; /* module arguments */ char **pi_argv; - int pi_handler; /* handler which detected this device */ + struct pnphandler *pi_handler; /* handler which detected this device */ struct pnpinfo *pi_next; -} +}; struct pnphandler { - char *pp_name; /* handler/bus name */ - struct pnpinfo *(pp_enumerate *)(int index); /* return a string identifying device (index) */ + char *pp_name; /* handler/bus name */ + void (* pp_enumerate)(struct pnpinfo **); /* add detected devices to chain */ }; -extern struct pnphandler *pnphandlers[]; /* provided by MD code */ - +extern struct pnphandler *pnphandlers[]; /* provided by MD code */ + +extern void pnp_addident(struct pnpinfo *pi, char *ident); /* * Module metadata header. @@ -158,11 +169,21 @@ extern struct loaded_module *mod_findmodule(char *name, char *type); extern void mod_addmetadata(struct loaded_module *mp, int type, size_t size, void *p); extern struct module_metadata *mod_findmetadata(struct loaded_module *mp, int type); extern void mod_discard(struct loaded_module *mp); +extern struct loaded_module *mod_allocmodule(void); + + +/* MI module loaders */ +extern int aout_loadmodule(char *filename, vm_offset_t dest, struct loaded_module **result); +extern vm_offset_t aout_findsym(char *name, struct loaded_module *mp); + +/* extern int elf_loadmodule(char *filename, vm_offset_t dest, struct loaded_module **result); */ /* * Module information subtypes + * + * XXX these are copies of the defines in , and should be nuked + * XXX before being committed. */ -/* XXX these belong in */ #define MODINFO_NAME 0x0000 #define MODINFO_TYPE 0x0001 #define MODINFO_ADDR 0x0002 @@ -173,16 +194,12 @@ extern void mod_discard(struct loaded_module *mp); #define MODINFOMD_ELFHDR 0x0002 /* ELF header */ #define MODINFOMD_NOCOPY 0x8000 /* don't copy this metadata to the kernel */ -/* MI module loaders */ -extern int aout_loadmodule(char *filename, vm_offset_t dest, struct loaded_module **result); -extern vm_offset_t aout_findsym(char *name, struct loaded_module *mp); - -/* extern int elf_loadmodule(char *filename, vm_offset_t dest, struct loaded_module **result); */ - #define KLD_IDENT_SYMNAME "kld_identifier_" #define MODINFOMD_KLDIDENT (MODINFOMD_NOCOPY | 0x4000) #define MODINFOMD_KLDDEP (MODINFOMD_NOCOPY | 0x4001) + + #if defined(__ELF__) /* @@ -268,9 +285,15 @@ struct arch_switch int (*arch_copyout)(vm_offset_t src, void *dest, size_t len); /* Read from file to module address space, same semantics as read() */ int (*arch_readin)(int fd, vm_offset_t dest, size_t len); + /* Perform ISA byte port I/O (only for systems with ISA) */ + int (*arch_isainb)(int port); + void (*arch_isaoutb)(int port, int value); }; extern struct arch_switch archsw; +/* This must be provided by the MD code, but should it be in the archsw? */ +extern void delay(int delay); + /* * XXX these belong in a system header */ diff --git a/sys/boot/common/interp.c b/sys/boot/common/interp.c index c58b1c4f3d16..69a2fc365938 100644 --- a/sys/boot/common/interp.c +++ b/sys/boot/common/interp.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: interp.c,v 1.2 1998/09/01 00:41:24 msmith Exp $ + * $Id: interp.c,v 1.3 1998/09/03 02:10:07 msmith Exp $ */ /* * Simple commandline interpreter, toplevel and misc. @@ -37,8 +37,6 @@ #define MAXARGS 20 /* maximum number of arguments allowed */ -extern int parse(int *argc, char ***argv, char *str); /* interp_parse.c */ - static void prompt(void); /* diff --git a/sys/boot/common/load_aout.c b/sys/boot/common/load_aout.c index 5c593724d309..3ecba66f6a3a 100644 --- a/sys/boot/common/load_aout.c +++ b/sys/boot/common/load_aout.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: load_aout.c,v 1.1 1998/08/31 21:10:42 msmith Exp $ + * $Id: load_aout.c,v 1.2 1998/09/03 02:10:07 msmith Exp $ */ #include @@ -126,11 +126,11 @@ aout_loadmodule(char *filename, vm_offset_t dest, struct loaded_module **result) /* * Ok, we think we should handle this. */ - mp = malloc(sizeof(struct loaded_module)); - mp->m_name = kernel ? strdup(filename) : NULL; /* XXX should we prune the name? */ + mp = mod_allocmodule(); + if (kernel) + mp->m_name = strdup(filename); /* XXX should we prune the name? */ mp->m_type = strdup(kernel ? aout_kerneltype : aout_moduletype); - mp->m_args = NULL; /* filled in by parent */ - mp->m_metadata = NULL; + /* Page-align the load address */ addr = dest; pad = (u_int)addr & PAGE_MASK; diff --git a/sys/boot/common/module.c b/sys/boot/common/module.c index f10fe3bafeaf..d7f40197838a 100644 --- a/sys/boot/common/module.c +++ b/sys/boot/common/module.c @@ -23,14 +23,11 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: module.c,v 1.2 1998/08/31 21:10:42 msmith Exp $ + * $Id: module.c,v 1.3 1998/09/03 02:10:08 msmith Exp $ */ /* * module function dispatcher, support, etc. - * - * XXX need a 'searchmodule' function that takes a name and - * traverses a search path. */ #include @@ -40,12 +37,15 @@ static struct loaded_module *mod_loadmodule(char *name, int argc, char *argv[]); static char *mod_searchdep(struct loaded_module *mp); +static char *mod_searchfile(char *name); static char *mod_searchmodule(char *name); static void mod_append(struct loaded_module *mp); -/* XXX load address should be tweaked by first module loaded (kernel) */ +/* load address should be tweaked by first module loaded (kernel) */ static vm_offset_t loadaddr = 0; +static char *default_searchpath ="/;/boot"; + struct loaded_module *loaded_modules = NULL; /* @@ -231,9 +231,13 @@ mod_loadobj(char *type, char *name) return(CMD_ERROR); } - /* Try to come up with a fully-qualified name if we don't have one */ - if ((cp = mod_searchmodule(name)) != NULL) - name = cp; + /* locate the file on the load path */ + cp = mod_searchfile(name); + if (cp == NULL) { + sprintf(command_errbuf, "can't find '%s'", name); + return(CMD_ERROR); + } + name = cp; if ((fd = open(name, O_RDONLY)) < 0) { sprintf(command_errbuf, "can't open '%s': %s", name, strerror(errno)); @@ -282,9 +286,14 @@ mod_loadmodule(char *name, int argc, char *argv[]) int i, err; char *cp; - /* Try to come up with a fully-qualified name if we don't have one */ - if ((cp = mod_searchmodule(name)) != NULL) - name = cp; + /* locate the module on the search path */ + cp = mod_searchmodule(name); + if (cp == NULL) { + sprintf(command_errbuf, "can't find '%s'", name); + return(NULL); + } + name = cp; + err = 0; for (i = 0, mp = NULL; (module_formats[i] != NULL) && (mp == NULL); i++) { if ((err = (module_formats[i]->l_load)(name, loadaddr, &mp)) != 0) { @@ -422,7 +431,7 @@ mod_findmetadata(struct loaded_module *mp, int type) } /* - * Attempt to locate a kernel module file for the module (name). + * Attempt to find the file (name) on the module searchpath. * If (name) is qualified in any way, we simply check it and * return it or NULL. If it is not qualified, then we attempt * to construct a path using entries in the environment variable @@ -432,10 +441,10 @@ mod_findmetadata(struct loaded_module *mp, int type) * it internally. */ static char * -mod_searchmodule(char *name) +mod_searchfile(char *name) { static char *result = NULL; - static char *defpath = "/boot", *path; + char *path; char *cp, *sp; struct stat sb; @@ -458,7 +467,7 @@ mod_searchmodule(char *name) * Get the module path */ if ((cp = getenv("module_path")) == NULL) - cp = defpath; + cp = default_searchpath; sp = path = strdup(cp); /* @@ -467,9 +476,14 @@ mod_searchmodule(char *name) if (result != NULL) free(result); while((cp = strsep(&path, ";")) != NULL) { - result = malloc(strlen(cp) + strlen(name) + 2); - sprintf(result, "%s/%s", cp, name); - if (stat(result, &sb) == 0) + result = malloc(strlen(cp) + strlen(name) + 5); + strcpy(result, cp); + if (cp[strlen(cp) - 1] != '/') + strcat(result, "/"); + strcat(result, name); +/* printf("search '%s'\n", result); */ + if ((stat(result, &sb) == 0) && + S_ISREG(sb.st_mode)) break; free(result); result = NULL; @@ -478,6 +492,28 @@ mod_searchmodule(char *name) return(result); } +/* + * Attempt to locate the file containing the module (name) + */ +static char * +mod_searchmodule(char *name) +{ + char *tn, *result; + + /* Look for (name).ko */ + tn = malloc(strlen(name) + 3); + strcpy(tn, name); + strcat(tn, ".ko"); + result = mod_searchfile(tn); + free(tn); + /* Look for just (name) (useful for finding kernels) */ + if (result == NULL) + result = mod_searchfile(name); + + return(result); +} + + /* * Throw a module away */ @@ -486,20 +522,38 @@ mod_discard(struct loaded_module *mp) { struct module_metadata *md; - while (mp->m_metadata != NULL) { - md = mp->m_metadata; - mp->m_metadata = mp->m_metadata->md_next; - free(md); - } - if (mp->m_name != NULL) - free(mp->m_name); - if (mp->m_type != NULL) - free(mp->m_type); - if (mp->m_args != NULL) - free(mp->m_args); - free(mp); + if (mp != NULL) { + while (mp->m_metadata != NULL) { + md = mp->m_metadata; + mp->m_metadata = mp->m_metadata->md_next; + free(md); + } + if (mp->m_name != NULL) + free(mp->m_name); + if (mp->m_type != NULL) + free(mp->m_type); + if (mp->m_args != NULL) + free(mp->m_args); + free(mp); + } } +/* + * Allocate a new module; must be used instead of malloc() + * to ensure safe initialisation. + */ +struct loaded_module * +mod_allocmodule(void) +{ + struct loaded_module *mp; + + if ((mp = malloc(sizeof(struct loaded_module))) != NULL) { + bzero(mp, sizeof(struct loaded_module)); + } + return(mp); +} + + /* * Add a module to the chain */ diff --git a/sys/boot/common/pnp.c b/sys/boot/common/pnp.c index d0b606108d50..84f3825ad512 100644 --- a/sys/boot/common/pnp.c +++ b/sys/boot/common/pnp.c @@ -10,81 +10,97 @@ */ #include +#include #include static struct pnpinfo *pnp_devices = NULL; -static void pnp_discard(void); +static void pnp_discard(struct pnpinfo **list); +static int pnp_readconf(char *path); +static int pnp_scankernel(void); /* * Perform complete enumeration sweep, and load required module(s) if possible. */ +COMMAND_SET(pnpscan, "pnpscan", "scan for PnP devices", pnp_scan); + int -pnp_autoload(void) +pnp_scan(int argc, char *argv[]) { - int hdlr, idx; + int hdlr; /* forget anything we think we knew */ - pnp_discard(); + pnp_discard(&pnp_devices); /* iterate over all of the handlers */ - for (hdlr = 0; pnphandlers[hdlr]->pp_name != NULL; i++) { + for (hdlr = 0; pnphandlers[hdlr] != NULL; hdlr++) { printf("Probing bus '%s'...\n", pnphandlers[hdlr]->pp_name); - idx = 0; - while ((pi = pnphandlers[hdlr]->pp_enumerate(idx++)) != NULL) { - printf(" %s\n", pi->pi_ident); - pi->pi_handler = hdlr; - pi->pi_next = pnp_devices; - pnp_devices = pi; - } - } - /* find anything? */ - if (pnp_devices != NULL) { - /* XXX hardcoded paths! should use loaddev? */ - pnp_readconf("/boot/pnpdata.local"); - pnp_readconf("/boot/pnpdata"); - - pnp_reload(); + pnphandlers[hdlr]->pp_enumerate(&pnp_devices); } + return(CMD_OK); } /* * Try to load outstanding modules (eg. after disk change) */ int -pnp_reload(void) +pnp_reload(char *fname) { struct pnpinfo *pi; char *modfname; - /* try to load any modules that have been nominated */ - for (pi = pnp_devices; pi != NULL; pi = pi->pi_next) { - /* Already loaded? */ - if ((pi->pi_module != NULL) && (mod_findmodule(pi->pi_module, NULL) == NULL)) { - modfname = malloc(strlen(pi->pi_module + 3)); - sprintf(modfname, "%s.ko", pi->pi_module); /* XXX implicit knowledge of KLD module filenames */ - if (mod_load(pi->pi_module, pi->pi_argc, pi->pi_argv)) - printf("Could not load module '%s' for device '%s'\n", modfname, pi->pi_ident); - free(modfname); + /* find anything? */ + if (pnp_devices != NULL) { + + /* check for kernel, assign modules handled by static drivers there */ + if (pnp_scankernel()) { + command_errmsg = "cannot load drivers until kernel loaded"; + return(CMD_ERROR); + } + if (fname == NULL) { + /* default paths */ + pnp_readconf("/boot/pnpdata.local"); + pnp_readconf("/boot/pnpdata"); + } else { + if (pnp_readconf("fname")) { + sprintf(command_errbuf, "can't read PnP information from '%s'", fname); + return(CMD_ERROR); + } + } + + /* try to load any modules that have been nominated */ + for (pi = pnp_devices; pi != NULL; pi = pi->pi_next) { + /* Already loaded? */ + if ((pi->pi_module != NULL) && (mod_findmodule(pi->pi_module, NULL) == NULL)) { + modfname = malloc(strlen(pi->pi_module + 3)); + sprintf(modfname, "%s.ko", pi->pi_module); /* XXX implicit knowledge of KLD module filenames */ + if (mod_load(pi->pi_module, pi->pi_argc, pi->pi_argv)) + printf("Could not load module '%s' for device '%s'\n", modfname, pi->pi_ident->id_ident); + free(modfname); + } } } + return(CMD_OK); } - /* - * Throw away anything we think we know about PnP devices + * Throw away anything we think we know about PnP devices on (list) */ static void -pnp_discard(void) +pnp_discard(struct pnpinfo **list) { struct pnpinfo *pi; + struct pnpident *id; - while (pnp_devices != NULL) { - pi = pnp_devices; - pnp_devices = pnp_devices->pi_next; - if (pi->pi_ident) - free(pi->pi_ident); + while (*list != NULL) { + pi = *list; + *list = (*list)->pi_next; + while (pi->pi_ident) { + id = pi->pi_ident; + pi->pi_ident = pi->pi_ident->id_next; + free(id); + } if (pi->pi_module) free(pi->pi_module); if (pi->pi_argv) @@ -114,10 +130,11 @@ pnp_discard(void) * ignored (but should be used), and the 'args' field must come * last. */ -static void +static int pnp_readconf(char *path) { struct pnpinfo *pi; + struct pnpident *id; int fd, line; char lbuf[128], *currbus, *ident, *revision, *module, *args; char *cp, *ep, *tp, c; @@ -155,7 +172,7 @@ pnp_readconf(char *path) continue; /* mapping */ - for (ident = module = args = NULL; *cp != 0;) { + for (ident = module = args = revision = NULL; *cp != 0;) { /* discard leading whitespace */ if (isspace(*cp)) { @@ -164,12 +181,12 @@ pnp_readconf(char *path) } /* scan for terminator, separator */ - for (ep = cp; (*ep != 0) && (*ep != '=') && !isspace(ep); ep++) + for (ep = cp; (*ep != 0) && (*ep != '=') && !isspace(*ep); ep++) ; if (*ep == '=') { *ep = 0; - for (tp = ep + 1; (*tp != 0) && !isspace(tp); tp++) + for (tp = ep + 1; (*tp != 0) && !isspace(*tp); tp++) ; c = *tp; *tp = 0; @@ -200,22 +217,64 @@ pnp_readconf(char *path) } /* - * Loop looking for module/bus that might match this + * Loop looking for module/bus that might match this, but aren't already + * assigned. * XXX no revision parse/test here yet. */ - for (pi = pnp_modules; pi != NULL; pi = pi->pi_next) { - if (!strcmp(pnphandlers[pi->pi_handler]->pp_name, currbus) && - !strcmp(pi->pi_indent, ident)) { - if (args != NULL) - if (parse(&pi->pi_argc, &pi->pi_argv, args)) { - printf("%s line %d: bad arguments\n", path, line); + for (pi = pnp_devices; pi != NULL; pi = pi->pi_next) { + + /* no driver assigned, bus matches OK */ + if ((pi->pi_module == NULL) && + !strcmp(pi->pi_handler->pp_name, currbus)) { + + /* scan idents, take first match */ + for (id = pi->pi_ident; id != NULL; id = id->id_next) + if (!strcmp(id->id_ident, ident)) break; - } - pi->pi_module = strdup(module); + + /* find a match? */ + if (id != NULL) { + if (args != NULL) + if (parse(&pi->pi_argc, &pi->pi_argv, args)) { + printf("%s line %d: bad arguments\n", path, line); + continue; + } + pi->pi_module = strdup(module); + printf("use module '%s' for %s:%s\n", module, pi->pi_handler->pp_name, id->id_ident); + } } } } close(fd); } + return(CMD_OK); +} + +static int +pnp_scankernel(void) +{ + return(CMD_OK); +} + +/* + * Add a unique identifier to (pi) + */ +void +pnp_addident(struct pnpinfo *pi, char *ident) +{ + struct pnpident *id, **idp; + + if (pi->pi_ident == NULL) { + idp = &(pi->pi_ident); + } else { + for (id = pi->pi_ident; id->id_next != NULL; id = id->id_next) + if (!strcmp(id->id_ident, ident)) + return; /* already have this one */ + ; + idp = &(id->id_next); + } + *idp = malloc(sizeof(struct pnpident)); + (*idp)->id_next = NULL; + (*idp)->id_ident = strdup(ident); } diff --git a/sys/boot/i386/btx/btx/Makefile b/sys/boot/i386/btx/btx/Makefile index bd0cb6f5a69c..9897217b5a61 100644 --- a/sys/boot/i386/btx/btx/Makefile +++ b/sys/boot/i386/btx/btx/Makefile @@ -1,4 +1,4 @@ -# $Id:$ +# $Id: Makefile,v 1.1.1.1 1998/09/12 04:29:23 rnordier Exp $ M4?= m4 @@ -20,3 +20,7 @@ btx.o: btx.m4 btx.s clean: rm -f btx btx.out btx.o + +depend: + +install: diff --git a/sys/boot/i386/btx/btxldr/Makefile b/sys/boot/i386/btx/btxldr/Makefile index 97c8e7f7ea79..c7fcecf07aec 100644 --- a/sys/boot/i386/btx/btxldr/Makefile +++ b/sys/boot/i386/btx/btxldr/Makefile @@ -1,4 +1,4 @@ -# $Id:$ +# $Id: Makefile,v 1.1 1998/09/12 06:30:26 rnordier Exp $ ORG=0x100000 @@ -18,3 +18,8 @@ btxldr.o: btxldr.s clean: rm -f btxldr btxldr.out btxldr.o + +depend: + +install: + diff --git a/sys/boot/i386/libi386/aout_freebsd.c b/sys/boot/i386/libi386/aout_freebsd.c index be4cea6a943d..7d570d34690e 100644 --- a/sys/boot/i386/libi386/aout_freebsd.c +++ b/sys/boot/i386/libi386/aout_freebsd.c @@ -23,13 +23,14 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: aout_freebsd.c,v 1.1.1.1 1998/08/21 03:17:41 msmith Exp $ + * $Id: aout_freebsd.c,v 1.2 1998/08/31 21:10:43 msmith Exp $ */ #include #include #include #include +#include #include #include #include @@ -80,14 +81,6 @@ aout_exec(struct loaded_module *mp) } free(currdev); - /* Device data is kept in the kernel argv array */ - argv[0] = bi_getboothowto(mp->m_args); - argv[1] = bootdevnr; - argv[2] = 0; - argv[3] = 0; - argv[4] = 0; - argv[5] = (u_int32_t)vtophys(&bi); - /* legacy bootinfo structure */ bi.bi_version = BOOTINFO_VERSION; bi.bi_kernelname = 0; /* XXX char * -> kernel name */ @@ -102,6 +95,14 @@ aout_exec(struct loaded_module *mp) bi.bi_symtab = mp->m_addr + ehdr->a_text + ehdr->a_data + ehdr->a_bss; bi.bi_esymtab = bi.bi_symtab + sizeof(ehdr->a_syms) + ehdr->a_syms; + /* Device data is kept in the kernel argv array */ + argv[0] = bi_getboothowto(mp->m_args); /* boothowto */ + argv[1] = bootdevnr; /* bootdev */ + argv[2] = 0; /* old cyloffset */ + argv[3] = 0; /* old esym */ + argv[4] = 0; /* "new" bootinfo magic */ + argv[5] = (u_int32_t)vtophys(&bi); + /* find the last module in the chain */ for (xp = mp; xp->m_next != NULL; xp = xp->m_next) ; @@ -112,7 +113,8 @@ aout_exec(struct loaded_module *mp) pad = PAGE_SIZE - pad; addr += pad; } - /* copy our environment XXX save addr here as env pointer, store in bootinfo? */ + /* copy our environment */ + bi.bi_envp = addr; addr = bi_copyenv(addr); /* pad to a page boundary */ @@ -121,9 +123,12 @@ aout_exec(struct loaded_module *mp) pad = PAGE_SIZE - pad; addr += pad; } - /* copy module list and metadata XXX save addr here as env pointer, store in bootinfo? */ - bi_copymodules(addr); - + /* copy module list and metadata */ + bi.bi_modulep = addr; + addr = bi_copymodules(addr); + + /* all done copying stuff in, save end of loaded object space */ + bi.bi_kernend = addr; entry = ehdr->a_entry & 0xffffff; #ifdef DEBUG diff --git a/sys/boot/i386/libi386/bootinfo.c b/sys/boot/i386/libi386/bootinfo.c index 041ccb81f6f8..02d217bc149c 100644 --- a/sys/boot/i386/libi386/bootinfo.c +++ b/sys/boot/i386/libi386/bootinfo.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bootinfo.c,v 1.1.1.1 1998/08/21 03:17:41 msmith Exp $ + * $Id: bootinfo.c,v 1.2 1998/09/03 02:10:09 msmith Exp $ */ #include @@ -57,6 +57,7 @@ bi_getboothowto(char *kargs) int active; int i; + /* Parse kargs */ howto = 0; if (kargs != NULL) { cp = kargs; @@ -94,9 +95,11 @@ bi_getboothowto(char *kargs) active = 0; break; } + active = 0; + cp++; } - cp++; } + /* get equivalents from the environment */ for (i = 0; howto_names[i].ev != NULL; i++) if (getenv(howto_names[i].ev) != NULL) howto |= howto_names[i].mask; @@ -137,7 +140,7 @@ bi_copyenv(vm_offset_t addr) * used as a directory for loaded modules. * * Module data is presented in a self-describing format. Each datum - * is preceeded by a 16-bit identifier and a 16-bit size field. + * is preceeded by a 32-bit identifier and a 32-bit size field. * * Currently, the following data are saved: * @@ -177,6 +180,14 @@ bi_copyenv(vm_offset_t addr) a += mm->md_size; \ } +#define MOD_END(a) { \ + u_int32_t ident = 0; \ + vpbcopy(&ident, a, sizeof(ident)); \ + a += sizeof(ident); \ + vpbcopy(&ident, a, sizeof(ident)); \ + a += sizeof(ident); \ +} + vm_offset_t bi_copymodules(vm_offset_t addr) { @@ -186,7 +197,7 @@ bi_copymodules(vm_offset_t addr) /* start with the first module on the list, should be the kernel */ for (mp = mod_findmodule(NULL, NULL); mp != NULL; mp = mp->m_next) { - MOD_NAME(addr, mp->m_name); + MOD_NAME(addr, mp->m_name); /* this field must come first */ MOD_TYPE(addr, mp->m_type); MOD_ADDR(addr, mp->m_addr); MOD_SIZE(addr, mp->m_size); @@ -194,5 +205,6 @@ bi_copymodules(vm_offset_t addr) if (!(md->md_type & MODINFOMD_NOCOPY)) MOD_METADATA(addr, md); } + MOD_END(addr); return(addr); } diff --git a/sys/boot/i386/libi386/bootinfo32.c b/sys/boot/i386/libi386/bootinfo32.c index 041ccb81f6f8..02d217bc149c 100644 --- a/sys/boot/i386/libi386/bootinfo32.c +++ b/sys/boot/i386/libi386/bootinfo32.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bootinfo.c,v 1.1.1.1 1998/08/21 03:17:41 msmith Exp $ + * $Id: bootinfo.c,v 1.2 1998/09/03 02:10:09 msmith Exp $ */ #include @@ -57,6 +57,7 @@ bi_getboothowto(char *kargs) int active; int i; + /* Parse kargs */ howto = 0; if (kargs != NULL) { cp = kargs; @@ -94,9 +95,11 @@ bi_getboothowto(char *kargs) active = 0; break; } + active = 0; + cp++; } - cp++; } + /* get equivalents from the environment */ for (i = 0; howto_names[i].ev != NULL; i++) if (getenv(howto_names[i].ev) != NULL) howto |= howto_names[i].mask; @@ -137,7 +140,7 @@ bi_copyenv(vm_offset_t addr) * used as a directory for loaded modules. * * Module data is presented in a self-describing format. Each datum - * is preceeded by a 16-bit identifier and a 16-bit size field. + * is preceeded by a 32-bit identifier and a 32-bit size field. * * Currently, the following data are saved: * @@ -177,6 +180,14 @@ bi_copyenv(vm_offset_t addr) a += mm->md_size; \ } +#define MOD_END(a) { \ + u_int32_t ident = 0; \ + vpbcopy(&ident, a, sizeof(ident)); \ + a += sizeof(ident); \ + vpbcopy(&ident, a, sizeof(ident)); \ + a += sizeof(ident); \ +} + vm_offset_t bi_copymodules(vm_offset_t addr) { @@ -186,7 +197,7 @@ bi_copymodules(vm_offset_t addr) /* start with the first module on the list, should be the kernel */ for (mp = mod_findmodule(NULL, NULL); mp != NULL; mp = mp->m_next) { - MOD_NAME(addr, mp->m_name); + MOD_NAME(addr, mp->m_name); /* this field must come first */ MOD_TYPE(addr, mp->m_type); MOD_ADDR(addr, mp->m_addr); MOD_SIZE(addr, mp->m_size); @@ -194,5 +205,6 @@ bi_copymodules(vm_offset_t addr) if (!(md->md_type & MODINFOMD_NOCOPY)) MOD_METADATA(addr, md); } + MOD_END(addr); return(addr); } diff --git a/sys/boot/i386/libi386/bootinfo64.c b/sys/boot/i386/libi386/bootinfo64.c index 041ccb81f6f8..02d217bc149c 100644 --- a/sys/boot/i386/libi386/bootinfo64.c +++ b/sys/boot/i386/libi386/bootinfo64.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bootinfo.c,v 1.1.1.1 1998/08/21 03:17:41 msmith Exp $ + * $Id: bootinfo.c,v 1.2 1998/09/03 02:10:09 msmith Exp $ */ #include @@ -57,6 +57,7 @@ bi_getboothowto(char *kargs) int active; int i; + /* Parse kargs */ howto = 0; if (kargs != NULL) { cp = kargs; @@ -94,9 +95,11 @@ bi_getboothowto(char *kargs) active = 0; break; } + active = 0; + cp++; } - cp++; } + /* get equivalents from the environment */ for (i = 0; howto_names[i].ev != NULL; i++) if (getenv(howto_names[i].ev) != NULL) howto |= howto_names[i].mask; @@ -137,7 +140,7 @@ bi_copyenv(vm_offset_t addr) * used as a directory for loaded modules. * * Module data is presented in a self-describing format. Each datum - * is preceeded by a 16-bit identifier and a 16-bit size field. + * is preceeded by a 32-bit identifier and a 32-bit size field. * * Currently, the following data are saved: * @@ -177,6 +180,14 @@ bi_copyenv(vm_offset_t addr) a += mm->md_size; \ } +#define MOD_END(a) { \ + u_int32_t ident = 0; \ + vpbcopy(&ident, a, sizeof(ident)); \ + a += sizeof(ident); \ + vpbcopy(&ident, a, sizeof(ident)); \ + a += sizeof(ident); \ +} + vm_offset_t bi_copymodules(vm_offset_t addr) { @@ -186,7 +197,7 @@ bi_copymodules(vm_offset_t addr) /* start with the first module on the list, should be the kernel */ for (mp = mod_findmodule(NULL, NULL); mp != NULL; mp = mp->m_next) { - MOD_NAME(addr, mp->m_name); + MOD_NAME(addr, mp->m_name); /* this field must come first */ MOD_TYPE(addr, mp->m_type); MOD_ADDR(addr, mp->m_addr); MOD_SIZE(addr, mp->m_size); @@ -194,5 +205,6 @@ bi_copymodules(vm_offset_t addr) if (!(md->md_type & MODINFOMD_NOCOPY)) MOD_METADATA(addr, md); } + MOD_END(addr); return(addr); } diff --git a/sys/boot/i386/libi386/crt/bootsect/bbinfo.h b/sys/boot/i386/libi386/crt/bootsect/bbinfo.h index f777acf647b6..eb313aef6439 100644 --- a/sys/boot/i386/libi386/crt/bootsect/bbinfo.h +++ b/sys/boot/i386/libi386/crt/bootsect/bbinfo.h @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: bbinfo.h,v 1.1.1.1 1998/08/21 03:17:41 msmith Exp $ * From: $NetBSD: bbinfo.h,v 1.3 1997/11/07 16:59:41 drochner Exp $ */ @@ -57,7 +57,7 @@ struct fraglist { /* only used by bootsect code (not by installboot) */ #ifndef MAXFLENTRIES -#define MAXFLENTRIES 10 +#define MAXFLENTRIES 20 #endif #ifndef PRIM_LOADSZ #define PRIM_LOADSZ 15 diff --git a/sys/boot/i386/libi386/i386_copy.c b/sys/boot/i386/libi386/i386_copy.c index 8f614204681c..53e1c798c3dd 100644 --- a/sys/boot/i386/libi386/i386_copy.c +++ b/sys/boot/i386/libi386/i386_copy.c @@ -46,8 +46,6 @@ i386_readin(int fd, vm_offset_t dest, size_t len) vpbcopy(buf, dest, chunk); } free(buf); - if (resid != 0) - printf("i386_readin: %d bytes short\n", resid); return(len - resid); } diff --git a/sys/boot/i386/libi386/libi386.h b/sys/boot/i386/libi386/libi386.h index abecb349dfdc..02168fc7fb8b 100644 --- a/sys/boot/i386/libi386/libi386.h +++ b/sys/boot/i386/libi386/libi386.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: libi386.h,v 1.2 1998/08/31 21:10:43 msmith Exp $ + * $Id: libi386.h,v 1.3 1998/09/03 02:10:09 msmith Exp $ */ @@ -75,7 +75,6 @@ extern int i386_readin(int fd, vm_offset_t dest, size_t len); extern void startprog(vm_offset_t entry, int argc, u_int32_t *argv, vm_offset_t stack); -extern void delay(int delay); extern int getbasemem(void); extern int getextmem(void); diff --git a/sys/boot/i386/loader/Makefile b/sys/boot/i386/loader/Makefile index 614656ea5ee3..56c9f536ed31 100644 --- a/sys/boot/i386/loader/Makefile +++ b/sys/boot/i386/loader/Makefile @@ -1,4 +1,4 @@ -# $Id$ +# $Id: Makefile,v 1.1.1.1 1998/08/21 03:17:41 msmith Exp $ # from $NetBSD: Makefile,v 1.12 1998/02/19 14:18:36 drochner Exp $ BASE= loader @@ -6,6 +6,10 @@ PROG= ${BASE}.sym NOMAN= NEWVERSWHAT= "bootstrap loader" +# Enable PnP and ISA-PnP code. +#HAVE_PNP= yes +#HAVE_ISABUS= yes + # architecture-specific loader code SRCS+= main.c conf.c diff --git a/sys/boot/i386/loader/conf.c b/sys/boot/i386/loader/conf.c index e172c7f91f3f..9fc219fab4f8 100644 --- a/sys/boot/i386/loader/conf.c +++ b/sys/boot/i386/loader/conf.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id$ + * $Id: conf.c,v 1.1.1.1 1998/08/21 03:17:41 msmith Exp $ */ #include @@ -83,3 +83,12 @@ struct console *consoles[] = { &comconsole, NULL }; + +extern struct pnphandler isapnphandler; +/* extern struct pnphandler pcipnphandler;*/ + +struct pnphandler *pnphandlers[] = { +/* &isapnphandler, */ +/* &pcipnphandler, */ + NULL +}; diff --git a/sys/boot/i386/loader/main.c b/sys/boot/i386/loader/main.c index ee7d5752498f..53f4efeae0ee 100644 --- a/sys/boot/i386/loader/main.c +++ b/sys/boot/i386/loader/main.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: main.c,v 1.2 1998/08/31 21:10:43 msmith Exp $ + * $Id: main.c,v 1.3 1998/09/03 02:10:09 msmith Exp $ */ /* @@ -54,7 +54,7 @@ main(void) { struct i386_devdesc currdev; int i; - + /* * Initialise the heap as early as possible. Once this is done, alloc() is usable. * The stack is buried inside us, so this is safe