Annotation of researchv10no/cmd/ps/kmem.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include "ps.h"
                      3: #include <nlist.h>
                      4: 
                      5: struct nlist nl[] = {
                      6:        { "_proc" },
                      7: #define        X_PROC          0
                      8:        { "_proccnt" },
                      9: #define        X_NPROC         1
                     10:        { "_physspt" },
                     11: #define        X_PHYSSPT       2
                     12:        { 0 },
                     13: };
                     14: 
                     15: struct proc *kproc;
                     16: static int nproc, lastproc;
                     17: long physspt;
                     18: 
                     19: long vtophys();
                     20: 
                     21: initk()
                     22: {
                     23: 
                     24:        if (memf == NULL)
                     25:                memf = "/dev/mem";
                     26:        else {
                     27:                if (drumf == NULL)      /* and memf was specified */
                     28:                        drumf = "/dev/null";
                     29:        }
                     30:        if (drumf == NULL)
                     31:                drumf = "/dev/drum";
                     32:        if (nlistf == NULL)
                     33:                nlistf = "/unix";
                     34:        if ((drum = open(drumf, 0)) < 0) {
                     35:                perror(drumf);
                     36:                exit(1);
                     37:        }
                     38:        if ((memory = open(memf, 0)) < 0) {
                     39:                perror(memf);
                     40:                exit(1);
                     41:        }
                     42:        nlist(nlistf, nl);
                     43:        if(nl[0].n_type == 0) {
                     44:                fprintf(stderr, "%s: No namelist\n", nlistf);
                     45:                exit(1);
                     46:        }
                     47:        if (memrd(memory, (char *)&physspt, sizeof(physspt),
                     48:            (long)nl[X_PHYSSPT].n_value-KSTART) != sizeof(physspt)) {
                     49:                fprintf(stderr, "can't read physspt\n");
                     50:                exit(1);
                     51:        }
                     52: }
                     53: 
                     54: setkproc()
                     55: {
                     56:        if (memrd(memory, (char *)&nproc, sizeof(nproc),
                     57:            vtophys(nl[X_NPROC].n_value)) != sizeof(nproc)) {
                     58:                fprintf(stderr, "can't read nproc\n");
                     59:                exit(1);
                     60:        }
                     61:        if((kproc = (struct proc *)malloc(nproc*sizeof(struct proc))) == 0) {
                     62:                fprintf(stderr, "no memory for proc table\n");
                     63:                exit(1);
                     64:        }
                     65:        if (memrd(memory, (char *)kproc, nproc*sizeof(struct proc),
                     66:            vtophys(nl[X_PROC].n_value)) != nproc*sizeof(struct proc)) {
                     67:                fprintf(stderr, "can't read proc table\n");
                     68:                exit(1);
                     69:        }
                     70:        lastproc = nproc-1;
                     71: }
                     72: 
                     73: getprock(s, pp)
                     74: char *s;
                     75: struct proc *pp;
                     76: {
                     77:        register int pid, x;
                     78: 
                     79:        if (nproc == 0)
                     80:                setkproc();
                     81:        pid = atoi(s);
                     82:        for(x = lastproc+1; x != lastproc; x++) {
                     83:                if(x >= nproc)
                     84:                        x = 0;
                     85:                if (kproc[x].p_stat == 0)
                     86:                        continue;
                     87:                if(kproc[x].p_pid == pid) {
                     88:                        *pp = kproc[x];
                     89:                        lastproc = x;
                     90:                        return 0;
                     91:                }
                     92:        }
                     93:        return -1;
                     94: }
                     95: 
                     96: char *
                     97: getuareak(fd, pp, up)
                     98: register struct proc *pp;
                     99: register struct user *up;
                    100: {
                    101:        struct pte upte[UPAGES];
                    102:        register int i;
                    103: 
                    104:        if (pp->p_stat == SZOMB) {
                    105:                memset((char *)up, 0, sizeof(*up));
                    106:                return (0);
                    107:        }
                    108:        if (pp->p_flag & SLOAD) {
                    109:                if (memrd(memory, (char *)upte, sizeof(upte), vtophys((long)pp->p_addr)) != sizeof(upte))
                    110:                        return ("can't read user ptes");
                    111:                for (i = 0; i < UPAGES; i++)
                    112:                        if (memrd(memory, ((char *)up)+i*NBPG, NBPG,
                    113:                            ctob(upte[i].pg_pfnum)) != NBPG)
                    114:                                return ("can't read user");
                    115:                return (0);
                    116:        } else {
                    117:                if (memrd(drum, (char *)up, sizeof(*up), ctob(pp->p_swaddr)) != sizeof(*up))
                    118:                        return ("can't read user block");
                    119:                return (0);
                    120:        }
                    121: }
                    122: 
                    123: getstackk(f, pp, up, stack)
                    124: register struct proc *pp;
                    125: register struct user *up;
                    126: char *stack;
                    127: {
                    128:        register int i;
                    129:        int nstack, nspte;
                    130:        int szpt;       /* swapped pt size */
                    131:        struct pte pte[NPTEPG];
                    132: 
                    133:        nstack = ctob(up->u_ssize);
                    134:        if (nstack <= 0)
                    135:                return (0);
                    136:        if (nstack > NSTACK)
                    137:                nstack = NSTACK;
                    138:        nspte = btoc(nstack);
                    139:        szpt = clrnd(ctopt(UPAGES+pp->p_tsize+pp->p_dsize+pp->p_ssize));
                    140:        if (pp->p_flag & SLOAD) {
                    141:                if (memrd(memory, (char *)pte, sizeof(pte),
                    142:                    vtophys((long)pp->p_addr+UPAGES*sizeof(struct pte)-NBPG)) != sizeof(pte))
                    143:                        return (0);
                    144:        } else {
                    145:                if (memrd(drum, (char *)pte, sizeof(pte),
                    146:                    ctob(pp->p_swaddr+UPAGES+szpt-1)) != sizeof(pte))
                    147:                        return (0);
                    148:        }
                    149:        for (i = nspte-1; i >= 0; stack += NBPG, --i)
                    150:                rdpage(up, i, &pte[NPTEPG-UPAGES-1-i], stack);
                    151:        return (nstack);
                    152: }
                    153: 
                    154: List *
                    155: getprlistk()
                    156: {
                    157:        register List *lp;
                    158:        register Entry *ep;
                    159:        register int x;
                    160: 
                    161:        if (nproc == 0)
                    162:                setkproc();
                    163:        if((lp = Malloc(List, 1)) == 0)
                    164:                return 0;
                    165:        lp->next = 0;
                    166:        lp->begin = 0;
                    167:        lp->nentry = 0;
                    168:        for(x = 0; x < nproc; x++) {
                    169:                if(kproc[x].p_stat == 0)
                    170:                        continue;
                    171:                if((ep = Malloc(Entry, 1)) == 0)
                    172:                        break;
                    173:                ep->next = lp->begin;
                    174:                lp->begin = ep;
                    175:                lp->nentry++;
                    176:                ep->e_val = kproc[x].p_pid;
                    177:                sprintf(ep->e_name, "%d", kproc[x].p_pid);
                    178:        }
                    179:        return lp;
                    180: }
                    181: 
                    182: long
                    183: vtophys(loc)
                    184: long loc;
                    185: {
                    186:        struct pte pte;
                    187:        register long nloc;
                    188: 
                    189:        nloc = loc - KSTART;
                    190:        if (nloc < 0) {
                    191:                fprintf(stderr, "bad kernel address %x\n", loc);
                    192:                return (0);
                    193:        }
                    194:        if (memrd(memory, (char *)&pte, sizeof(pte),
                    195:            physspt + (nloc/NBPG)*sizeof(struct pte)) != sizeof(pte)) {
                    196:                fprintf(stderr, "can't get spt for %x\n", loc);
                    197:                return (0);
                    198:        }
                    199:        if (pte.pg_v == 0) {
                    200:                fprintf(stderr, "invalid spt for %x\n", loc);
                    201:                return (0);
                    202:        }
                    203:        return (pte.pg_pfnum * NBPG + (nloc & PGOFSET));
                    204: }
                    205: 
                    206: kreadk(addr, buf, size)
                    207: long addr;
                    208: char *buf;
                    209: int size;
                    210: {
                    211: 
                    212:        return (memrd(memory, buf, size, vtophys(addr)) == size);
                    213: }

unix.superglobalmegacorp.com

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