BSD 3 development
[unix-history] / usr / src / cmd / adb / setup.c.512
CommitLineData
c403f3cc
BJ
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9#include <pagsiz.h>
10SCCSID(@(#)setup.c 2.5);
11
12
13MSG BADNAM;
14MSG BADMAG;
15
16MAP txtmap;
17MAP datmap;
18SYMSLAVE *symvec;
19INT wtflag;
20INT fcor;
21INT fsym;
22L_INT maxfile;
23L_INT maxstor;
24L_INT txtsiz;
25L_INT datsiz;
26L_INT datbas;
27L_INT stksiz;
28STRING errflg;
29INT magic;
30L_INT symbas;
31L_INT symnum;
32L_INT entrypt;
33
34INT argcount;
35INT signo;
36struct user u;
37
38STRING symfil = "a.out";
39STRING corfil = "core";
40
41#define TXTHDRSIZ (sizeof(txthdr))
42
43#ifndef EDDT
44readl(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
55setsym()
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
125setcor()
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
159create(f)
160STRING 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
168getfile(filnam,cnt)
169STRING 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