Annotation of researchv10no/cmd/lcomp/syscore.c, revision 1.1.1.1

1.1       root        1: #include "stdio.h"
                      2: #include "sys/param.h"
                      3: #include <sys/dir.h>
                      4: #include <sys/psl.h>
                      5: #include <sys/pte.h>
                      6: #include <sys/user.h>
                      7: #include <ctype.h>
                      8: #include <a.out.h>
                      9: #include "sys/vm.h"
                     10: 
                     11: struct pcb     pcb;
                     12: int    kernel;
                     13: int    kcore;
                     14: struct pte *sbr;
                     15: int    slr;
                     16: int    masterpcbb;
                     17: int fcor, ffil;
                     18: 
                     19: struct nlist *cursym;
                     20: char *sysnam;
                     21: 
                     22: lookup(s)
                     23: char *s;
                     24: {      static struct nlist nl[2];
                     25:        nl[0].n_un.n_name = s;
                     26:        nlist(sysnam, nl);
                     27:        cursym = nl;
                     28:        if(nl[0].n_value == 0)
                     29:                fatal("lookup of %s failed\n", s);
                     30:        else
                     31:                printf("lookup of %s is 0x%x\n", s, cursym->n_value);
                     32: }
                     33: 
                     34: vtophys(addr)
                     35: off_t addr;
                     36: {
                     37:        int oldaddr = addr;
                     38:        int v;
                     39:        struct pte pte;
                     40: 
                     41:        addr &= ~0xc0000000;
                     42:        v = btop(addr);
                     43:        switch (oldaddr&0xc0000000) {
                     44: 
                     45:        case 0xc0000000:
                     46:        case 0x80000000:
                     47:                /*
                     48:                 * In system space get system pte.  If
                     49:                 * valid or reclaimable then physical address
                     50:                 * is combination of its page number and the page
                     51:                 * offset of the original address.
                     52:                 */
                     53:                if (v >= slr)
                     54:                        goto oor;
                     55:                addr = ((long)(sbr+v)) &~ 0x80000000;
                     56:                goto simple;
                     57: 
                     58:        case 0x40000000:
                     59:                /*
                     60:                 * In p1 space must not be in shadow region.
                     61:                 */
                     62:                if (v < pcb.pcb_p1lr)
                     63:                        goto oor;
                     64:                addr = (off_t) (pcb.pcb_p1br+v);
                     65:                break;
                     66: 
                     67:        case 0x00000000:
                     68:                /*
                     69:                 * In p0 space must not be off end of region.
                     70:                 */
                     71:                if (v >= pcb.pcb_p0lr)
                     72:                        goto oor;
                     73:                addr = (off_t) (pcb.pcb_p0br+v);
                     74:                break;
                     75:        oor:
                     76:                return (-1);
                     77:        }
                     78:        /*
                     79:         * For p0/p1 address, user-level page table should
                     80:         * be in kernel vm.  Do second-level indirect by recursing.
                     81:         */
                     82:        if ((addr & 0x80000000) == 0) {
                     83:                return (-1);
                     84:        }
                     85:        addr = vtophys(addr);
                     86: simple:
                     87:        /*
                     88:         * Addr is now address of the pte of the page we
                     89:         * are interested in; get the pte and paste up the
                     90:         * physical address.
                     91:         */
                     92:        if(lseek(fcor, addr, 0) < 0 || read(fcor, (char *)&pte, sizeof(char *)) <= 0) {
                     93:                return (-1);
                     94:        }
                     95:        /* SHOULD CHECK NOT I/O ADDRESS; NEED CPU TYPE! */
                     96:        if (pte.pg_v == 0 && (pte.pg_fod || pte.pg_pfnum == 0)) {
                     97:                return (-1);
                     98:        }
                     99:        return (ptob(pte.pg_pfnum) + (oldaddr & PGOFSET));
                    100: }
                    101: 
                    102: main(argc, argv)
                    103: char **argv;
                    104: {
                    105:        if(argc == 1) {
                    106:                sysnam = "/vmunix";
                    107:                fcor = open("core", 0);
                    108:        }
                    109:        else if(argc != 3) {
                    110:                fprintf(stderr, "usage: %s [core system]\n", argv[0]);
                    111:                exit(1);
                    112:        }
                    113:        else {
                    114:                sysnam = argv[2];
                    115:                fcor = open(argv[1], 0);
                    116:        }
                    117:        lookup("_Sysmap");
                    118:        sbr = cursym->n_value;
                    119:        lookup("_Syssize");
                    120:        slr = cursym->n_value;
                    121:        printf("sbr %X slr %X\n", sbr, slr);
                    122:        lookup("_masterpaddr");
                    123:        lseek(fcor, cursym->n_value & 0x7fffffff, 0);
                    124:        read(fcor, (char *)&masterpcbb, sizeof(char *));
                    125:        masterpcbb = (masterpcbb&PG_PFNUM)*512;
                    126:        getpcb();
                    127:        go();
                    128:        exit(0);
                    129: }
                    130: 
                    131: getpcb()
                    132: {
                    133: 
                    134:        lseek(fcor, masterpcbb&~0x80000000, 0);
                    135:        read(fcor, &pcb, sizeof (struct pcb));
                    136:        pcb.pcb_p0lr &= ~AST_CLR;
                    137:        printf("p0br %X p0lr %X p1br %X p1lr %X\n",
                    138:            pcb.pcb_p0br, pcb.pcb_p0lr, pcb.pcb_p1br, pcb.pcb_p1lr);
                    139: }
                    140: 
                    141: struct rec {
                    142:        long len;
                    143:        struct rec *next;
                    144:        char *fname;
                    145: } proFptr;
                    146: FILE *outfd;
                    147: struct rec *x;
                    148: char buf[256];
                    149: long foo[1024];
                    150: int fd;
                    151: 
                    152: go()
                    153: {
                    154:        if(fcor < 0) {
                    155:                perror("/dev/kmem");
                    156:                exit(1);
                    157:        }
                    158:        outfd = fopen("prof.out", "w");
                    159:        if(outfd == 0) {
                    160:                perror("prof.out");
                    161:                exit(1);
                    162:        }
                    163:        lookup("_proFptr");
                    164:        if(vseek(fcor, cursym->n_value, 0) == -1) {
                    165:                fprintf(stderr, "vseek failed seeking to x%x\n", cursym->n_value);
                    166:                exit(1);
                    167:        }
                    168:        if(read(fcor, (char *)&x, sizeof(long)) != sizeof(long)) {
                    169:                fprintf(stderr, "read failed\n");
                    170:                exit(1);;
                    171:        }
                    172:        for(;;) {
                    173:                readit();
                    174:                if(proFptr.next == 0 || proFptr.next == x)
                    175:                        break;
                    176:                x = proFptr.next;
                    177:        }
                    178: }
                    179: 
                    180: readit()
                    181: {      int i;
                    182:        i = vseek(fcor, (char *)x, 0);
                    183:        if(i == -1)
                    184:                fatal("first vseek in readit, seeking to x%x\n", x);
                    185:        i = read(fcor, (char *)&proFptr, sizeof(proFptr));
                    186:        if(i != sizeof(proFptr))
                    187:                fatal("reading proFptr in readit\n");
                    188:        i = read(fcor, (char *)foo, sizeof(long) * proFptr.len);
                    189:        if(i != sizeof(long) * proFptr.len)
                    190:                fatal("read %d instead of %d\n", i, sizeof(long) * proFptr.len);
                    191:        i = vseek(fcor, proFptr.fname, 0);
                    192:        if(i == -1)
                    193:                fatal("seeking to x%x\n", proFptr.fname);
                    194:        i = read(fcor, buf, sizeof(buf));
                    195:        fprintf(outfd, "%s\n", buf);
                    196:        fflush(outfd);
                    197:        for(i = 3; i < proFptr.len; i++)
                    198:                fprintf(outfd, "%d\n", foo[i-3]);
                    199: }
                    200: 
                    201: fatal(s, a, b, c, d, e, f, g)
                    202: char *s;
                    203: {
                    204:        fprintf(stderr, s, a, b, c, d, e, f, g);
                    205:        exit(1);
                    206: }
                    207: 
                    208: vseek(fd, loc, flag)
                    209: long loc;
                    210: {      long addr;
                    211:        addr = vtophys(loc);
                    212:        return(lseek(fd, addr, flag));
                    213: }

unix.superglobalmegacorp.com

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