Annotation of researchv10no/cmd/ps/kmem.c, revision 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.