BSD 3 development
[unix-history] / usr / src / cmd / sdb / setup.c
CommitLineData
eca42172
HK
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "head.h"
9
10MSG BADMAG;
11
12INT wtflag;
13INT fcor;
14INT fsym;
15L_INT maxfile;
16L_INT maxstor;
17L_INT txtsiz;
18L_INT datsiz;
19L_INT datbas;
20L_INT stksiz;
21STRING errflg;
22INT magic;
23L_INT symbas;
24L_INT symnum;
25L_INT entrypt;
26
27INT argcount;
28INT signo;
29struct user u;
30
31STRING symfil = "a.out";
32STRING corfil = "core";
33
34#define TXTHDRSIZ (sizeof(txthdr))
35
36#ifndef EDDT
37readl(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
48setsym()
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
96setcor()
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
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