Bell 32V release
[unix-history] / usr / src / cmd / adb / setup.c
CommitLineData
9899b113
TL
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9#include "a.out.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!=0411 ANDF magic!=0410 ANDF magic!=0407 ANDF magic!=0405
69 THEN magic=0;
70 ELSE symnum=txthdr[4]/SYMTABSIZ;
71 txtsiz=txthdr[1];
72 datsiz=txthdr[2];
73 symbas=txtsiz+datsiz;
74 txtmap.b1=0;
75 txtmap.e1=(magic==0407?symbas:txtsiz);
76 txtmap.f1 = TXTHDRSIZ;
77 txtmap.b2=datbas=(magic==0410?round(txtsiz,TXTRNDSIZ):0);
78 txtmap.e2=txtmap.b2+(magic==0407?symbas:datsiz);
79 txtmap.f2 = TXTHDRSIZ+(magic==0407?0:txtmap.e1);
80 entrypt=txthdr[5];
81 /* relflg=txthdr[7];
82 /* IF relflg!=1 THEN symbas =<< 1; FI
83 */
84 symbas += txthdr[6]+txthdr[7];
85 symbas += TXTHDRSIZ;
86
87 /* set up symvec */
88 symvec=sbrk(shorten((1+symnum))*sizeof (SYMSLAVE));
89 IF (symptr=symvec)==-1
90 THEN printf("%s\n",BADNAM);
91 symptr=symvec=sbrk(sizeof (SYMSLAVE));
92 ELSE symset();
93 WHILE (symp=symget()) ANDF errflg==0
94 DO
95 symflg=symp->symf;
96 symptr->valslave=symp->symv;
97 symptr->typslave=SYMTYPE(symflg);
98 IF (symflg & STABTYPES) != 0
99 THEN
100 symptr->typslave=XSYM;
101 FI
102 symptr++;
103 OD
104 FI
105 symptr->typslave=ESYM;
106 FI
107 FI
108 IF magic==0 THEN txtmap.e1=maxfile; FI
109#endif
110}
111
112setcor()
113{
114#ifndef EDDT
115 fcor=getfile(corfil,2);
116 datmap.ufd=fcor;
117 IF read(fcor, &u, ctob(4))==ctob(4)
118 ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x80000000L
119 ANDF (u.u_pcb.pcb_usp & 0xF0000000L)==0x70000000L
120 THEN signo = u.u_arg[0]&017;
121 txtsiz = ctob(u.u_tsize);
122 datsiz = ctob(u.u_dsize);
123 stksiz = ctob(u.u_ssize);
124 datmap.b1 = datbas = (magic==0410?round(txtsiz,TXTRNDSIZ):0);
125 datmap.e1=(magic==0407?txtsiz:datmap.b1)+datsiz;
126 datmap.f1 = ctob(USIZE);
127 datmap.b2 = maxstor-stksiz;
128 datmap.e2 = maxstor;
129 datmap.f2 = ctob(USIZE)+(magic==0410?datsiz:datmap.e1);
130 signo = *(ADDR *)(((ADDR)&u)+ctob(4)-4*4);
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
140create(f)
141STRING 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
149getfile(filnam,cnt)
150STRING 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