Annotation of 43BSDReno/bin/adb/common_source/setup.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)setup.c    5.3 (Berkeley) 6/25/90";
                      3: #endif
                      4: 
                      5: /*
                      6:  * adb - routines to read a.out and core files at startup
                      7:  */
                      8: 
                      9: #include "defs.h"
                     10: #include <sys/file.h>
                     11: #include <machine/machparam.h>
                     12: 
                     13: static struct exec filhdr;
                     14: 
                     15: off_t  lseek();
                     16: char   *malloc();
                     17: 
                     18: /* NB. the following works only with letter (alpha) variables */
                     19: #define        setavar(name, value) (var[(name) - 'a' + 10] = (value))
                     20: 
                     21: setsym()
                     22: {
                     23:        register struct nlist *sp;
                     24:        int strsize;
                     25:        char *strtab;
                     26:        off_t loc, dbase;
                     27: 
                     28:        txtmap.ufd = symfile.fd = getfile(1);
                     29:        if (read(symfile.fd, (char *)&filhdr, sizeof(filhdr)) != sizeof(filhdr) ||
                     30:            N_BADMAG(filhdr)) {
                     31:                bzero((char *)&filhdr, sizeof(filhdr));
                     32:                txtmap.m1.e = -(addr_t)1;
                     33:                return;
                     34:        }
                     35:        loc = filhdr.a_text + filhdr.a_data;
                     36:        txtmap.m1.f = txtmap.m2.f = N_TXTOFF(filhdr);
                     37:        switch ((int)filhdr.a_magic) {
                     38: 
                     39:        case OMAGIC:
                     40:                /* text map 1 is empty; map 2 goes from 0 to loc */
                     41:                txtmap.m2.b = dbase = 0;
                     42:                txtmap.m2.e = loc;
                     43:                break;
                     44: 
                     45:        case ZMAGIC:
                     46:        case NMAGIC:
                     47:                /* text map 1 maps text segment, map 2 maps data */
                     48:                txtmap.m1.e = filhdr.a_text;
                     49:                txtmap.m2.b = dbase = roundup(filhdr.a_text, CLBYTES);
                     50:                txtmap.m2.e = dbase + filhdr.a_data;
                     51:                txtmap.m2.f += txtmap.m1.e;
                     52:                break;
                     53:        }
                     54: 
                     55:        /* save data segment base in variable b */
                     56:        setavar('b', dbase);
                     57: 
                     58:        if (filhdr.a_syms != 0) {
                     59:                loc = N_SYMOFF(filhdr);
                     60:                symtab = (struct nlist *)malloc((u_int)filhdr.a_syms);
                     61:                if (symtab == NULL)
                     62:                        goto nospace;
                     63:                esymtab = &symtab[filhdr.a_syms / sizeof(struct nlist)];
                     64:                (void) lseek(symfile.fd, loc, L_SET);
                     65: 
                     66: #define        rd(a, n) \
                     67:        if (read(symfile.fd, (char *)(a), (int)(n)) != (n)) \
                     68:                goto readerr
                     69: 
                     70:                rd(symtab, filhdr.a_syms);
                     71:                rd(&strsize, sizeof(strsize));
                     72:                /*
                     73:                 * offsets in the string table are relative to the offset
                     74:                 * of the number we just read; we adjust for it here.
                     75:                 */
                     76:                strsize -= sizeof(strsize);
                     77:                if ((strtab = malloc((u_int)strsize)) == NULL)
                     78:                        goto nospace;
                     79:                rd(strtab, strsize);
                     80:                for (sp = symtab; sp < esymtab; sp++) {
                     81:                        if (sp->n_un.n_strx == 0)
                     82:                                continue;
                     83:                        sp->n_un.n_strx -= sizeof(strsize);
                     84:                        if ((u_long)sp->n_un.n_strx >= strsize) {
                     85:                                adbprintf("bad string index %D in symtab\n",
                     86:                                    (expr_t)sp->n_un.n_strx);
                     87:                                sp->n_un.n_name = "";
                     88:                        } else
                     89:                                sp->n_un.n_name = strtab + sp->n_un.n_strx;
                     90:                }
                     91: #undef rd
                     92:        }
                     93:        if (INKERNEL(filhdr.a_entry)) {
                     94:                txtmap.m1.b += KERNTEXTOFF;
                     95:                txtmap.m1.e += KERNTEXTOFF;
                     96:                txtmap.m2.b += KERNTEXTOFF;
                     97:                txtmap.m2.e += KERNTEXTOFF;
                     98:        }
                     99:        return;
                    100: 
                    101: readerr:
                    102:        prints("Error reading symbol|string table (old format a.out?)\n");
                    103:        exit(1);
                    104:        /* NOTREACHED */
                    105: 
                    106: nospace:
                    107:        prints("Not enough space for symbol|string table\n");
                    108:        exit(1);
                    109:        /* NOTREACHED */
                    110: }
                    111: 
                    112: setcore()
                    113: {
                    114:        off_t stacksize;
                    115: 
                    116:        datmap.m1.e = -(addr_t)1;
                    117:        if ((datmap.ufd = corefile.fd = getfile(2)) < 0)
                    118:                goto ret;
                    119:        if (kernel && INKERNEL(filhdr.a_entry) && getkcore()) {
                    120:                kcore = 1;
                    121:                goto ret;
                    122:        }
                    123:        if (read(corefile.fd, (char *)&u, ctob(UPAGES)) != ctob(UPAGES) ||
                    124:            !udot()) {
                    125:                adbprintf("not core file = %s\n", corefile.name);
                    126:                goto ret;
                    127:        }
                    128:        signo = u.u_sig;
                    129:        sigcode = u.u_code;
                    130:        filhdr.a_text = ctob(u.u_tsize);
                    131:        filhdr.a_data = ctob(u.u_dsize);
                    132:        stacksize = ctob(u.u_ssize);
                    133:        switch ((int)filhdr.a_magic) {
                    134: 
                    135:        case OMAGIC:
                    136:                datmap.m1.b = 0;
                    137:                datmap.m1.e = filhdr.a_text + filhdr.a_data;
                    138:                datmap.m2.f = ctob(UPAGES) + datmap.m1.e;
                    139:                break;
                    140: 
                    141:        case NMAGIC:
                    142:        case ZMAGIC:
                    143:                datmap.m1.b = roundup(filhdr.a_text, CLBYTES);
                    144:                datmap.m1.e = datmap.m1.b + filhdr.a_data;
                    145:                datmap.m2.f = ctob(UPAGES) + filhdr.a_data;
                    146:                break;
                    147:        }
                    148:        /* save (possibly new) data segment base, and save stack size */
                    149:        setavar('b', datmap.m1.b);
                    150:        setavar('s', stacksize);
                    151:        datmap.m1.f = ctob(UPAGES);
                    152:        datmap.m2.b = KERNBASE - ctob(UPAGES) - stacksize;
                    153:        datmap.m2.e = KERNBASE - ctob(UPAGES);
                    154: ret:
                    155:        u.u_ar0 = (int *)((caddr_t)&u + ctob(UPAGES));  /* XXX */
                    156:        setavar('d', filhdr.a_data);
                    157:        setavar('e', filhdr.a_entry);
                    158:        setavar('m', filhdr.a_magic);
                    159:        setavar('t', filhdr.a_text);
                    160: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.