# /* * * UNIX debugger * */ #include "head.h" MSG BADMAG; INT wtflag; INT fcor; INT fsym; L_INT maxfile; L_INT maxstor; L_INT txtsiz; L_INT datsiz; L_INT datbas; L_INT stksiz; STRING errflg; INT magic; L_INT symbas; L_INT symnum; L_INT entrypt; INT argcount; INT signo; struct user u; STRING symfil = "a.out"; STRING corfil = "core"; #define TXTHDRSIZ (sizeof(txthdr)) readl(f,p,n) int f,n; long * p;{ #ifndef vax int t=0; do {t += read(f,&(p->loword),2); t += read(f,&(p->hiword),2); p++;} while (--n); return(t); #else return(read(f,p,n*sizeof(long))); #endif } setsym() { TXTHDR txthdr; fsym=getfile(symfil,1); txtmap.ufd=fsym; IF readl(fsym, txthdr, TXTHDRSIZ/sizeof(txthdr[0]))==TXTHDRSIZ THEN magic=txthdr[0]; IF magic!=0411 ANDF magic!=0410 ANDF magic!=0407 ANDF magic!=0405 THEN magic=0; ELSE symnum=txthdr[4]/SYMTABSIZ; txtsiz=txthdr[1]; datsiz=txthdr[2]; symbas=txtsiz+datsiz; #ifndef VAX135 txtmap.b1=0; txtmap.e1=(magic==0407?symbas:txtsiz); txtmap.f1 = TXTHDRSIZ; txtmap.b2=datbas=(magic==0410?round(txtsiz,TXTRNDSIZ):0); #else txtmap.b1=(magic==0411? 0x200:0); txtmap.e1=(magic==0407? symbas: magic==0411? txtsiz+TXTHDRSIZ: txtsiz); txtmap.f1=(magic==0411? 0x200:TXTHDRSIZ); txtmap.b2=datbas=(magic==0410? round(txtsiz,TXTRNDSIZ): magic==0411? txtmap.e1: 0); #endif txtmap.e2=txtmap.b2+(magic==0407?symbas:datsiz); #ifndef VAX135 txtmap.f2 = TXTHDRSIZ+(magic==0407?0:txtmap.e1); #else txtmap.f2=(magic==0407? TXTHDRSIZ: magic==0411? txtmap.e1: TXTHDRSIZ+txtmap.e1); #endif entrypt=txthdr[5]; symbas += txthdr[6]+txthdr[7]; symbas += TXTHDRSIZ; ststart = symbas; /* set up symvec */ FI FI IF magic==0 THEN txtmap.e1=maxfile; FI } setcor() { fcor=getfile(corfil,2); datmap.ufd=fcor; IF read(fcor, &u, ctob(UPAGES))==ctob(UPAGES) #ifdef VAX135 ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x70000000L #else ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x80000000L #endif ANDF (u.u_pcb.pcb_usp & 0xF0000000L)==0x70000000L THEN signo = u.u_arg[0]&017; txtsiz = ctob(u.u_tsize); datsiz = ctob(u.u_dsize); stksiz = ctob(u.u_ssize); #ifndef VAX135 datmap.b1 = datbas = (magic==0410?round(txtsiz,TXTRNDSIZ):0); #else datmap.b1=datbas= ((magic==0410 || magic==0411)? round(txtsiz,TXTRNDSIZ):0); #endif datmap.e1=(magic==0407?txtsiz:datmap.b1)+datsiz; #ifdef STD datmap.f1 = ctob(USIZE); #else datmap.f1 = ctob(UPAGES); #endif datmap.b2 = maxstor-stksiz; datmap.e2 = maxstor; #ifdef STD datmap.f2 = ctob(USIZE)+(magic==0410?datsiz:datmap.e1); #else #ifndef VAX135 datmap.f2 = ctob(UPAGES)+(magic==0410?datsiz:datmap.e1); #else datmap.f2 = ctob(UPAGES)+ ((magic==0410 || magic==0411)?datsiz:datmap.e1); #endif #endif signo = *(ADDR *)(((ADDR)&u)+ctob(UPAGES)-4*4); IF magic ANDF magic!=u.u_exdata.ux_mag THEN printf("%s\n",BADMAG); FI ELSE datmap.e1 = maxfile; FI } create(f) STRING f; { int fd; IF (fd=creat(f,0644))>=0 THEN close(fd); return(open(f,wtflag)); ELSE return(-1); FI } getfile(filnam,cnt) STRING filnam; { REG INT fsym; IF !eqstr("-",filnam) THEN fsym=open(filnam,wtflag); IF fsym<0 ANDF argcount>cnt THEN IF wtflag THEN fsym=create(filnam); FI IF fsym<0 THEN printf("cannot open `%s'\n", filnam); FI FI ELSE fsym = -1; FI return(fsym); }