diff options
Diffstat (limited to 'release/sysinstall')
-rw-r--r-- | release/sysinstall/Makefile | 6 | ||||
-rw-r--r-- | release/sysinstall/install.c | 69 | ||||
-rw-r--r-- | release/sysinstall/uc_eisa.c | 166 | ||||
-rw-r--r-- | release/sysinstall/uc_isa.c | 211 | ||||
-rw-r--r-- | release/sysinstall/uc_kmem.c | 87 | ||||
-rw-r--r-- | release/sysinstall/uc_list.c | 76 | ||||
-rw-r--r-- | release/sysinstall/uc_main.c | 334 | ||||
-rw-r--r-- | release/sysinstall/uc_main.h | 168 | ||||
-rw-r--r-- | release/sysinstall/uc_pci.c | 122 | ||||
-rw-r--r-- | release/sysinstall/uc_scsi.c | 477 |
10 files changed, 2 insertions, 1714 deletions
diff --git a/release/sysinstall/Makefile b/release/sysinstall/Makefile index d3fae3c..20da649 100644 --- a/release/sysinstall/Makefile +++ b/release/sysinstall/Makefile @@ -15,15 +15,11 @@ SRCS= anonFTP.c cdrom.c command.c config.c devices.c \ label.c lndir.c main.c makedevs.c media.c menus.c misc.c mouse.c \ msg.c network.c nfs.c options.c package.c register.c system.c \ tape.c tcpip.c termcap.c ufs.c user.c variable.c wizard.c \ - uc_eisa.c uc_isa.c uc_kmem.c uc_list.c uc_main.c uc_pci.c \ keymap.h CFLAGS+= -Wall -I${.CURDIR}/../../gnu/lib/libdialog -I${.OBJDIR} CFLAGS+= -I${.CURDIR}/../../sys -CFLAGS+= -DUC_PRIVATE -DKERN_NO_SYMBOLS # -DSAVE_USERCONFIG -DDO_SCSI -.if ${MACHINE_ARCH} == "i386" -CFLAGS+= -DSAVE_USERCONFIG -.endif +CFLAGS+= -DUC_PRIVATE -DKERN_NO_SYMBOLS DPADD= ${LIBDIALOG} ${LIBNCURSES} ${LIBMYTINFO} ${LIBUTIL} ${LIBDISK} ${LIBFTPIO} LDADD= -ldialog -lncurses -lmytinfo -lutil -ldisk -lftpio diff --git a/release/sysinstall/install.c b/release/sysinstall/install.c index 6f29746..6b12165 100644 --- a/release/sysinstall/install.c +++ b/release/sysinstall/install.c @@ -4,7 +4,7 @@ * This is probably the last program in the `sysinstall' line - the next * generation being essentially a complete rewrite. * - * $Id: install.c,v 1.220 1998/12/06 10:13:57 jkh Exp $ + * $Id: install.c,v 1.221 1999/01/08 00:14:21 jkh Exp $ * * Copyright (c) 1995 * Jordan Hubbard. All rights reserved. @@ -35,7 +35,6 @@ */ #include "sysinstall.h" -#include "uc_main.h" #include <ctype.h> #include <sys/disklabel.h> #include <sys/errno.h> @@ -54,9 +53,6 @@ static void create_termcap(void); static void fixit_common(void); -#ifdef SAVE_USERCONFIG -static void save_userconfig_to_kernel(char *); -#endif #define TERMCAP_FILE "/usr/share/misc/termcap" @@ -762,10 +758,6 @@ installFixupBin(dialogMenuItem *self) msgConfirm("Unable to copy /kernel into place!"); return DITEM_FAILURE; } -#ifdef SAVE_USERCONFIG - /* Snapshot any boot -c changes back to the new kernel */ - save_userconfig_to_kernel("/kernel"); -#endif } else { msgConfirm("Can't find a kernel image to link to on the root file system!\n" @@ -1120,62 +1112,3 @@ create_termcap(void) fclose(fp); } } - -#ifdef SAVE_USERCONFIG -static void -save_userconfig_to_kernel(char *kern) -{ - struct kernel *core, *boot; - struct list *c_isa, *b_isa, *c_dev, *b_dev; - int i, d; - - if ((core = uc_open("-incore")) == NULL) { - msgDebug("save_userconf: Can't read in-core information for kernel.\n"); - return; - } - - if ((boot = uc_open(kern)) == NULL) { - msgDebug("save_userconf: Can't read device information for kernel image %s\n", kern); - return; - } - - msgNotify("Saving any boot -c changes to new kernel..."); - c_isa = uc_getdev(core, "-isa"); - b_isa = uc_getdev(boot, "-isa"); - if (isDebug()) - msgDebug("save_userconf: got %d ISA device entries from core, %d from boot.\n", c_isa->ac, b_isa->ac); - for (d = 0; d < c_isa->ac; d++) { - if (isDebug()) - msgDebug("save_userconf: ISA device loop, c_isa->av[%d] = %s\n", d, c_isa->av[d]); - if (strcmp(c_isa->av[d], "npx0")) { /* special case npx0, which mucks with its id_irq member */ - c_dev = uc_getdev(core, c_isa->av[d]); - b_dev = uc_getdev(boot, b_isa->av[d]); - if (!c_dev || !b_dev) { - msgDebug("save_userconf: c_dev: %x b_dev: %x\n", c_dev, b_dev); - continue; - } - if (isDebug()) - msgDebug("save_userconf: ISA device %s: %d config parameters (core), %d (boot)\n", - c_isa->av[d], c_dev->ac, b_dev->ac); - for (i = 0; i < c_dev->ac; i++) { - if (isDebug()) - msgDebug("save_userconf: c_dev->av[%d] = %s, b_dev->av[%d] = %s\n", i, c_dev->av[i], i, b_dev->av[i]); - if (strcmp(c_dev->av[i], b_dev->av[i])) { - if (isDebug()) - msgDebug("save_userconf: %s (boot) -> %s (core)\n", - c_dev->av[i], b_dev->av[i]); - isa_setdev(boot, c_dev); - } - } - } - else { - if (isDebug()) - msgDebug("skipping npx0\n"); - } - } - if (isDebug()) - msgDebug("Closing kernels\n"); - uc_close(core, 0); - uc_close(boot, 1); -} -#endif diff --git a/release/sysinstall/uc_eisa.c b/release/sysinstall/uc_eisa.c deleted file mode 100644 index 12abd73..0000000 --- a/release/sysinstall/uc_eisa.c +++ /dev/null @@ -1,166 +0,0 @@ -/*************************************************** - * file: userconfig/uc_eisa.c - * - * Copyright (c) 1996 Eric L. Hernes (erich@rrnet.com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software withough specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id: uc_eisa.c,v 1.4 1997/02/22 14:12:26 peter Exp $ - */ - -#include <sys/types.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <nlist.h> -#include <i386/eisa/eisaconf.h> - -#include "uc_main.h" - -struct eisa_device_node { - struct eisa_device dev; - struct eisa_device_node *next; -}; - -/* module prototypes */ -static void eisa_fill_in(struct kernel *, struct uc_eisa *, struct eisa_device_node *); - -void -get_eisa_info(struct kernel *kp){ - int i, total; - u_int *ls; - struct eisa_driver *ed; - struct uc_eisa *ep, *epc; - char *name; - - if(kp->nl[EISA_SET].n_value || kp->nl[EISA_LIST].n_value) { - ep=epc=(struct uc_eisa *)malloc(sizeof(struct uc_eisa)); - if(!kp->incore) { - if(kp->nl[EISA_SET].n_value) { - u_int ndev; - ls=(u_int *)kv_to_u(kp, kp->nl[EISA_SET].n_value, sizeof(u_int)*10); /* XXX, size? */ - ndev=ls[0]; - for(i=1;i<(ndev+1);i++){ - ep=(struct uc_eisa *)realloc(ep, sizeof(struct uc_eisa)*i); - epc = ep+(i-1); - ed=(struct eisa_driver *)kv_to_u(kp, ls[i], sizeof(struct eisa_driver)); - name=(char *)kv_to_u(kp, (u_int)ed->name, 10); /* XXX, size? */ - asprintf(&epc->device, "%s", name); - asprintf(&epc->full_name, "?"); - } - ep=(struct uc_eisa *)realloc(ep, sizeof(struct uc_eisa)*i); - epc = ep+(i-1); - bzero(epc, sizeof(struct uc_eisa)); - kp->eisa_devp=ep; - } else { /* not incore and no symbol, we have no EISA devs... */ - kp->eisa_devp=(struct uc_eisa *)0; - } - } else { - /* if we're incore, we can get data from _eisa_dev_list, */ - /* which should be much more useful, but I'll need a machine */ - /* to test :( */ - if(kp->nl[EISA_LIST].n_value) { - u_int t; - struct eisa_device_node *edn; - - t=kv_dref_p(kp, kp->nl[EISA_LIST].n_value); - total=0; - while(t) { - edn=(struct eisa_device_node *) - kv_to_u(kp, t,sizeof(struct eisa_device_node)); - ep=(struct uc_eisa *)realloc(ep, sizeof(struct uc_eisa)*(total+1)); - epc=ep+total; - eisa_fill_in(kp, epc, edn); - t=(u_int)edn->next; - free(edn); - total++; - } - - ep=(struct uc_eisa *)realloc(ep, sizeof(struct uc_eisa)*(total+1)); - epc=ep+total; - bzero(epc, sizeof(struct uc_eisa)); - kp->eisa_devp=ep; - } else { - kp->eisa_devp=(struct uc_eisa *)0; - } - } - } else { - kp->eisa_devp=(struct uc_eisa *)0; - } -} - -struct list * -get_eisa_devlist(struct kernel *kp){ - struct list *dl; - struct uc_eisa *kdp; - - dl=list_new(); - - for(kdp=kp->eisa_devp; kdp->device; kdp++){ - list_append(dl, kdp->device); - } - return(dl); -} - - -struct list * -get_eisa_device(struct uc_eisa *ep){ - struct list *list; - list=list_new(); - - list_append(list, ep->device); - list_append(list, ep->full_name); - - return(list); -} - - -static void -eisa_fill_in(struct kernel *kp, struct uc_eisa *epc, struct eisa_device_node *edn){ - struct eisa_driver *edrv; - char *n; - - edrv=(struct eisa_driver *)kv_to_u(kp, (u_int)edn->dev.driver, - sizeof(struct eisa_driver)); - - n=(char *)kv_to_u(kp, (u_int)edrv->name, 20); - asprintf(&epc->device, "%s%lu", n, edn->dev.unit); - free(n); - - n=(char *)kv_to_u(kp, (u_int)edn->dev.full_name, 40); /*XXX*/ - asprintf(&epc->full_name, "%s", n); - free(n); - free(edrv); -} - -void -eisa_free(struct kernel *kp, int writeback){ - struct uc_eisa *ep; - - for(ep=kp->eisa_devp;ep->device;ep++){ - free(ep->device); - free(ep->full_name); - } - free(kp->eisa_devp); - kp->eisa_devp=0; -} - -/* end of userconfig/uc_eisa.c */ diff --git a/release/sysinstall/uc_isa.c b/release/sysinstall/uc_isa.c deleted file mode 100644 index 624fc08..0000000 --- a/release/sysinstall/uc_isa.c +++ /dev/null @@ -1,211 +0,0 @@ -/*************************************************** - * file: userconfig/uc_isa.c - * - * Copyright (c) 1996 Eric L. Hernes (erich@rrnet.com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software withough specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id: uc_isa.c,v 1.4 1997/02/22 14:12:27 peter Exp $ - */ - -#include <sys/types.h> -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <nlist.h> -#include <i386/isa/isa_device.h> - -#include "uc_main.h" - -void -get_isa_info(struct kernel *kp){ - int total, i, j; - struct uc_isa *idp; - struct isa_device *p, *isa_dp; - struct isa_driver *drv; - char *name; - - if(kp->nl[ISA_BIOTAB].n_value || kp->nl[ISA_TTYTAB].n_value || kp->nl[ISA_NETTAB].n_value || - kp->nl[ISA_CAMTAB].n_value || kp->nl[ISA_NULLTAB].n_value || - kp->nl[ISA_WDCTAB].n_value || kp->nl[ISA_FDCTAB].n_value) { - - idp = kp->isa_devp = (struct uc_isa *)malloc(sizeof(struct uc_isa)); - total=0; /* a running total of the number of isa devices */ - - for (i=0; i<6; i++) { /* the isa devices */ - if(kp->nl[i].n_value) { - p = isa_dp = (struct isa_device *)kv_to_u(kp, kp->nl[i].n_value, /* XXX size? */ - sizeof(struct isa_device)*30); - /* build the device list */ - /* `total' keeps a running total of all the devices found */ - for (j=0; p->id_id; j++, p++, total++) { - kp->isa_devp = (struct uc_isa *)realloc(kp->isa_devp, - sizeof(struct uc_isa)*(total+1)); - idp=kp->isa_devp+total; - - drv=(struct isa_driver *)kv_to_u(kp, (u_int)p->id_driver, sizeof(struct isa_driver)); - name=(char *)kv_to_u(kp, (u_int)drv->name, 64); - - if (i==ISA_WDCTAB || i==ISA_FDCTAB) { /* special case the disk devices */ - char n[10]; - strncpy(n, name, 10); - n[strlen(n)-1]=0; /* chop off the trailing 'c' */ - asprintf(&idp->device, "%s%d", n, j); - } else { - asprintf(&idp->device, "%s%d", name, p->id_unit); - } - idp->port=p->id_iobase; - idp->irq=p->id_irq; - idp->drq=p->id_drq; - idp->iomem=(u_int)p->id_maddr & 0xFFFFFF; /* kludge to get pa from kva */ - idp->iosize=p->id_msize; - idp->flags=p->id_flags; - idp->alive=p->id_alive; - idp->enabled=p->id_enabled; - idp->modified=0; - if(!kp->incore){ - idp->idp=p; - } else { - free(name); - free(drv); - } - } - if(kp->incore){ - free(isa_dp); - } - } - } - - idp=kp->isa_devp+total; - bzero(idp, sizeof(struct uc_isa)); - } else { - kp->isa_devp=0; - } -} - - -struct list * -get_isa_devlist(struct kernel *kp){ - struct list *dl; - struct uc_isa *kdp; - - dl=list_new(); - - for(kdp=kp->isa_devp; kdp->device; kdp++){ - list_append(dl, kdp->device); - } - return(dl); -} - - -struct list * -get_isa_device(struct uc_isa *ip){ - struct list *list; - char *tmp; - - list=list_new(); - - asprintf(&tmp, "%s", ip->device ); - list_append(list, tmp); - free(tmp); - - asprintf(&tmp, "0x%04x", ip->port ); - list_append(list, tmp); - free(tmp); - - asprintf(&tmp, "%d", ip->irq>0 ? ffs(ip->irq)-1 : ip->irq); - list_append(list, tmp); - free(tmp); - - asprintf(&tmp, "%d", ip->drq ); - list_append(list, tmp); - free(tmp); - - asprintf(&tmp, "0x%08x", ip->iomem ); - list_append(list, tmp); - free(tmp); - - asprintf(&tmp, "0x%x", ip->iosize ); - list_append(list, tmp); - free(tmp); - - asprintf(&tmp, "0x%x", ip->flags ); - list_append(list, tmp); - free(tmp); - - asprintf(&tmp, "%d", ip->alive ); - list_append(list, tmp); - free(tmp); - - asprintf(&tmp, "%d", ip->enabled ); - list_append(list, tmp); - free(tmp); - - return(list); -} - -int -isa_setdev(struct kernel *kp, struct list *list){ - int r=1, irq; - struct uc_isa *ip; - - if(kp->isa_devp) - for(ip=kp->isa_devp;ip->device;ip++){ - if(strcmp(list->av[0], ip->device)==0){ - ip->modified=1; - ip->port = strtol(list->av[1], (char **)NULL, 0); - irq=strtol(list->av[2], (char **)NULL, 0); - ip->irq= irq > 0 ? 1 << (irq) : irq; - ip->drq = strtol(list->av[3], (char **)NULL, 0); - ip->iomem = strtol(list->av[4], (char **)NULL, 0); - ip->iosize = strtol(list->av[5], (char **)NULL, 0); - ip->flags = strtol(list->av[6], (char **)NULL, 0); - ip->enabled = strtol(list->av[8], (char **)NULL, 0); - r=0; - break; - } - } - return(r); -} - -void -isa_free(struct kernel *kp, int writeback){ - struct uc_isa *ip; - for(ip=kp->isa_devp; ip->device; ip++){ - if((!kp->incore) && ip->modified && writeback) { - /* save any changes */ - ip->idp->id_iobase=ip->port; - ip->idp->id_irq = ip->irq; - ip->idp->id_drq = ip->drq; - ip->idp->id_maddr = (caddr_t)ip->iomem; - ip->idp->id_msize = ip->iosize; - ip->idp->id_flags = ip->flags; - ip->idp->id_enabled = ip->enabled; - } - /* and, be free... */ - free(ip->device); - } - /* and free the whole ball of wax */ - free(kp->isa_devp); - kp->isa_devp=0; -} - -/* end of userconfig/uc_isa.c */ diff --git a/release/sysinstall/uc_kmem.c b/release/sysinstall/uc_kmem.c deleted file mode 100644 index e0df872..0000000 --- a/release/sysinstall/uc_kmem.c +++ /dev/null @@ -1,87 +0,0 @@ -/*************************************************** - * file: userconfig/uc_kmem.c - * - * Copyright (c) 1996 Eric L. Hernes (erich@rrnet.com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software withough specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ - */ - -#include <sys/types.h> -#include <stdlib.h> -#include <unistd.h> -#include <a.out.h> - -#include <stdio.h> - -#include "uc_main.h" - -/* translate a kv pointer to user space */ -/* malloc()-ing if we aren't mmaped */ -u_int -kv_to_u(struct kernel *kp, u_int adr, u_int size){ - u_int tadr; - if(!kp->incore){ - struct exec *ep; - ep=(struct exec *)kp->core; - tadr=(u_int)((adr - ep->a_entry + (N_DATOFF(*ep) - ep->a_text))+kp->core); - } else { - caddr_t ptr; - ptr = malloc(size); - lseek(kp->fd, adr, SEEK_SET); - read(kp->fd, ptr, size); - tadr=(u_int)ptr; - } - return(tadr); -} - -/* dereference a pointer to kernel space */ -u_int -kv_dref_p(struct kernel *kp, u_int adr){ - u_int tadr; - if(!kp->incore){ - struct exec *ep; - ep=(struct exec *)kp->core; - tadr=*(u_int*)((adr - ep->a_entry + (N_DATOFF(*ep) - ep->a_text))+kp->core); - } else { - lseek(kp->fd, adr, SEEK_SET); - read(kp->fd, &tadr, sizeof(tadr)); - } - return(tadr); -} - -/* deref a pointer to kernel text */ -u_int -kv_dref_t(struct kernel *kp, u_int adr){ - u_int tadr; - if(!kp->incore){ - struct exec *ep; - ep=(struct exec *)kp->core; - tadr=*(u_int*)((adr - ep->a_entry) + N_TXTOFF(*ep) + (u_int)kp->core); - } else { - lseek(kp->fd, adr, SEEK_SET); - read(kp->fd, &tadr, sizeof(tadr)); - } - return(tadr); -} - -/* end of userconfig/uc_kmem.c */ diff --git a/release/sysinstall/uc_list.c b/release/sysinstall/uc_list.c deleted file mode 100644 index 6506c5e..0000000 --- a/release/sysinstall/uc_list.c +++ /dev/null @@ -1,76 +0,0 @@ -/*************************************************** - * file: userconfig/uc_isa.c - * - * Copyright (c) 1996 Eric L. Hernes (erich@rrnet.com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software withough specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ - */ - -#include <sys/types.h> -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <nlist.h> -#include "uc_main.h" - -struct list * -list_new(void){ - struct list *rv; - rv=(struct list *)malloc(sizeof(struct list)); - rv->ac=0; - rv->av=(char **)0; - return(rv); -} - -void -list_append(struct list *list , char *item){ - - if(list->ac==0) { - list->av=(char **)malloc(sizeof(char *)*(list->ac+1)); - } else { - list->av=(char **)realloc(list->av, sizeof(char *)*(list->ac+1)); - } - asprintf(list->av+list->ac, "%s", item); - list->ac++; -} - -void -list_print(struct list *list, char *separator){ - int i; - for(i=0; i<list->ac; i++) - printf("%s%s", list->av[i], separator); -} - -void -list_destroy(struct list *list){ - int i; - for(i=0;i<list->ac;i++){ - free(list->av[i]); - list->av[i]=0; - } - free(list->av); - list->av=0; - free(list); -} - -/* end of userconfig/uc_list.c */ diff --git a/release/sysinstall/uc_main.c b/release/sysinstall/uc_main.c deleted file mode 100644 index 27dd58c..0000000 --- a/release/sysinstall/uc_main.c +++ /dev/null @@ -1,334 +0,0 @@ -/*************************************************** - * file: userconfig/uc_main.c - * - * Copyright (c) 1996 Eric L. Hernes (erich@rrnet.com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software withough specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * library functions for userconfig library - * - * $Id: uc_main.c,v 1.24 1998/10/07 19:42:46 jkh Exp $ - */ - -#include <sys/types.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <paths.h> -#include <sys/mman.h> -#include <nlist.h> -#include <sys/stat.h> -#include <fcntl.h> - -#include "uc_main.h" -#include "sysinstall.h" - -static struct nlist _nl[] = { - {"_isa_devtab_bio"}, - {"_isa_devtab_tty"}, - {"_isa_devtab_net"}, - {"_isa_devtab_cam"}, - {"_isa_devtab_null"}, - {"_isa_biotab_wdc"}, - {"_isa_biotab_fdc"}, - {"_eisadriver_set"}, - {"_eisa_dev_list"}, - {"_pcidevice_set"}, - {"_device_list"}, -#ifdef DO_SCSI - {"_scbusses"}, - {"_scsi_cinit"}, - {"_scsi_dinit"}, - {"_scsi_tinit"}, -#endif - {""}, -}; - -struct kernel * -uc_open(char *name){ - int kd, flags, incore; - struct kernel *kern; - struct stat sb; - char kname[80]; - int size, i = 0; - struct nlist *nl = _nl; - - if (strcmp(name, "-incore") == 0) - incore = 1; - else - incore = 0; - - if (incore || (strcmp(name,"-bootfile") == 0)) - SAFE_STRCPY(kname, getbootfile()); - else - SAFE_STRCPY(kname, name); - - if (isDebug()) - msgDebug("uc_open: kernel name is %s, incore = %d\n", kname, incore); - kern = (struct kernel *)malloc(sizeof(struct kernel)); - -#ifdef KERN_NO_SYMBOLS - if (incore) { - FILE *fp; - - fp = fopen("/stand/symbols", "r"); - if (!fp) { - msgDebug("Couldn't open /stand/symbols file! Punting.\n"); - free(kern); - return NULL; - } - if (fscanf(fp, "%d\n", &size) != 1) { - msgDebug("Unable to get # of name list entries from symbol file.\n"); - free(kern); - return NULL; - } - else if (isDebug()) - msgDebug("uc_open: opened /stand/symbols file, reading %d entries.\n", size); - - - kern->nl = nl = (struct nlist *)malloc((size + 1) * sizeof(struct nlist)); - bzero(nl, (size + 1) * sizeof(struct nlist)); - for (i = 0; i < size; i++) { - char *cp, name[255]; - int c1; - unsigned int uc1; - short d1; - unsigned long v1; - - if (fgets(name, 255, fp) == NULL) { - msgDebug("Can't get name field for entry %d\n", i); - free(kern); - return NULL; - } - if ((cp = index(name, '\n')) != NULL) - *cp = '\0'; - nl[i].n_name = strdup(name); - if (fscanf(fp, "%u %d %hd %ld\n", &uc1, &c1, &d1, &v1) == 4) { - nl[i].n_type = (unsigned char)uc1; - nl[i].n_other = (char)c1; - nl[i].n_desc = d1; - nl[i].n_value = v1; - if (isDebug()) - msgDebug("uc_open: for entry %d, decoded: \"%s\", %u %d %hd %ld\n", i, nl[i].n_name, nl[i].n_type, nl[i].n_other, nl[i].n_desc, nl[i].n_value); - } - } - nl[i].n_name = ""; - fclose(fp); - i = 0; - } - else -#endif - i = nlist(kname, nl); - if (i == -1) { - msgDebug("uc_open: kernel %s does not contain symbols.\n", kname); - free(kern); - return NULL; - } -#ifdef KERN_NO_SYMBOLS - if (!incore) { -#else - { -#endif - kern->nl=(struct nlist *)malloc(sizeof(_nl)); - bcopy(_nl, kern->nl, sizeof(_nl)); - } - - if (incore) { - if (isDebug()) - msgDebug("uc_open: attempting to open /dev/kmem for incore.\n"); - if ((kd = open("/dev/kmem", O_RDONLY)) < 0) { - free(kern); - msgDebug("uc_open: Unable to open /dev/kmem.\n"); - return NULL; - } - kern->core = (caddr_t)NULL; - kern->incore = 1; - kern->size = 0; - } - else { - if (stat(kname, &sb) < 0) { - free(kern); - msgDebug("uc_open: Unable to stat %s.\n", kname); - return NULL; - } - kern->size = sb.st_size; - flags = sb.st_flags; - - if (chflags(kname, 0) < 0) { - free(kern); - msgDebug("uc_open: Unable to chflags %s.\n", kname); - return NULL; - } - - if (isDebug()) - msgDebug("uc_open: attempting to open %s\n", kname); - if ((kd = open(kname, O_RDWR, 0644)) < 0) { - free(kern); - msgDebug("uc_open: Unable to open %s.\n", kname); - return NULL; - } - - fchflags(kd, flags); - - if (isDebug()) - msgDebug("uc_open: attempting to mmap %d bytes\n", sb.st_size); - kern->core = mmap((caddr_t)0, sb.st_size, PROT_READ | PROT_WRITE, - MAP_SHARED, kd, 0); - kern->incore = 0; - if (kern->core == MAP_FAILED) { - free(kern); - msgDebug("uc_open: Unable to mmap from %s.\n", kname); - return NULL; - } - } - - kern->fd = kd; - get_isa_info(kern); - if (isDebug()) - msgDebug("uc_open: got isa information\n"); - - get_pci_info(kern); - if (isDebug()) - msgDebug("uc_open: got pci information\n"); - - get_eisa_info(kern); - if (isDebug()) - msgDebug("uc_open: got eisa information\n"); -#ifdef DO_SCSI - get_scsi_info(kern); - if (isDebug()) - msgDebug("uc_open: got scsi information\n"); -#else - kern->scsi_devp=(struct uc_scsi*)NULL; - kern->scsibus_devp=(struct uc_scsibus*)NULL; -#endif - return kern; -} - -int -uc_close(struct kernel *kern, int writeback) -{ - if (kern->isa_devp) - isa_free(kern, writeback); - - if (kern->eisa_devp) - eisa_free(kern, writeback); /* `writeback' isn't really useful here */ - - if (kern->pci_devp) - pci_free(kern, writeback); /* or here */ - -#ifdef DO_SCSI - if (kern->scsi_devp) - scsi_free(kern, writeback); -#endif - if (!kern->incore) - munmap(kern->core, kern->size); - - close(kern->fd); - free(kern->nl); - free(kern); - - return 0; -} - -struct list * -uc_getdev(struct kernel *kern, char *dev) -{ - struct list *list = (struct list *)0; - - if (*dev == '-') { /* asked for -isa, -eisa, -pci, -scsi, -all */ - if (strcmp(dev, "-all") == 0) { - list = list_new(); - if (kern->isa_devp) - list_append(list, "isa"); - - if (kern->eisa_devp) - list_append(list, "eisa"); - - if (kern->pci_devp) - list_append(list, "pci"); - -#ifdef DO_SCSI - if (kern->scsi_devp) - list_append(list, "scsi"); -#endif - - } - else if (strcmp(dev, "-isa") == 0) - list = get_isa_devlist(kern); - else if (strcmp(dev, "-eisa") == 0) - list = get_eisa_devlist(kern); - else if (strcmp(dev, "-pci") == 0) - list = get_pci_devlist(kern); -#ifdef DO_SCSI - else if (strcmp(dev, "-scsi") == 0) - list = get_scsi_devlist(kern); -#endif - } - else { - /* we gotta figure out which real device to report */ - struct uc_isa *ip; - struct uc_pci *pp; - struct uc_eisa *ep; - - if (kern->isa_devp) { - for (ip = kern->isa_devp; ip->device; ip++) { - if (strcmp(dev, ip->device) == 0) { - list = get_isa_device(ip); - goto end; - } - } - } - -#ifdef DO_SCSI - if (kern->scsi_devp) { - struct uc_scsi *sp; - - for (sp = kern->scsi_devp; sp->device; sp++) { - if (strcmp(dev, sp->device) == 0) { - list = get_scsi_device(sp); - goto end; - } - } - } -#endif - - if (kern->pci_devp) { - for(pp = kern->pci_devp; pp->device; pp++) { - if (strcmp(dev, pp->device) == 0) { - list = get_pci_device(pp); - goto end; - } - } - } - - if (kern->eisa_devp) { - for (ep = kern->eisa_devp; ep->device; ep++) { - if (strcmp(dev, ep->device) == 0) { - list = get_eisa_device(ep); - goto end; - } - } - } - } -end: - return(list); -} diff --git a/release/sysinstall/uc_main.h b/release/sysinstall/uc_main.h deleted file mode 100644 index 046a664..0000000 --- a/release/sysinstall/uc_main.h +++ /dev/null @@ -1,168 +0,0 @@ -/*************************************************** - * file: userconfig/uc_main.h - * - * Copyright (c) 1996 Eric L. Hernes (erich@rrnet.com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software withough specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id: uc_main.h,v 1.4 1997/02/22 14:12:32 peter Exp $ - */ - -#define ISA_BIOTAB 0 -#define ISA_TTYTAB 1 -#define ISA_NETTAB 2 -#define ISA_CAMTAB 3 -#define ISA_NULLTAB 4 -#define ISA_WDCTAB 5 -#define ISA_FDCTAB 6 -#define EISA_SET 7 -#define EISA_LIST 8 -#define PCI_SET 9 -#define SCSI_LIST 10 -#define SCSI_BUSSES 11 -#define SCSI_CINIT 12 -#define SCSI_DINIT 13 -#define SCSI_TINIT 14 -/* symbols + the null terminator */ -#define NSYMBOLS 16 - -struct kernel { - int fd; /* file descriptor for the kernel image, either a binary or /dev/kmem */ - caddr_t core; /* either the mmap()ed kernel image, or a scratch area */ - u_int size; /* size of the object at ->core */ - int incore; /* true if the kernel is running */ -#ifdef UC_PRIVATE - struct nlist *nl; /* the symbol table */ -#else - void *nl; -#endif - struct uc_isa *isa_devp; /* pointer to the isa devices (if any) */ - struct uc_eisa *eisa_devp; /* pointer to the eisa devices (if any) */ - struct uc_pci *pci_devp; /* pointer to the pci devices (if any) */ - struct uc_scsi *scsi_devp; /* pointer to the scsi devices (if any) */ - struct uc_scsibus *scsibus_devp; /* internal pointer to scsibus wirings */ -}; - -struct uc_isa { - char *device; - u_short port; - u_short irq; - short drq; - u_int iomem; - int iosize; - int flags; - int alive; - int enabled; -#ifdef UC_PRIVATE - struct isa_device *idp; -#else - void *idp; -#endif - int modified; -}; - -struct uc_pci { - char *device; -}; - -struct uc_eisa { - char *device; - char *full_name; -}; - -struct uc_scsibus { - int bus_no; - int unit; - char *driver; -#ifdef UC_PRIVATE - struct scsi_ctlr_config *config; -#else - void *config; -#endif -}; - -struct uc_scsi { - char *device; - char *adapter; - u_short target; - u_short lun; - char *desc; -#ifdef UC_PRIVATE - struct scsi_device_config *config; -#else - void *config; -#endif - int modified; -}; - -/* nearly everything useful returns a list */ - -struct list { - int ac; - char **av; -}; - -/* prototypes */ - -/* uc_main.c */ -/* these are really the only public ones */ -struct kernel *uc_open(char *name); -int uc_close(struct kernel *kern, int writeback); -struct list *uc_getdev(struct kernel *kern, char *dev); - -/* uc_isa.c */ -void get_isa_info(struct kernel *kp); -struct list *get_isa_devlist(struct kernel *kp); -struct list *get_isa_device(struct uc_isa *ip); -int isa_setdev(struct kernel *kp, struct list *list); -void isa_free(struct kernel *kp, int writeback); - -/* uc_eisa.c */ -void get_eisa_info(struct kernel *kp); -struct list *get_eisa_devlist(struct kernel *kp); -struct list *get_eisa_device(struct uc_eisa *ep); -void eisa_free(struct kernel *kp, int writeback); - -/* uc_pci.c */ -void get_pci_info(struct kernel *kp); -struct list *get_pci_devlist(struct kernel *kp); -struct list *get_pci_device(struct uc_pci *pp); -void pci_free(struct kernel *kp, int writeback); - -/* uc_scsi.c */ -void get_scsi_info(struct kernel *kp); -struct list *get_scsi_devlist(struct kernel *kp); -struct list *get_scsi_device(struct uc_scsi *sp); -int scsi_setdev(struct kernel *kp, struct list *list); -void scsi_free(struct kernel *kp, int writeback); - -/* uc_kmem.c */ -u_int kv_to_u(struct kernel *kp, u_int adr, u_int size); -u_int kv_dref_p(struct kernel *kp, u_int adr); -u_int kv_dref_t(struct kernel *kp, u_int adr); - -/* uc_list.c */ -struct list *list_new(void); -void list_append(struct list *list, char *item); -void list_print(struct list *list, char *separator); -void list_destroy(struct list *list); - -/* end of userconfig/uc_main.h */ diff --git a/release/sysinstall/uc_pci.c b/release/sysinstall/uc_pci.c deleted file mode 100644 index 0b21312..0000000 --- a/release/sysinstall/uc_pci.c +++ /dev/null @@ -1,122 +0,0 @@ -/*************************************************** - * file: userconfig/uc_pci.c - * - * Copyright (c) 1996 Eric L. Hernes (erich@rrnet.com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software withough specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ - */ - -#include <sys/types.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <nlist.h> -#include <pci/pcivar.h> - -#include "uc_main.h" - -void -get_pci_info(struct kernel *kp){ - int i, total; - u_int *ls, ndev; - struct pci_device *pd; - struct uc_pci *pp,*ppc; - char *name; - - if(kp->nl[PCI_SET].n_value){ - pp = ppc = (struct uc_pci *)malloc(sizeof(struct uc_pci)); - ls=(u_int *)kv_to_u(kp, kp->nl[PCI_SET].n_value, sizeof(u_int)*30); /* XXX, size? */ - ndev=ls[0]; - total=0; - for(i=1;i<(ndev+1);i++){ - pp=(struct uc_pci *)realloc(pp, sizeof(struct uc_pci)*(total+1)); - ppc = pp+(total); - pd=(struct pci_device *)kv_to_u(kp, ls[i], sizeof(struct pci_device)); - /* don't try to dereference a null pointer */ - name=pd->pd_name ? (char *)kv_to_u(kp, (u_int)pd->pd_name, 10) : - pd->pd_name; /* XXX, size? */ - if(kp->incore){ - int u, k; - /* incore, we can get unit numbers */ - - u=kv_dref_p(kp, (u_int)pd->pd_count); - for(k=0;k<u;k++,total++){ - pp=(struct uc_pci *)realloc(pp, sizeof(struct uc_pci)*(total+1)); - ppc = pp+(total); - asprintf(&ppc->device, "%s%d", name, k); - } - free(pd); - if(name) - free(name); - } else { - asprintf(&ppc->device, "%s?", name); - total++; - } - } - pp=(struct uc_pci *)realloc(pp, sizeof(struct uc_pci)*(total+1)); - ppc = pp+(total); - bzero(ppc, sizeof(struct uc_pci)); - kp->pci_devp=pp; - } else { - kp->pci_devp=(struct uc_pci *)0; - } -} - - -struct list * -get_pci_devlist(struct kernel *kp){ - struct list *dl; - struct uc_pci *kdp; - - dl=list_new(); - - for(kdp=kp->pci_devp; kdp->device; kdp++){ - list_append(dl, kdp->device); - } - return(dl); -} - - -struct list * -get_pci_device(struct uc_pci *pp){ - struct list *list; - list=list_new(); - - list_append(list, pp->device); - - return(list); -} - -void -pci_free(struct kernel *kp, int writeback){ - struct uc_pci *pp; - - for(pp=kp->pci_devp;pp->device;pp++){ - free(pp->device); - } - free(kp->pci_devp); - kp->pci_devp=0; - -} - -/* end of userconfig/uc_pci.c */ diff --git a/release/sysinstall/uc_scsi.c b/release/sysinstall/uc_scsi.c deleted file mode 100644 index 2227bb3..0000000 --- a/release/sysinstall/uc_scsi.c +++ /dev/null @@ -1,477 +0,0 @@ -/*************************************************** - * file: userconfig/uc_scsi.c - * - * Copyright (c) 1996 Eric L. Hernes (erich@rrnet.com) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software withough specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ - */ - -#include <sys/types.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <nlist.h> -#include <scsi/scsiconf.h> - -#include "uc_main.h" - -/* this stuff is hidden under an #ifdef KERNEL in scsiconf.h */ -#define SCCONF_UNSPEC 255 -#define SCCONF_ANY 254 - -struct scsi_ctlr_config { - int scbus; - char *driver; - int unit; - int bus; -}; - -struct scsi_device_config { - char *name; /* SCSI device name (sd, st, etc) */ - int unit; /* desired device unit */ - int cunit; /* Controller unit */ - int target; /* SCSI ID (target) */ - int lun; /* SCSI lun */ - int flags; /* Flags from config */ -}; - -/* module prototypes */ -static void get_sl_info(struct kernel *kp, struct uc_scsi *spc, - struct scsi_link *sl); - -void -get_scsi_info(struct kernel *kp){ - int i, j, k; - - if(kp->incore){ - if (kp->nl[SCSI_BUSSES].n_value) { - u_int *es, *sba; - struct scsibus_data *sbd; - int nsbd, nscsibus, total; - struct uc_scsi *sp, *spc; - struct uc_scsibus *sbp, *sbpc; - struct scsi_link *s_l; - u_int *slp; - char *temp; - struct scsi_device *sdev; - u_int t; - char name[10]; - - sp=(struct uc_scsi*)malloc(sizeof(struct uc_scsi)); - total=0; - sbp=(struct uc_scsibus*)malloc(sizeof(struct uc_scsibus)); - nscsibus=0; - - es=(u_int *)kv_to_u(kp, kv_dref_p(kp,kp->nl[SCSI_BUSSES].n_value), - sizeof(u_int)*2); - nsbd=es[0]; - sba=(u_int *)kv_to_u(kp, es[1], sizeof(u_int)*nsbd); - free(es); - - for(i=0;i<nsbd;i++){ - if(sba[i]){ - /* first grab the adapter info */ - sbd=(struct scsibus_data *)kv_to_u(kp, sba[i], - sizeof(struct scsibus_data)); - sbp=(struct uc_scsibus *)realloc(sbp, sizeof(struct uc_scsibus)* - (nscsibus+1)); - - sp=(struct uc_scsi*)realloc(sp, (sizeof(struct uc_scsi)*(total+1))); - spc=sp+total; - s_l=(struct scsi_link*)kv_to_u(kp, (u_int)sbd->adapter_link, - sizeof(struct scsi_link)); - get_sl_info(kp, spc, s_l); - free(s_l); - - sbpc=sbp+nscsibus; - sbpc->bus_no=nscsibus; - nscsibus++; - sscanf(spc->device, "%[a-z]%d", name, &sbpc->unit); - asprintf(&sbpc->driver, "%s", name); - - total++; - t=kv_dref_p(kp, (u_int)sbd->sc_link); - t=(u_int)sbd->sc_link; - for(j=0;j<8;j++) { - slp=(u_int *)kv_to_u(kp, t+(j*8*sizeof(u_int)), /* XXX */ - (sizeof(u_int)*sbd->maxlun)); - for(k=0;k<sbd->maxlun && slp[k]; k++){ - struct scsi_link *slt; - sp=(struct uc_scsi*)realloc(sp, - (sizeof(struct uc_scsi)*(total+1))); - spc=sp+total; - slt=(struct scsi_link*)kv_to_u(kp, slp[k], - sizeof(struct scsi_link)); - get_sl_info(kp, spc, slt); - free(slt); - spc->config=(struct scsi_device_config *)0; - total++; - } - free(slp); - } - free(sbd); - } - } - /* now stuff in the list of drivers configured in the system */ - t=kv_dref_p(kp, kp->nl[SCSI_LIST].n_value); - while(t) { - sdev=(struct scsi_device*)kv_to_u(kp, t, sizeof(struct scsi_device)); - sp=(struct uc_scsi*)realloc(sp, (sizeof(struct uc_scsi)*(total+1))); - spc=sp+total; - total++; - temp=(char *)kv_to_u(kp, (u_int)sdev->name, 10); - asprintf(&spc->device, "%s*", temp); - free(temp); - asprintf(&spc->adapter, "any"); - - spc->target=SCCONF_ANY; - spc->lun=SCCONF_ANY; - - temp=(char *)kv_to_u(kp, (u_int)sdev->desc, 20); - asprintf(&spc->desc, "%s", temp); - free(temp); - - spc->config=(struct scsi_device_config *)0; - - t=(u_int)sdev->next; - free(sdev); - } - /* slap on the terminators */ - sp=(struct uc_scsi*)realloc(sp, (sizeof(struct uc_scsi)*(total+1))); - spc=sp+total; - bzero(spc, sizeof(struct uc_scsi)); - - sbp=(struct uc_scsibus *)realloc(sbp, sizeof(struct uc_scsibus)* - (nscsibus+1)); - sbpc=sbp+nscsibus; - bzero(sbpc, sizeof(struct uc_scsibus)); - - kp->scsi_devp=sp; - kp->scsibus_devp=sbp; - } else { /* no symbol, and incore, no scsi */ - kp->scsi_devp=(struct uc_scsi *)0; - kp->scsibus_devp=(struct uc_scsibus *)0; - } - } else { /* on disk */ - - if (kp->nl[SCSI_CINIT].n_value || kp->nl[SCSI_DINIT].n_value || - kp->nl[SCSI_TINIT].n_value) { - int total=0; - struct uc_scsi *sp, *spc; - struct scsi_ctlr_config *sctl_c; - struct scsi_device_config *sdev_c; - struct scsi_device *sdev; - - struct uc_scsibus *uc_scbus, *uc_scbusc; - - u_int t, ctrl_total; - char *temp; - u_int initp; - - spc=sp=(struct uc_scsi*)malloc(sizeof(struct uc_scsi)); - total=0; - ctrl_total=0; - uc_scbus = NULL; /* Just prevent unused warning */ - - /* static kernel, we'll first get the wired controllers/devices */ - if((t=kp->nl[SCSI_CINIT].n_value)){ - /* get controller info*/ - sctl_c=(struct scsi_ctlr_config*)kv_to_u(kp, t, sizeof(struct scsi_ctlr_config)); - uc_scbus=(struct uc_scsibus*)malloc(sizeof(struct uc_scsibus)); - - while(sctl_c->driver){ - - /* remember the bus info, for later */ - uc_scbus=(struct uc_scsibus*)realloc(uc_scbus, sizeof(struct uc_scsibus)*(ctrl_total+1)); - uc_scbusc=uc_scbus+ctrl_total; - uc_scbusc->bus_no=sctl_c->scbus; - temp=(char *)kv_to_u(kp, (u_int)sctl_c->driver, 20); - uc_scbusc->driver=temp; - uc_scbusc->unit=sctl_c->unit; - uc_scbusc->config=sctl_c; - - sp=(struct uc_scsi*)realloc(sp,sizeof(struct uc_scsi)*(total+1)); - spc=sp+total; - asprintf(&spc->device, "%s%d", temp, sctl_c->unit); - asprintf(&spc->adapter, "%s%d", temp, sctl_c->unit); - spc->target=0; - spc->lun=0; - spc->modified=0; - asprintf(&spc->desc, "%s", temp); - total++; - ctrl_total++; - sctl_c++; - } - } - - if((t=kp->nl[SCSI_DINIT].n_value)){ - /* get wired device info */ - sdev_c=(struct scsi_device_config*)kv_to_u(kp, t, sizeof(struct scsi_device_config)); - while(sdev_c->name){ - sp=(struct uc_scsi*)realloc(sp, sizeof(struct uc_scsi)*(total+1)); - spc=sp+total; - temp=(char*)kv_to_u(kp, (u_int)sdev_c->name, 10); - asprintf(&spc->device, "%s%d", temp, sdev_c->unit); - /* figure out controller */ - if(sdev_c->cunit == SCCONF_ANY){ - asprintf(&spc->adapter, "any"); - } else { - if(ctrl_total){ - for(i=0;i<ctrl_total;i++){ - if(sdev_c->cunit==uc_scbus[i].bus_no){ - asprintf(&spc->adapter, "%s%d", - uc_scbus[i].driver, uc_scbus[i].unit); - break; - } - } - if(i==ctrl_total) { /* made it through the whole list */ - asprintf(&spc->adapter, "any?"); - } - } else { - asprintf(&spc->adapter, "any?"); - } - } - spc->target= sdev_c->target; - spc->lun= sdev_c->lun; - spc->desc=(char *)0; /* filled in later */ - spc->config=sdev_c; - spc->modified=0; - sdev_c++; - total++; - } - } - kp->scsibus_devp=uc_scbus; - - if((t=kp->nl[SCSI_TINIT].n_value)) { - /* WARNING: This is teetering on the brink of stupid. - - this ugly little hack only works because the - <scsi driver>init routines are macro-generated, - so the offset of the device pointers will be - the same (hopefully). - */ - - while((initp=kv_dref_p(kp,t))) { - u_int tadr; - u_int sl; - - t+=4; - tadr=kv_dref_t(kp, initp+4); /* offset in *.text* */ - sdev=(struct scsi_device*)kv_to_u(kp, tadr, sizeof(struct scsi_device)); - sp=(struct uc_scsi*)realloc(sp, (sizeof(struct uc_scsi)*(total+1))); - spc=sp+total; - total++; - temp=(char *)kv_to_u(kp, (u_int)sdev->name, 10); - asprintf(&spc->device, "%s*", temp); - - asprintf(&spc->adapter, "any"); - - spc->target=SCCONF_ANY; - spc->lun=SCCONF_ANY; - spc->modified=0; - temp=(char *)kv_to_u(kp, (u_int)sdev->desc, 20); - asprintf(&spc->desc, "%s", temp); - /* now try to fill in any device descriptions from above */ - sl=strlen(spc->device)-1; - for(i=0;i<(total-1);i++){ /* don't look at this device */ - struct uc_scsi *usp; - - usp=sp+i; - if(strncmp(usp->device, spc->device, sl)==0 && usp->desc==0) { - asprintf(&usp->desc, "%s", spc->desc); - } - } - } - if(total){ - sp=(struct uc_scsi*)realloc(sp, (sizeof(struct uc_scsi)*(total+1))); - spc=sp+total; - bzero(spc, sizeof(struct uc_scsi)); - kp->scsi_devp=sp; - } else { - free(sp); - kp->scsi_devp=(struct uc_scsi *)0; - } - } - } else { - kp->scsi_devp=(struct uc_scsi *)0; - } - } -} - -struct list * -get_scsi_devlist(struct kernel *kp){ - struct list *dl; - struct uc_scsi *kdp; - - dl=list_new(); - - for(kdp=kp->scsi_devp; kdp->device; kdp++){ - list_append(dl, kdp->device); - } - - return(dl); -} - -struct list * -get_scsi_device(struct uc_scsi *sp){ - struct list *list; - char *tmp; - - list=list_new(); - - list_append(list, sp->device); - list_append(list, sp->adapter); - - asprintf(&tmp, "%d", sp->target ); - list_append(list, tmp); - free(tmp); - - asprintf(&tmp, "%d", sp->lun ); - list_append(list, tmp); - free(tmp); - - list_append(list, sp->desc); - - return(list); -} - -/* given a scsi_link and a uc_scsi pointer, fill it in */ -static void -get_sl_info(struct kernel *kp, struct uc_scsi *spc, struct scsi_link *sl){ - - struct scsi_adapter *sadp; - struct scsi_device *sdev; - char *temp; - - sadp=(struct scsi_adapter*)kv_to_u(kp, (u_int)sl->adapter, - sizeof(struct scsi_adapter)); - - sdev=(struct scsi_device*)kv_to_u(kp, (u_int)sl->device, - sizeof(struct scsi_device)); - - temp=(char *)kv_to_u(kp, (u_int)sdev->name, 20); - asprintf(&spc->device, "%s%d", temp, sl->dev_unit); - free(temp); - temp=(char *)kv_to_u(kp, (u_int)sadp->name, 20); - asprintf(&spc->adapter, "%s%d", temp, sl->adapter_unit); - free(temp); - spc->target = sl->target; - spc->lun = sl->lun; - - temp=(char *)kv_to_u(kp, (u_int)sdev->desc, 30); - asprintf(&spc->desc, "%s", temp); - free(temp); - -} - -int -scsi_setdev(struct kernel *kp, struct list *list){ - int r=1, bus_valid=0; - struct uc_scsi *sp; - struct uc_scsibus *sbp; - char *t; - - if(kp->scsi_devp) - for(sp=kp->scsi_devp;sp->device;sp++){ - if(strcmp(list->av[0], sp->device)==0){ - for(sbp=kp->scsibus_devp;sbp->driver; sbp++){ - asprintf(&t, "%s%d", sbp->driver, sbp->unit); - if(strcmp(list->av[1], t)==0) { - bus_valid=1; - } - free(t); - } - if(bus_valid){ - sp->modified=1; - free(sp->adapter); - asprintf(&sp->adapter, "%s", list->av[1]); - sp->target = strtol(list->av[2], (char **)NULL, 0); - sp->lun = strtol(list->av[3], (char **)NULL, 0); - r=0; - goto done; - } else { - r=2; - } - } - } -done: - return(r); -} - -void -scsi_free(struct kernel *kp, int writeback){ - struct uc_scsi *sp; - struct uc_scsibus *sbp; - char *t; - int scbus, i; - - for(sp=kp->scsi_devp; sp->device; sp++){ - if((!kp->incore) && sp->modified && writeback) { - /* save info */ - - /* I'm not sure this is necessary */ -#if 0 - sscanf(sp->device, "%[a-z]%d", name, &unit); - sp->config->unit= unit; -#endif - - /* figger out the controller, which may have changed */ - scbus=-1; - for(sbp=kp->scsibus_devp, i=0;sbp->driver; sbp++,i++){ - asprintf(&t, "%s%d", sbp->driver, sbp->unit); - if(strcmp(sp->adapter, t)==0) { - scbus=i; - } - free(t); - } - - /* if we fell through, don't change anything */ - if(scbus!=-1){ - sp->config->cunit= scbus; - } - - sp->config->target= sp->target; - sp->config->lun= sp->lun; - /* sp->config->flags= ; XXX this should be here*/ - - } - free(sp->device); - free(sp->adapter); - free(sp->desc); - } - free(kp->scsi_devp); - kp->scsi_devp=(struct uc_scsi *)0; - /* now free the bus info */ - if(kp->incore){ - for(sbp=kp->scsibus_devp;sbp->driver; sbp++){ -/* fprintf(stderr, "sbp: 0x%x free(0x%x)\n", sbp, sbp->driver);*/ - free(sbp->driver); - } - } - - if (kp->scsibus_devp) - free(kp->scsibus_devp); - kp->scsibus_devp=(struct uc_scsibus *)0; -} - -/* end of userconfig/uc_scsi.c */ |