Commit | Line | Data |
---|---|---|
8ac44b2f HK |
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 | readl(f,p,n) int f,n; long * p;{ | |
37 | #ifndef vax | |
38 | int t=0; | |
39 | do {t += read(f,&(p->loword),2); t += read(f,&(p->hiword),2); p++;} while (--n); | |
40 | return(t); | |
41 | #else | |
42 | return(read(f,p,n*sizeof(long))); | |
43 | #endif | |
44 | } | |
45 | ||
46 | setsym() | |
47 | { | |
48 | TXTHDR txthdr; | |
49 | ||
50 | fsym=getfile(symfil,1); | |
51 | txtmap.ufd=fsym; | |
52 | IF readl(fsym, txthdr, TXTHDRSIZ/sizeof(txthdr[0]))==TXTHDRSIZ | |
53 | THEN magic=txthdr[0]; | |
54 | IF magic!=0411 ANDF magic!=0410 ANDF magic!=0407 ANDF magic!=0405 | |
55 | THEN magic=0; | |
56 | ELSE symnum=txthdr[4]/SYMTABSIZ; | |
57 | txtsiz=txthdr[1]; | |
58 | datsiz=txthdr[2]; | |
59 | symbas=txtsiz+datsiz; | |
60 | #ifndef VAX135 | |
61 | txtmap.b1=0; | |
62 | txtmap.e1=(magic==0407?symbas:txtsiz); | |
63 | txtmap.f1 = TXTHDRSIZ; | |
64 | txtmap.b2=datbas=(magic==0410?round(txtsiz,TXTRNDSIZ):0); | |
65 | #else | |
66 | txtmap.b1=(magic==0411? 0x200:0); | |
67 | txtmap.e1=(magic==0407? symbas: | |
68 | magic==0411? txtsiz+TXTHDRSIZ: | |
69 | txtsiz); | |
70 | txtmap.f1=(magic==0411? 0x200:TXTHDRSIZ); | |
71 | txtmap.b2=datbas=(magic==0410? round(txtsiz,TXTRNDSIZ): | |
72 | magic==0411? txtmap.e1: | |
73 | 0); | |
74 | #endif | |
75 | txtmap.e2=txtmap.b2+(magic==0407?symbas:datsiz); | |
76 | #ifndef VAX135 | |
77 | txtmap.f2 = TXTHDRSIZ+(magic==0407?0:txtmap.e1); | |
78 | #else | |
79 | txtmap.f2=(magic==0407? TXTHDRSIZ: | |
80 | magic==0411? txtmap.e1: | |
81 | TXTHDRSIZ+txtmap.e1); | |
82 | #endif | |
83 | ||
84 | entrypt=txthdr[5]; | |
85 | symbas += txthdr[6]+txthdr[7]; | |
86 | symbas += TXTHDRSIZ; | |
87 | ststart = symbas; | |
88 | ||
89 | /* set up symvec */ | |
90 | FI | |
91 | FI | |
92 | IF magic==0 THEN txtmap.e1=maxfile; FI | |
93 | } | |
94 | ||
95 | setcor() | |
96 | { | |
97 | fcor=getfile(corfil,2); | |
98 | datmap.ufd=fcor; | |
99 | IF read(fcor, &u, ctob(UPAGES))==ctob(UPAGES) | |
100 | #ifdef VAX135 | |
101 | ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x70000000L | |
102 | #else | |
103 | ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x80000000L | |
104 | #endif | |
105 | ANDF (u.u_pcb.pcb_usp & 0xF0000000L)==0x70000000L | |
106 | THEN | |
107 | signo = u.u_arg[0]&017; | |
108 | txtsiz = ctob(u.u_tsize); | |
109 | datsiz = ctob(u.u_dsize); | |
110 | stksiz = ctob(u.u_ssize); | |
111 | #ifndef VAX135 | |
112 | datmap.b1 = datbas = (magic==0410?round(txtsiz,TXTRNDSIZ):0); | |
113 | #else | |
114 | datmap.b1=datbas= | |
115 | ((magic==0410 || magic==0411)? round(txtsiz,TXTRNDSIZ):0); | |
116 | #endif | |
117 | datmap.e1=(magic==0407?txtsiz:datmap.b1)+datsiz; | |
118 | #ifdef STD | |
119 | datmap.f1 = ctob(USIZE); | |
120 | #else | |
121 | datmap.f1 = ctob(UPAGES); | |
122 | #endif | |
123 | datmap.b2 = maxstor-stksiz; | |
124 | datmap.e2 = maxstor; | |
125 | #ifdef STD | |
126 | datmap.f2 = ctob(USIZE)+(magic==0410?datsiz:datmap.e1); | |
127 | #else | |
128 | #ifndef VAX135 | |
129 | datmap.f2 = ctob(UPAGES)+(magic==0410?datsiz:datmap.e1); | |
130 | #else | |
131 | datmap.f2 = ctob(UPAGES)+ | |
132 | ((magic==0410 || magic==0411)?datsiz:datmap.e1); | |
133 | #endif | |
134 | #endif | |
135 | signo = *(ADDR *)(((ADDR)&u)+ctob(UPAGES)-4*4); | |
136 | IF magic ANDF magic!=u.u_exdata.ux_mag | |
137 | THEN printf("%s\n",BADMAG); | |
138 | FI | |
139 | ELSE datmap.e1 = maxfile; | |
140 | FI | |
141 | } | |
142 | ||
143 | create(f) | |
144 | STRING f; | |
145 | { int fd; | |
146 | IF (fd=creat(f,0644))>=0 | |
147 | THEN close(fd); return(open(f,wtflag)); | |
148 | ELSE return(-1); | |
149 | FI | |
150 | } | |
151 | ||
152 | getfile(filnam,cnt) | |
153 | STRING filnam; | |
154 | { | |
155 | REG INT fsym; | |
156 | ||
157 | IF !eqstr("-",filnam) | |
158 | THEN fsym=open(filnam,wtflag); | |
159 | IF fsym<0 ANDF argcount>cnt | |
160 | THEN IF wtflag | |
161 | THEN fsym=create(filnam); | |
162 | FI | |
163 | IF fsym<0 | |
164 | THEN printf("cannot open `%s'\n", filnam); | |
165 | FI | |
166 | FI | |
167 | ELSE fsym = -1; | |
168 | FI | |
169 | return(fsym); | |
170 | } |