13753Sroot # 23753Sroot /* 33753Sroot * 43753Sroot * UNIX debugger 53753Sroot * 63753Sroot */ 73753Sroot 8*3777Sroot #define dprintf if (0) printf 9*3777Sroot 103753Sroot #include "defs.h" 11*3777Sroot static char sccsid[] = "@(#)access.c 4.2 05/14/81"; 123753Sroot 133753Sroot MSG ODDADR; 143753Sroot MSG BADDAT; 153753Sroot MSG BADTXT; 163753Sroot MAP txtmap; 173753Sroot MAP datmap; 183753Sroot INT wtflag; 193753Sroot STRING errflg; 203753Sroot INT errno; 213753Sroot 223753Sroot INT pid; 233753Sroot 243753Sroot /* file handling and access routines */ 253753Sroot 263753Sroot put(adr,space,value) 273753Sroot #ifndef EDDT 283753Sroot L_INT adr; 293753Sroot { 303753Sroot access(WT,adr,space,value); 313753Sroot } 323753Sroot #else 333753Sroot L_INT *adr; {*adr=value;} 343753Sroot #endif 353753Sroot 363753Sroot POS get(adr, space) 373753Sroot #ifndef EDDT 383753Sroot L_INT adr; 393753Sroot { 403753Sroot return(access(RD,adr,space,0)); 413753Sroot } 423753Sroot #else 433753Sroot L_INT *adr; {return(*adr);} 443753Sroot #endif 453753Sroot 463753Sroot POS chkget(n, space) 473753Sroot L_INT n; 483753Sroot { 493753Sroot #ifndef vax 503753Sroot REG INT w; 513753Sroot #else 523753Sroot REG L_INT w; 533753Sroot #endif 543753Sroot 553753Sroot w = get(n, space); 563753Sroot chkerr(); 573753Sroot return(w); 583753Sroot } 593753Sroot 603753Sroot POS bchkget(n, space) 613753Sroot L_INT n; 623753Sroot { 633753Sroot return(chkget(n, space) & LOBYTE); 643753Sroot } 653753Sroot 663753Sroot #ifndef EDDT 673753Sroot access(mode,adr,space,value) 68*3777Sroot long adr; 693753Sroot { 703753Sroot INT pmode,rd,file; 713753Sroot ADDR w; 723753Sroot rd = mode==RD; 733753Sroot 743753Sroot IF space == NSP THEN return(0); FI 753753Sroot 763753Sroot IF pid /* tracing on? */ 773753Sroot THEN 783753Sroot #ifndef vax 793753Sroot IF adr&01 ANDF !rd THEN error(ODDADR); FI 803753Sroot #endif 813753Sroot pmode = (space&DSP?(rd?RDUSER:WDUSER):(rd?RIUSER:WIUSER)); 823753Sroot w = ptrace(pmode, pid, adr, value); 833753Sroot #ifndef vax 843753Sroot IF adr&01 853753Sroot THEN w1 = ptrace(pmode, pid, shorten(adr+1), value); 863753Sroot w = (w>>8)&LOBYTE | (w1<<8); 873753Sroot FI 883753Sroot #endif 893753Sroot IF errno 903753Sroot THEN errflg = (space&DSP ? BADDAT : BADTXT); 913753Sroot FI 923753Sroot return(w); 933753Sroot FI 943753Sroot w = 0; 953753Sroot IF mode==WT ANDF wtflag==0 963753Sroot THEN error("not in write mode"); 973753Sroot FI 983753Sroot IF !chkmap(&adr,space) 993753Sroot THEN return(0); 1003753Sroot FI 1013753Sroot file=(space&DSP?datmap.ufd:txtmap.ufd); 102*3777Sroot IF kernel && space == DSP THEN 103*3777Sroot int oadr = adr; 104*3777Sroot int v; 105*3777Sroot adr &= ~0x80000000; 106*3777Sroot IF oadr&0x80000000 THEN /* system space */ 107*3777Sroot v = btop(adr); 108*3777Sroot dprintf("system addr %X, v %X\n", adr, v); 109*3777Sroot IF v >= slr THEN errflg="bad system space addr"; return (0); FI 110*3777Sroot adr = vtoa(file, adr); 111*3777Sroot IF adr == -1 THEN 112*3777Sroot errflg="sys page table page not valid"; return (0); FI 113*3777Sroot ELIF adr&0x40000000 THEN /* p1 space */ 114*3777Sroot v = btop(adr&~0x40000000); 115*3777Sroot dprintf("p1 addr %X, v %X, p1br %X p1lr %X\n", adr, v, 116*3777Sroot pcb.pcb_p1br, pcb.pcb_p1lr); 117*3777Sroot IF v < pcb.pcb_p1lr THEN 118*3777Sroot errflg="bad p1 space addr"; return (0); FI 119*3777Sroot adr = vtoa(file, pcb.pcb_p1br+v); 120*3777Sroot IF adr == -1 THEN 121*3777Sroot errflg="p1 page table page not valid"; return (0); FI 122*3777Sroot goto get; 123*3777Sroot ELSE /* p0 space */ 124*3777Sroot dprintf("p0 addr %X, v %X, p0br %X p0lr %X\n", adr, 125*3777Sroot v, pcb.pcb_p0br, pcb.pcb_p0lr); 126*3777Sroot IF v >= pcb.pcb_p0lr THEN 127*3777Sroot errflg="bad p0 space addr"; return (0); FI 128*3777Sroot adr = vtoa(file, pcb.pcb_p0br+v); 129*3777Sroot IF adr == -1 THEN 130*3777Sroot errflg="p0 page table page not valid"; return (0); FI 131*3777Sroot get: 132*3777Sroot dprintf("addr for pt page %X\n", adr); 133*3777Sroot IF physrw(file, adr, &adr, 1) < 0 THEN 134*3777Sroot errflg = "page tables botched"; return (0); FI 135*3777Sroot dprintf("user pte value %X\n", adr); 136*3777Sroot IF (adr & PG_V) == 0 && 137*3777Sroot ((adr & PG_FOD) || (adr & PG_PFNUM) == 0) THEN 138*3777Sroot errflg = "user page not resident"; return (0); 139*3777Sroot FI 140*3777Sroot adr = ((adr & 0xfffff) << 9) | (oadr & 0x1ff); 141*3777Sroot FI 1423753Sroot FI 143*3777Sroot IF physrw(file, adr, &w, rd) < 0 THEN 144*3777Sroot errflg=(space&DSP?BADDAT:BADTXT); 145*3777Sroot FI 1463753Sroot return(w); 1473753Sroot } 1483753Sroot #endif 1493753Sroot 150*3777Sroot physrw(file, adr, aw, rd) 151*3777Sroot int *aw; 152*3777Sroot { 153*3777Sroot 154*3777Sroot dprintf("physrw(%X) %s to %X\n", adr, rd ? "read" : "write", aw); 155*3777Sroot IF longseek(file,adr)==0 ORF 156*3777Sroot (rd ? read(file,aw,sizeof(int)) : write(file,aw,sizeof(int))) < 1 157*3777Sroot THEN return (-1); 158*3777Sroot FI 159*3777Sroot return (0); 160*3777Sroot } 161*3777Sroot 162*3777Sroot vtoa(file, va) 163*3777Sroot unsigned long va; 164*3777Sroot { 165*3777Sroot struct pte pte; 166*3777Sroot 167*3777Sroot physrw(file, ((long)(sbr + btop(va&0x7fffffff)))&~0x80000000, &pte, 1); 168*3777Sroot dprintf("vtoa got pte %X\n", pte); 169*3777Sroot if (pte.pg_v || (pte.pg_fod == 0 && pte.pg_pfnum)) 170*3777Sroot return (ptob(pte.pg_pfnum) + (va & PGOFSET)); 171*3777Sroot errflg = "page not resident"; 172*3777Sroot return (-1); 173*3777Sroot } 174*3777Sroot 1753753Sroot chkmap(adr,space) 1763753Sroot REG L_INT *adr; 1773753Sroot REG INT space; 1783753Sroot { 1793753Sroot REG MAPPTR amap; 1803753Sroot amap=((space&DSP?&datmap:&txtmap)); 1813753Sroot IF space&STAR ORF !within(*adr,amap->b1,amap->e1) 1823753Sroot THEN IF within(*adr,amap->b2,amap->e2) 1833753Sroot THEN *adr += (amap->f2)-(amap->b2); 1843753Sroot ELSE errflg=(space&DSP?BADDAT:BADTXT); return(0); 1853753Sroot FI 1863753Sroot ELSE *adr += (amap->f1)-(amap->b1); 1873753Sroot FI 1883753Sroot return(1); 1893753Sroot } 1903753Sroot 1913753Sroot within(adr,lbd,ubd) 1923753Sroot POS adr, lbd, ubd; 1933753Sroot { 1943753Sroot return(adr>=lbd && adr<ubd); 1953753Sroot } 1963753Sroot 1973753Sroot longseek(f, a) 1983753Sroot L_INT a; 1993753Sroot { 2003753Sroot return(lseek(f,a,0) != -1); 2013753Sroot } 202