1: /* 2: * Copyright (c) 1986 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: * 6: * @(#)read_nlist.c 2.2 (2.11BSD GTE) 1/10/94 7: */ 8: 9: /* 10: * Read all the symbols we'll need for the devices we want to configure 11: * These are -- The probe, attach and handler routines for each device, 12: * and a few symbols that we'll need later on. 13: */ 14: 15: #include <machine/autoconfig.h> 16: #include <sys/param.h> 17: #include <sys/file.h> 18: #include <a.out.h> 19: #include <stdio.h> 20: #include "dtab.h" 21: 22: extern char *strdup(); 23: extern char *nlist_name; /* file we read the namelist from */ 24: extern int guess_ndev; /* number of lines read from dtab */ 25: extern int debug; 26: extern int kmem; 27: extern int pflag; 28: NLIST *nl, *np, *int_nl, *good_nl, *bad_nl, *trap_nl, *sep_nl, *vers_nl, 29: *add_nlist(), *end_vector, *next_nl; 30: 31: #define END_NAME "endvec" 32: #define NEXTIV_NAME "_nextiv" /* floating vector allocator */ 33: #define INT_NAME "_conf_int" 34: #define GOOD_NAME "CGOOD" 35: #define BAD_NAME "CBAD" 36: #define TRAP_NAME "trap" 37: #define SEPID_NAME "KERN_NONSEP" /* KERN_NONSEP */ 38: #define VERSION "_version" 39: 40: read_nlist() 41: { 42: register NLIST **lp, 43: *nnp; 44: register DTAB *dp; 45: struct exec head; 46: struct ovlhdr ovhead; 47: HAND *already = (HAND *)NULL, 48: *sp; 49: off_t offst; 50: int unix_fd; 51: short cnt; 52: char tname[20], 53: unix_vers[100], 54: core_vers[100], 55: *calloc(); 56: NLIST *add_nlist(); 57: 58: np = nl = (NLIST *)calloc(guess_ndev + 10,sizeof(NLIST)); 59: for (dp = devs; dp != NULL; dp = dp->dt_next) { 60: sprintf(tname, "_%sprobe", dp->dt_name); 61: dp->dt_probe = add_nlist(tname); 62: sprintf(tname, "_%sattach", dp->dt_name); 63: dp->dt_attach = add_nlist(tname); 64: sprintf(tname, "_%sVec", dp->dt_name); 65: dp->dt_setvec = add_nlist(tname); 66: for (sp = dp->dt_handlers;sp;sp = sp->s_next) 67: sp->s_nl = add_nlist(sp->s_str); 68: } 69: end_vector = np++; 70: end_vector->n_un.n_name = END_NAME; 71: int_nl = np++; 72: int_nl->n_un.n_name = INT_NAME; 73: good_nl = np++; 74: good_nl->n_un.n_name = GOOD_NAME; 75: bad_nl = np++; 76: bad_nl->n_un.n_name = BAD_NAME; 77: next_nl = np++; 78: next_nl->n_un.n_name = NEXTIV_NAME; 79: trap_nl = np++; 80: trap_nl->n_un.n_name = TRAP_NAME; 81: vers_nl = np++; 82: vers_nl->n_un.n_name = VERSION; 83: sep_nl = np++; 84: sep_nl->n_un.n_name = SEPID_NAME; 85: 86: if ((unix_fd = open(nlist_name,O_RDONLY)) < 0) { 87: perror(nlist_name); 88: exit(AC_SETUP); 89: } 90: nlist(nlist_name,nl); 91: if (debug || pflag) 92: for (np = nl; np->n_un.n_name; np++) 93: printf("%s = %o\n", np->n_un.n_name, np->n_value); 94: for (np = end_vector; np <= trap_nl; np++) 95: if (!np->n_value) { 96: fprintf(stderr,"%s: couldn't find symbols in %s.\n",myname,nlist_name); 97: exit(AC_SETUP); 98: } 99: if (!debug) { 100: #define round(x) (ctob(stoc(ctos(btoc(x))))) 101: lseek(unix_fd,(off_t)0,L_SET); 102: read(unix_fd,(char *)&head,sizeof(head)); 103: offst = (off_t)vers_nl->n_value + (off_t)head.a_text + sizeof(head); 104: if (head.a_magic == A_MAGIC2 || head.a_magic == A_MAGIC5) 105: offst -= (off_t)round(head.a_text); 106: if (head.a_magic == A_MAGIC5 || head.a_magic == A_MAGIC6) { 107: read(unix_fd,(char *)&ovhead,sizeof(ovhead)); 108: offst += sizeof(ovhead); 109: if (head.a_magic == A_MAGIC5) 110: offst -= (off_t)round(ovhead.max_ovl); 111: for (cnt = 0;cnt < NOVL;++cnt) 112: offst += (off_t)ovhead.ov_siz[cnt]; 113: } 114: lseek(unix_fd,offst,L_SET); 115: read(unix_fd,unix_vers,sizeof(unix_vers)); 116: lseek(kmem,(off_t)vers_nl->n_value,L_SET); 117: read(kmem,core_vers,sizeof(core_vers)); 118: unix_vers[99] = core_vers[99] = EOS; /* Just in case! */ 119: if (strcmp(unix_vers,core_vers)) { 120: fprintf(stderr,"%s: %s is not the running version.\n",myname,nlist_name); 121: exit(AC_SETUP); 122: } 123: } 124: close(unix_fd); 125: } 126: 127: /* 128: * If the passed symbol is in the nlist table, return pointer to it, 129: * otherwise add it to the table and return a pointer to new entry. 130: */ 131: NLIST * 132: add_nlist(name) 133: char *name; 134: { 135: register NLIST *n; 136: 137: for (n = nl;n < np;++n) 138: if (!strcmp(n->n_un.n_name, name)) 139: return(n); 140: np->n_un.n_name = strdup(name); 141: return(np++); 142: }