Commit | Line | Data |
---|---|---|
c403f3cc BJ |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | #include <pagsiz.h> | |
10 | SCCSID(@(#)setup.c 2.5); | |
11 | ||
12 | ||
13 | MSG BADNAM; | |
14 | MSG BADMAG; | |
15 | ||
16 | MAP txtmap; | |
17 | MAP datmap; | |
18 | SYMSLAVE *symvec; | |
19 | INT wtflag; | |
20 | INT fcor; | |
21 | INT fsym; | |
22 | L_INT maxfile; | |
23 | L_INT maxstor; | |
24 | L_INT txtsiz; | |
25 | L_INT datsiz; | |
26 | L_INT datbas; | |
27 | L_INT stksiz; | |
28 | STRING errflg; | |
29 | INT magic; | |
30 | L_INT symbas; | |
31 | L_INT symnum; | |
32 | L_INT entrypt; | |
33 | ||
34 | INT argcount; | |
35 | INT signo; | |
36 | struct user u; | |
37 | ||
38 | STRING symfil = "a.out"; | |
39 | STRING corfil = "core"; | |
40 | ||
41 | #define TXTHDRSIZ (sizeof(txthdr)) | |
42 | ||
43 | #ifndef EDDT | |
44 | readl(f,p,n) int f,n; long * p;{ | |
45 | #ifndef vax | |
46 | int t=0; | |
47 | do {t += read(f,&(p->loword),2); t += read(f,&(p->hiword),2); p++;} while (--n); | |
48 | return(t); | |
49 | #else | |
50 | return(read(f,p,n*sizeof(long))); | |
51 | #endif | |
52 | } | |
53 | #endif | |
54 | ||
55 | setsym() | |
56 | { | |
57 | #ifndef EDDT | |
58 | INT relflg; | |
59 | INT symval, symflg; | |
60 | SYMSLAVE *symptr; | |
61 | SYMPTR symp; | |
62 | TXTHDR txthdr; | |
63 | ||
64 | fsym=getfile(symfil,1); | |
65 | txtmap.ufd=fsym; | |
66 | IF readl(fsym, txthdr, TXTHDRSIZ/sizeof(txthdr[0]))==TXTHDRSIZ | |
67 | THEN magic=txthdr[0]; | |
68 | IF magic!=0410 ANDF magic!=0407 ANDF magic!=0412 ANDF magic!=0413 | |
69 | THEN magic=0; | |
70 | ELSE | |
71 | symnum=txthdr[4]/SYMTABSIZ; | |
72 | txtsiz=txthdr[1]; | |
73 | datsiz=txthdr[2]; | |
74 | symbas=txtsiz+datsiz; | |
75 | txtmap.f1=txtmap.f2=TXTHDRSIZ; | |
76 | switch (magic) { | |
77 | ||
78 | case 0412: | |
79 | txtmap.f1=txtmap.f2=PAGSIZ; | |
80 | case 0407: | |
81 | txtmap.b1=0; | |
82 | txtmap.e1=symbas; | |
83 | txtmap.b2=datbas=0; | |
84 | txtmap.e2=symbas; | |
85 | break; | |
86 | ||
87 | case 0413: | |
88 | txtmap.f1=txtmap.f2=PAGSIZ; | |
89 | case 0410: | |
90 | txtmap.b1=0; | |
91 | txtmap.e1=txtsiz; | |
92 | txtmap.b2=datbas=round(txtsiz,TXTRNDSIZ); | |
93 | txtmap.e2=datbas+datsiz; | |
94 | txtmap.f2+=txtmap.e1; | |
95 | } | |
96 | entrypt=txthdr[5]; | |
97 | symbas += txthdr[6]+txthdr[7]; | |
98 | symbas += magic==0412||magic==0413 ? PAGSIZ : TXTHDRSIZ; | |
99 | ||
100 | /* set up symvec */ | |
101 | symvec=sbrk(shorten((1+symnum))*sizeof (SYMSLAVE)); | |
102 | IF (symptr=symvec)==-1 | |
103 | THEN printf("%s\n",BADNAM); | |
104 | symptr=symvec=sbrk(sizeof (SYMSLAVE)); | |
105 | ELSE symset(); | |
106 | WHILE (symp=symget()) ANDF errflg==0 | |
107 | DO symflg=symp->symf; | |
108 | symptr->valslave=symp->symv; | |
109 | symptr->typslave=SYMTYPE(symflg); | |
110 | #define STABTYPES 0340 /* from <a.out.h> */ | |
111 | IF (symflg & STABTYPES) != 0 | |
112 | THEN | |
113 | symptr->typslave = XSYM; | |
114 | FI | |
115 | symptr++; | |
116 | OD | |
117 | FI | |
118 | symptr->typslave=ESYM; | |
119 | FI | |
120 | FI | |
121 | IF magic==0 THEN txtmap.e1=maxfile; FI | |
122 | #endif | |
123 | } | |
124 | ||
125 | setcor() | |
126 | { | |
127 | #ifndef EDDT | |
128 | fcor=getfile(corfil,2); | |
129 | datmap.ufd=fcor; | |
130 | IF read(fcor, &u, ctob(UPAGES))==ctob(UPAGES) | |
131 | ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x80000000L | |
132 | ANDF (u.u_pcb.pcb_usp & 0xF0000000L)==0x70000000L | |
133 | THEN signo = u.u_arg[0]&017; | |
134 | txtsiz = ctob(u.u_tsize); | |
135 | datsiz = ctob(u.u_dsize); | |
136 | stksiz = ctob(u.u_ssize); | |
137 | datmap.b1 = datbas = (magic==0410?round(txtsiz,TXTRNDSIZ):0); | |
138 | if (magic==0413) | |
139 | datmap.b1 = datbas = txtsiz; | |
140 | datmap.e1=(magic==0407?txtsiz:datmap.b1)+datsiz; | |
141 | datmap.f1 = ctob(UPAGES); | |
142 | datmap.b2 = maxstor-stksiz; | |
143 | datmap.e2 = maxstor; | |
144 | datmap.f2 = ctob(UPAGES)+((magic==0410 || magic == 0413) | |
145 | ? datsiz : datmap.e1); | |
146 | signo = *(ADDR *)(((ADDR)&u)+ctob(UPAGES)-4*sizeof(int)); | |
147 | IF magic ANDF magic!=u.u_exdata.ux_mag | |
148 | THEN printf("%s , object = %o, core = %o\n" | |
149 | ,BADMAG | |
150 | ,magic | |
151 | ,u.u_exdata.ux_mag); | |
152 | FI | |
153 | ELSE datmap.e1 = maxfile; | |
154 | FI | |
155 | #endif | |
156 | } | |
157 | ||
158 | #ifndef EDDT | |
159 | create(f) | |
160 | STRING f; | |
161 | { int fd; | |
162 | IF (fd=creat(f,0644))>=0 | |
163 | THEN close(fd); return(open(f,wtflag)); | |
164 | ELSE return(-1); | |
165 | FI | |
166 | } | |
167 | ||
168 | getfile(filnam,cnt) | |
169 | STRING filnam; | |
170 | { | |
171 | REG INT fsym; | |
172 | ||
173 | IF !eqstr("-",filnam) | |
174 | THEN fsym=open(filnam,wtflag); | |
175 | IF fsym<0 ANDF argcount>cnt | |
176 | THEN IF wtflag | |
177 | THEN fsym=create(filnam); | |
178 | FI | |
179 | IF fsym<0 | |
180 | THEN printf("cannot open `%s'\n", filnam); | |
181 | FI | |
182 | FI | |
183 | ELSE fsym = -1; | |
184 | FI | |
185 | return(fsym); | |
186 | } | |
187 | #endif |