|
|
1.1 ! root 1: /* ! 2: * ! 3: * UNIX debugger ! 4: * ! 5: */ ! 6: ! 7: #include "defs.h" ! 8: ! 9: MSG BADDAT; ! 10: MSG BADTXT; ! 11: MSG ADDOOS; ! 12: MSG BADBR; ! 13: MSG BADPT; ! 14: MSG BADPAGE; ! 15: MAP txtmap; ! 16: MAP datmap; ! 17: INT wtflag; ! 18: STRING errflg; ! 19: INT errno; ! 20: ! 21: L_INT pid; ! 22: ! 23: /* file handling and access routines */ ! 24: ! 25: put(adr,space,value) ! 26: #ifndef EDDT ! 27: L_INT adr; ! 28: { ! 29: access(WT,adr,space,value); ! 30: } ! 31: #else ! 32: L_INT *adr; {*adr=value;} ! 33: #endif ! 34: ! 35: POS get(adr, space) ! 36: #ifndef EDDT ! 37: L_INT adr; ! 38: { ! 39: return(access(RD,adr,space,0)); ! 40: } ! 41: #else ! 42: L_INT *adr; {return(*adr);} ! 43: #endif ! 44: ! 45: POS chkget(n, space) ! 46: L_INT n; ! 47: { ! 48: REG w; ! 49: ! 50: w = get(n, space); ! 51: chkerr(); ! 52: return(w); ! 53: } ! 54: ! 55: POS bchkget(n, space) ! 56: L_INT n; ! 57: { ! 58: return(byte(chkget(n, space))); ! 59: } ! 60: ! 61: /* ! 62: * When the kernel is being debugged with the -k flag we interpret ! 63: * the system page tables for data space, mapping p0 and p2 addresses ! 64: * relative to the 'current' process (as specified by its p_addr in <p) ! 65: * and mapping system space addresses through the system page tables. ! 66: */ ! 67: #ifndef EDDT ! 68: access(mode,adr,space,value) ! 69: L_INT adr; ! 70: ADDR value; ! 71: { ! 72: REG pmode,rd,file; ! 73: ADDR w; ! 74: rd = mode==RD; ! 75: ! 76: IF space == NSP THEN return(0); FI ! 77: ! 78: IF pid /* tracing on? */ ! 79: THEN ! 80: pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER)); ! 81: w = ptrace(pmode, pid, adr, value); ! 82: IF errno ! 83: THEN errflg = (space&DSP ? BADDAT : BADTXT); ! 84: FI ! 85: return(w); ! 86: FI ! 87: w = 0; ! 88: IF mode==WT ANDF wtflag==0 ! 89: THEN error("not in write mode"); ! 90: FI ! 91: IF !chkmap(&adr,space) ! 92: THEN return(0); ! 93: FI ! 94: file=(space&DSP?datmap.ufd:txtmap.ufd); ! 95: IF kernel ANDF space == DSP ! 96: THEN ! 97: adr = vtophys(adr); ! 98: IF (adr < 0) ! 99: THEN return(0); ! 100: FI ! 101: FI ! 102: IF physrw(file,adr,rd ? &w : &value,rd) < 0 ! 103: THEN errflg=(space&DSP?BADDAT:BADTXT); ! 104: FI ! 105: return(w); ! 106: } ! 107: #endif ! 108: ! 109: /* ! 110: * When looking at kernel data space through /dev/mem or ! 111: * with a core file, do virtual memory mapping. ! 112: */ ! 113: vtophys(addr) ! 114: off_t addr; ! 115: { ! 116: REG v, oldaddr = addr; ! 117: STRUCT pte pte; ! 118: ! 119: addr &= ~0xc0000000; ! 120: v = btop(addr); ! 121: switch (oldaddr&0xc0000000) { ! 122: ! 123: case 0xc0000000: ! 124: /* ! 125: * In system space get system pte. If ! 126: * valid or reclaimable then physical address ! 127: * is combination of its page number and the page ! 128: * offset of the original address. ! 129: */ ! 130: IF v > slr ! 131: THEN goto oor; ! 132: FI ! 133: addr = ((long)(sbr + v)) & ~0xc0000000; ! 134: goto simple; ! 135: ! 136: default: ! 137: return(-1); ! 138: oor: ! 139: errflg = ADDOOS; ! 140: return(-1); ! 141: } ! 142: simple: ! 143: /* ! 144: * Addr is now address of the pte of the page we ! 145: * are interested in; get the pte and paste up the ! 146: * physical address. ! 147: */ ! 148: IF physrw(fcor, addr, (int *)&pte, 1) < 0 ! 149: THEN ! 150: errflg = BADPT; ! 151: return(-1); ! 152: FI ! 153: IF pte.pg_v == 0 ANDF (pte.pg_fod ORF pte.pg_pfnum == 0) ! 154: THEN ! 155: errflg = BADPAGE; ! 156: return(-1); ! 157: FI ! 158: return((ADDR)ptob(pte.pg_pfnum) + (oldaddr & PGOFSET)); ! 159: } ! 160: ! 161: physrw(file,addr,aw,rd) ! 162: off_t addr; ! 163: REG *aw, rd; ! 164: { ! 165: ! 166: IF longseek(file,addr)==0 ORF ! 167: (rd ? read(file,aw,sizeof(int)) : write(file,aw,sizeof(int))) < 1 ! 168: THEN return(-1); ! 169: FI ! 170: return(0); ! 171: } ! 172: ! 173: chkmap(adr,space) ! 174: REG POS *adr; ! 175: REG space; ! 176: { ! 177: REG MAPPTR amap; ! 178: amap=((space&DSP?&datmap:&txtmap)); ! 179: IF space&STAR ORF !within(*adr,amap->b1,amap->e1) ! 180: THEN IF within(*adr,amap->b2,amap->e2) ! 181: THEN *adr += (amap->f2)-(amap->b2); ! 182: ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0); ! 183: FI ! 184: ELSE *adr += (amap->f1)-(amap->b1); ! 185: FI ! 186: return(1); ! 187: } ! 188: ! 189: within(adr,lbd,ubd) ! 190: POS adr, lbd, ubd; ! 191: { ! 192: return(adr>=lbd && adr<ubd); ! 193: } ! 194: ! 195: longseek(f, a) ! 196: L_INT a; ! 197: { ! 198: return(lseek(f,a,0) != -1); ! 199: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.