Bell 32V development
[unix-history] / usr / src / cmd / sdb / setup.c
CommitLineData
0a9588ea
TL
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "head.h"
9
10
11MSG BADMAG;
12
13INT wtflag;
14INT fcor;
15INT fsym;
16L_INT maxfile;
17L_INT maxstor;
18L_INT txtsiz;
19L_INT datsiz;
20L_INT datbas;
21L_INT stksiz;
22STRING errflg;
23INT magic;
24L_INT symbas;
25L_INT symnum;
26L_INT entrypt;
27
28INT argcount;
29INT signo;
30struct user u;
31
32STRING symfil = "a.out";
33STRING corfil = "core";
34
35#define TXTHDRSIZ (sizeof(txthdr))
36
37#ifndef EDDT
38readl(f,p,n) int f,n; long * p;{
39#ifndef vax
40 int t=0;
41 do {t += read(f,&(p->loword),2); t += read(f,&(p->hiword),2); p++;} while (--n);
42 return(t);
43#else
44 return(read(f,p,n*sizeof(long)));
45#endif
46}
47#endif
48
49setsym()
50{
51#ifndef EDDT
52 TXTHDR txthdr;
53
54 fsym=getfile(symfil,1);
55 txtmap.ufd=fsym;
56 IF readl(fsym, txthdr, TXTHDRSIZ/sizeof(txthdr[0]))==TXTHDRSIZ
57 THEN magic=txthdr[0];
58 IF magic!=0411 ANDF magic!=0410 ANDF magic!=0407 ANDF magic!=0405
59 THEN magic=0;
60 ELSE symnum=txthdr[4]/SYMTABSIZ;
61 txtsiz=txthdr[1];
62 datsiz=txthdr[2];
63 symbas=txtsiz+datsiz;
64 txtmap.b1=0;
65 txtmap.e1=(magic==0407?symbas:txtsiz);
66 txtmap.f1 = TXTHDRSIZ;
67 txtmap.b2=datbas=(magic==0410?round(txtsiz,TXTRNDSIZ):0);
68 txtmap.e2=txtmap.b2+(magic==0407?symbas:datsiz);
69 txtmap.f2 = TXTHDRSIZ+(magic==0407?0:txtmap.e1);
70 entrypt=txthdr[5];
71 symbas += txthdr[6]+txthdr[7];
72 symbas += TXTHDRSIZ;
73 ststart = symbas;
74
75 /* set up symvec */
76 FI
77 FI
78 IF magic==0 THEN txtmap.e1=maxfile; FI
79#endif
80}
81
82setcor()
83{
84#ifndef EDDT
85 fcor=getfile(corfil,2);
86 datmap.ufd=fcor;
87 IF read(fcor, &u, ctob(4))==ctob(4)
88 ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x80000000L
89 ANDF (u.u_pcb.pcb_usp & 0xF0000000L)==0x70000000L
90 THEN
91 signo = u.u_arg[0]&017;
92 txtsiz = ctob(u.u_tsize);
93 datsiz = ctob(u.u_dsize);
94 stksiz = ctob(u.u_ssize);
95 datmap.b1 = datbas = (magic==0410?round(txtsiz,TXTRNDSIZ):0);
96 datmap.e1=(magic==0407?txtsiz:datmap.b1)+datsiz;
97 datmap.f1 = ctob(USIZE);
98 datmap.b2 = maxstor-stksiz;
99 datmap.e2 = maxstor;
100 datmap.f2 = ctob(USIZE)+(magic==0410?datsiz:datmap.e1);
101 signo = *(ADDR *)(((ADDR)&u)+ctob(4)-4*4);
102 IF magic ANDF magic!=u.u_exdata.ux_mag
103 THEN printf("%s\n",BADMAG);
104 FI
105 ELSE datmap.e1 = maxfile;
106 FI
107#endif
108}
109
110#ifndef EDDT
111create(f)
112STRING f;
113{ int fd;
114 IF (fd=creat(f,0644))>=0
115 THEN close(fd); return(open(f,wtflag));
116 ELSE return(-1);
117 FI
118}
119
120getfile(filnam,cnt)
121STRING filnam;
122{
123 REG INT fsym;
124
125 IF !eqstr("-",filnam)
126 THEN fsym=open(filnam,wtflag);
127 IF fsym<0 ANDF argcount>cnt
128 THEN IF wtflag
129 THEN fsym=create(filnam);
130 FI
131 IF fsym<0
132 THEN printf("cannot open `%s'\n", filnam);
133 FI
134 FI
135 ELSE fsym = -1;
136 FI
137 return(fsym);
138}
139#endif