|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.