|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "head.h"
9:
10: MSG BADMAG;
11:
12: INT wtflag;
13: INT fcor;
14: INT fsym;
15: L_INT maxfile;
16: L_INT maxstor;
17: L_INT txtsiz;
18: L_INT datsiz;
19: L_INT datbas;
20: L_INT stksiz;
21: STRING errflg;
22: INT magic;
23: L_INT symbas;
24: L_INT symnum;
25: L_INT entrypt;
26:
27: INT argcount;
28: INT signo;
29: struct user u;
30:
31: STRING symfil = "a.out";
32: STRING corfil = "core";
33:
34: #define TXTHDRSIZ (sizeof(txthdr))
35:
36: #ifndef EDDT
37: readl(f,p,n) int f,n; long * p;{
38: #ifndef vax
39: int t=0;
40: do {t += read(f,&(p->loword),2); t += read(f,&(p->hiword),2); p++;} while (--n);
41: return(t);
42: #else
43: return(read(f,p,n*sizeof(long)));
44: #endif
45: }
46: #endif
47:
48: setsym()
49: {
50: #ifndef EDDT
51: TXTHDR txthdr;
52:
53: fsym=getfile(symfil,1);
54: txtmap.ufd=fsym;
55: IF readl(fsym, txthdr, TXTHDRSIZ/sizeof(txthdr[0]))==TXTHDRSIZ
56: THEN magic=txthdr[0];
57: IF magic!=0410 ANDF magic!=0407 ANDF magic!=0412 ANDF magic!=0413
58: THEN magic=0;
59: ELSE
60: symnum=txthdr[4]/SYMTABSIZ;
61: txtsiz=txthdr[1];
62: datsiz=txthdr[2];
63: symbas=txtsiz+datsiz;
64: txtmap.f1=txtmap.f2=TXTHDRSIZ;
65: switch (magic) {
66:
67: case 0412:
68: txtmap.f1=txtmap.f2=(CLSIZE*NBPG);
69: case 0407:
70: txtmap.b1=0;
71: txtmap.e1=symbas;
72: txtmap.b2=datbas=0;
73: txtmap.e2=symbas;
74: break;
75:
76: case 0413:
77: txtmap.f1=txtmap.f2=(CLSIZE*NBPG);
78: case 0410:
79: txtmap.b1=0;
80: txtmap.e1=txtsiz;
81: txtmap.b2=datbas=round(txtsiz,TXTRNDSIZ);
82: txtmap.e2=datbas+datsiz;
83: txtmap.f2+=txtmap.e1;
84: }
85: entrypt=txthdr[5];
86: symbas += txthdr[6]+txthdr[7];
87: symbas += magic==0412||magic==0413 ? (CLSIZE*NBPG) : TXTHDRSIZ;
88: ststart = symbas;
89: /* set up symvec */
90: FI
91: FI
92: IF magic==0 THEN txtmap.e1=maxfile; FI
93: #endif
94: }
95:
96: setcor()
97: {
98: #ifndef EDDT
99: fcor=getfile(corfil,2);
100: datmap.ufd=fcor;
101: IF read(fcor, &u, ctob(UPAGES))==ctob(UPAGES)
102: #ifdef VAX135
103: ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x70000000L
104: #else
105: ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x80000000L
106: #endif
107: ANDF (u.u_pcb.pcb_usp & 0xF0000000L)==0x70000000L
108: THEN
109: signo = u.u_arg[0]&017;
110: txtsiz = ctob(u.u_tsize);
111: datsiz = ctob(u.u_dsize);
112: stksiz = ctob(u.u_ssize);
113: datmap.b1 = datbas = (magic==0410?round(txtsiz,TXTRNDSIZ):0);
114: if (magic == 0413)
115: datmap.b1 = datbas = txtsiz;
116: datmap.e1=(magic==0407?txtsiz:datmap.b1)+datsiz;
117: #ifdef STD
118: datmap.f1 = ctob(USIZE);
119: #else
120: datmap.f1 = ctob(UPAGES);
121: #endif
122: datmap.b2 = maxstor-stksiz;
123: datmap.e2 = maxstor;
124: #ifdef STD
125: datmap.f2 = ctob(USIZE)+(magic==0410?datsiz:datmap.e1);
126: #else
127: datmap.f2 = ctob(UPAGES)+((magic==0410 || magic == 0413)
128: ? datsiz : datmap.e1);
129: #endif
130: signo = *(ADDR *)(((ADDR)&u)+ctob(UPAGES)-4*sizeof(int));
131: IF magic ANDF magic!=u.u_exdata.ux_mag
132: THEN printf("%s\n",BADMAG);
133: FI
134: ELSE datmap.e1 = maxfile;
135: FI
136: #endif
137: }
138:
139: #ifndef EDDT
140: create(f)
141: STRING f;
142: { int fd;
143: IF (fd=creat(f,0644))>=0
144: THEN close(fd); return(open(f,wtflag));
145: ELSE return(-1);
146: FI
147: }
148:
149: getfile(filnam,cnt)
150: STRING filnam;
151: {
152: REG INT fsym;
153:
154: IF !eqstr("-",filnam)
155: THEN fsym=open(filnam,wtflag);
156: IF fsym<0 ANDF argcount>cnt
157: THEN IF wtflag
158: THEN fsym=create(filnam);
159: FI
160: IF fsym<0
161: THEN printf("cannot open `%s'\n", filnam);
162: FI
163: FI
164: ELSE fsym = -1;
165: FI
166: return(fsym);
167: }
168: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.