Annotation of 42BSD/bin/adb/setup.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "@(#)setup.c    4.6 82/10/28";
                      2: /*
                      3:  * adb - routines to read a.out+core at startup
                      4:  */
                      5: #include "defs.h"
                      6: #include <sys/stat.h>
                      7: 
                      8: off_t  datbas;                 /* offset of the base of the data segment */
                      9: off_t  stksiz;                 /* stack size in the core image */
                     10: INT    sigcode;        /* belongs in head.h */
                     11: 
                     12: char   *symfil = "a.out";
                     13: char   *corfil = "core";
                     14: 
                     15: setsym()
                     16: {
                     17:        off_t loc;
                     18:        struct exec hdr;
                     19:        register struct nlist *sp;
                     20:        int ssiz;
                     21:        char *strtab;
                     22: 
                     23:        fsym = getfile(symfil, 1);
                     24:        txtmap.ufd = fsym;
                     25:        if (read(fsym, (char *)&hdr, sizeof hdr) != sizeof hdr ||
                     26:            N_BADMAG(hdr)) {
                     27:                txtmap.e1 = MAXFILE;
                     28:                return;
                     29:        }
                     30:        filhdr = hdr;
                     31:        loc = filhdr.a_text+filhdr.a_data;
                     32:        txtmap.f1 = txtmap.f2 = N_TXTOFF(filhdr);
                     33:        txtmap.b1 = 0;
                     34:        switch (filhdr.a_magic) {
                     35: 
                     36:        case OMAGIC:
                     37:                txtmap.b1 = txtmap.e1 = 0;
                     38:                txtmap.b2 = datbas = 0;
                     39:                txtmap.e2 = loc;
                     40:                break;
                     41: 
                     42:        case ZMAGIC:
                     43:        case NMAGIC:
                     44:                txtmap.e1 = filhdr.a_text;
                     45:                txtmap.b2 = datbas = round(filhdr.a_text, PAGSIZ);
                     46:                txtmap.e2 = datbas + filhdr.a_data;
                     47:                txtmap.f2 += txtmap.e1;
                     48:        }
                     49:        loc = N_SYMOFF(filhdr);
                     50:        symtab = (struct nlist *) malloc(filhdr.a_syms);
                     51:        esymtab = &symtab[filhdr.a_syms / sizeof (struct nlist)];
                     52:        if (symtab == NULL)
                     53:                goto nospac;
                     54:        lseek(fsym, loc, 0);
                     55:        if (filhdr.a_syms == 0)
                     56:                goto nosymt;
                     57:        /* SHOULD SQUISH OUT STABS HERE!!! */
                     58:        if (read(fsym, symtab, filhdr.a_syms) != filhdr.a_syms)
                     59:                goto readerr;
                     60:        if (read(fsym, &ssiz, sizeof (ssiz)) != sizeof (ssiz))
                     61:                goto oldfmt;
                     62:        strtab = (char *) malloc(ssiz);
                     63:        if (strtab == 0)
                     64:                goto nospac;
                     65:        *(int *)strtab = ssiz;
                     66:        ssiz -= sizeof (ssiz);
                     67:        if (read(fsym, strtab + sizeof (ssiz), ssiz) != ssiz)
                     68:                goto readerr;
                     69:        for (sp = symtab; sp < esymtab; sp++)
                     70:                if (sp->n_strx)
                     71:                        /* SHOULD PERFORM RANGE CHECK HERE */
                     72:                        sp->n_un.n_name = strtab + sp->n_un.n_strx;
                     73: nosymt:
                     74:        if (INKERNEL(filhdr.a_entry)) {
                     75:                txtmap.b1 += KERNOFF;
                     76:                txtmap.e1 += KERNOFF;
                     77:                txtmap.b2 += KERNOFF;
                     78:                txtmap.e2 += KERNOFF;
                     79:        }
                     80:        return;
                     81: readerr:
                     82:        printf("Error reading symbol|string table\n");
                     83:        exit(1);
                     84: nospac:
                     85:        printf("Not enough space for symbol|string table\n");
                     86:        exit(1);
                     87: oldfmt:
                     88:        printf("Old format a.out - no string table\n");
                     89:        exit(1);
                     90: }
                     91: 
                     92: setcor()
                     93: {
                     94: 
                     95:        fcor = datmap.ufd = getfile(corfil,2);
                     96:        if (kernel && fcor != -1 && INKERNEL(filhdr.a_entry)) {
                     97:                struct stat stb;
                     98: 
                     99:                kcore = 1;
                    100:                fstat(fcor, &stb);
                    101:                datmap.b1 = 0;
                    102:                datmap.e1 = -1;
                    103:                if (kernel == 0 && (stb.st_mode & S_IFREG))
                    104:                        datmap.b1 = 0x80000000;
                    105:                lookup("_Sysmap");
                    106:                sbr = cursym->n_value;
                    107:                lookup("_Syssize");
                    108:                slr = cursym->n_value;
                    109:                printf("sbr %X slr %X\n", sbr, slr);
                    110:                lookup("_masterpaddr");
                    111:                physrw(fcor, cursym->n_value&0x7fffffff, &masterpcbb, 1);
                    112:                masterpcbb = (masterpcbb&PG_PFNUM)*512;
                    113:                getpcb();
                    114:                return;
                    115:        }
                    116:        if (read(fcor, (char *)&u, ctob(UPAGES))!=ctob(UPAGES) ||
                    117:           !INUDOT(u.u_pcb.pcb_ksp) || !INSTACK(u.u_pcb.pcb_usp)) {
                    118:                datmap.e1 = MAXFILE;
                    119:                return;
                    120:        }
                    121:        signo = u.u_arg[0];
                    122:        sigcode = u.u_code;
                    123:        filhdr.a_text = ctob(u.u_tsize);
                    124:        filhdr.a_data = ctob(u.u_dsize);
                    125:        stksiz = ctob(u.u_ssize);
                    126:        switch (filhdr.a_magic) {
                    127: 
                    128:        case OMAGIC:
                    129:                datmap.b1 = 0;
                    130:                datmap.e1 = filhdr.a_text+filhdr.a_data;
                    131:                datmap.f2 = ctob(UPAGES) + datmap.e1;
                    132:                break;
                    133: 
                    134:        case NMAGIC:
                    135:        case ZMAGIC:
                    136:                datmap.b1 = round(filhdr.a_text, PAGSIZ);
                    137:                datmap.e1 = datmap.b1 + filhdr.a_data;
                    138:                datmap.f2 = ctob(UPAGES) + filhdr.a_data;
                    139:                break;
                    140:        }
                    141:        datbas = datmap.b1;
                    142:        datmap.f1 = ctob(UPAGES);
                    143:        datmap.b2 = MAXSTOR - stksiz;
                    144:        datmap.e2 = MAXSTOR;
                    145:        if (filhdr.a_magic && u.u_exdata.ux_mag &&
                    146:            filhdr.a_magic != u.u_exdata.ux_mag)
                    147:                printf("corefile not from this program");
                    148: }
                    149: 
                    150: getpcb()
                    151: {
                    152: 
                    153:        lseek(fcor, masterpcbb&~0x80000000, 0);
                    154:        read(fcor, &pcb, sizeof (struct pcb));
                    155:        pcb.pcb_p0lr &= ~AST_CLR;
                    156:        printf("p0br %X p0lr %X p1br %X p1lr %X\n",
                    157:            pcb.pcb_p0br, pcb.pcb_p0lr, pcb.pcb_p1br, pcb.pcb_p1lr);
                    158: }
                    159: 
                    160: create(f)
                    161:        char *f;
                    162: {
                    163:        register int fd;
                    164: 
                    165:        fd = creat(f, 0644);
                    166:        if (fd < 0)
                    167:                return (-1);
                    168:        close(fd);
                    169:        return (open(f, wtflag));
                    170: }
                    171: 
                    172: getfile(filnam, cnt)
                    173:        char *filnam;
                    174: {
                    175:        register int fsym;
                    176: 
                    177:        if (eqstr(filnam, "-"))
                    178:                return (-1);
                    179:        fsym = open(filnam, wtflag);
                    180:        if (fsym < 0 && xargc > cnt) {
                    181:                if (wtflag)
                    182:                        fsym = create(filnam);
                    183:                if (fsym < 0)
                    184:                        printf("cannot open `%s'\n", filnam);
                    185:        }
                    186:        return (fsym);
                    187: }
                    188: 
                    189: setvar()
                    190: {
                    191: 
                    192:        var[varchk('b')] = datbas;
                    193:        var[varchk('d')] = filhdr.a_data;
                    194:        var[varchk('e')] = filhdr.a_entry;
                    195:        var[varchk('m')] = filhdr.a_magic;
                    196:        var[varchk('s')] = stksiz;
                    197:        var[varchk('t')] = filhdr.a_text;
                    198: }

unix.superglobalmegacorp.com

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