xref: /csrg-svn/old/sdb/setup.c (revision 1350)
1*1350Sbill static	char sccsid[] = "@(#)setup.c 4.1 10/09/80";
2*1350Sbill #
3*1350Sbill /*
4*1350Sbill  *
5*1350Sbill  *	UNIX debugger
6*1350Sbill  *
7*1350Sbill  */
8*1350Sbill 
9*1350Sbill #include "head.h"
10*1350Sbill 
11*1350Sbill MSG		BADMAG;
12*1350Sbill 
13*1350Sbill INT		wtflag;
14*1350Sbill INT		fcor;
15*1350Sbill INT		fsym;
16*1350Sbill L_INT		maxfile;
17*1350Sbill L_INT		maxstor;
18*1350Sbill L_INT		txtsiz;
19*1350Sbill L_INT		datsiz;
20*1350Sbill L_INT		datbas;
21*1350Sbill L_INT		stksiz;
22*1350Sbill STRING		errflg;
23*1350Sbill INT		magic;
24*1350Sbill L_INT		symbas;
25*1350Sbill L_INT		symnum;
26*1350Sbill L_INT		entrypt;
27*1350Sbill 
28*1350Sbill INT		argcount;
29*1350Sbill INT		signo;
30*1350Sbill struct user u;
31*1350Sbill 
32*1350Sbill #define TXTHDRSIZ	(sizeof(txthdr))
33*1350Sbill 
34*1350Sbill #ifndef EDDT
35*1350Sbill readl(f,p,n) int f,n; long * p;{
36*1350Sbill #ifndef vax
37*1350Sbill 	int t=0;
38*1350Sbill 	do {t += read(f,&(p->loword),2); t += read(f,&(p->hiword),2); p++;} while (--n);
39*1350Sbill 	return(t);
40*1350Sbill #else
41*1350Sbill 	return(read(f,p,n*sizeof(long)));
42*1350Sbill #endif
43*1350Sbill }
44*1350Sbill #endif
45*1350Sbill 
46*1350Sbill setsym()
47*1350Sbill {
48*1350Sbill #ifndef EDDT
49*1350Sbill 	TXTHDR		txthdr;
50*1350Sbill 
51*1350Sbill 	fsym=getfile(symfil,1);
52*1350Sbill 	txtmap.ufd=fsym;
53*1350Sbill 	IF readl(fsym, txthdr, TXTHDRSIZ/sizeof(txthdr[0]))==TXTHDRSIZ
54*1350Sbill 	THEN	magic=txthdr[0];
55*1350Sbill 		IF magic!=0410 ANDF magic!=0407 ANDF magic!=0412 ANDF magic!=0413
56*1350Sbill 		THEN	magic=0;
57*1350Sbill 		ELSE
58*1350Sbill 			symnum=txthdr[4]/SYMTABSIZ;
59*1350Sbill 			txtsiz=txthdr[1];
60*1350Sbill 			datsiz=txthdr[2];
61*1350Sbill 			symbas=txtsiz+datsiz;
62*1350Sbill 			txtmap.f1=txtmap.f2=TXTHDRSIZ;
63*1350Sbill 			switch (magic) {
64*1350Sbill 
65*1350Sbill 			case 0412:
66*1350Sbill 				txtmap.f1=txtmap.f2=(CLSIZE*NBPG);
67*1350Sbill 			case 0407:
68*1350Sbill 				txtmap.b1=0;
69*1350Sbill 				txtmap.e1=symbas;
70*1350Sbill 				txtmap.b2=datbas=0;
71*1350Sbill 				txtmap.e2=symbas;
72*1350Sbill 				break;
73*1350Sbill 
74*1350Sbill 			case 0413:
75*1350Sbill 				txtmap.f1=txtmap.f2=(CLSIZE*NBPG);
76*1350Sbill 			case 0410:
77*1350Sbill 				txtmap.b1=0;
78*1350Sbill 				txtmap.e1=txtsiz;
79*1350Sbill 				txtmap.b2=datbas=round(txtsiz,TXTRNDSIZ);
80*1350Sbill 				txtmap.e2=datbas+datsiz;
81*1350Sbill 				txtmap.f2+=txtmap.e1;
82*1350Sbill 			}
83*1350Sbill 			entrypt=txthdr[5];
84*1350Sbill 			symbas += txthdr[6]+txthdr[7];
85*1350Sbill 			symbas += magic==0412||magic==0413 ? (CLSIZE*NBPG) : TXTHDRSIZ;
86*1350Sbill 			ststart = symbas;
87*1350Sbill #ifdef FLEXNAMES
88*1350Sbill 			gstart = ststart+txthdr[4];
89*1350Sbill #endif
90*1350Sbill 			/* set up symvec */
91*1350Sbill 		FI
92*1350Sbill 	FI
93*1350Sbill 	IF magic==0 THEN txtmap.e1=maxfile; FI
94*1350Sbill #endif
95*1350Sbill }
96*1350Sbill 
97*1350Sbill setcor()
98*1350Sbill {
99*1350Sbill 	fcor=getfile(corfil,2);
100*1350Sbill 	datmap.ufd=fcor;
101*1350Sbill 	IF read(fcor, &u, ctob(UPAGES))==ctob(UPAGES)
102*1350Sbill #ifndef STD
103*1350Sbill 	   ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x70000000L
104*1350Sbill #else
105*1350Sbill 	   ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x80000000L
106*1350Sbill #endif
107*1350Sbill 	   ANDF (u.u_pcb.pcb_usp & 0xF0000000L)==0x70000000L
108*1350Sbill 	THEN
109*1350Sbill 		signo = u.u_arg[0]&017;
110*1350Sbill 		txtsiz = ctob(u.u_tsize);
111*1350Sbill 		datsiz = ctob(u.u_dsize);
112*1350Sbill 		stksiz = ctob(u.u_ssize);
113*1350Sbill 		datmap.b1 = datbas = (magic==0410?round(txtsiz,TXTRNDSIZ):0);
114*1350Sbill 		if (magic == 0413)
115*1350Sbill 			datmap.b1 = datbas = txtsiz;
116*1350Sbill 		datmap.e1=(magic==0407?txtsiz:datmap.b1)+datsiz;
117*1350Sbill #ifdef STD
118*1350Sbill 		datmap.f1 = ctob(USIZE);
119*1350Sbill #else
120*1350Sbill 		datmap.f1 = ctob(UPAGES);
121*1350Sbill #endif
122*1350Sbill 		datmap.b2 = maxstor-stksiz;
123*1350Sbill 		datmap.e2 = maxstor;
124*1350Sbill #ifdef STD
125*1350Sbill 		datmap.f2 = ctob(USIZE)+(magic==0410?datsiz:datmap.e1);
126*1350Sbill #else
127*1350Sbill 		datmap.f2 = ctob(UPAGES)+((magic==0410 || magic == 0413)
128*1350Sbill 					     ? datsiz : datmap.e1);
129*1350Sbill #endif
130*1350Sbill 		signo = *(ADDR *)(((ADDR)&u)+ctob(UPAGES)-4*sizeof(int));
131*1350Sbill 		IF magic ANDF magic!=u.u_exdata.ux_mag
132*1350Sbill 		THEN	printf("%s\n",BADMAG);
133*1350Sbill 		FI
134*1350Sbill 	ELSE	datmap.e1 = maxfile;
135*1350Sbill 	FI
136*1350Sbill }
137*1350Sbill 
138*1350Sbill create(f)
139*1350Sbill STRING	f;
140*1350Sbill {	int fd;
141*1350Sbill 	IF (fd=creat(f,0644))>=0
142*1350Sbill 	THEN close(fd); return(open(f,wtflag));
143*1350Sbill 	ELSE return(-1);
144*1350Sbill 	FI
145*1350Sbill }
146*1350Sbill 
147*1350Sbill getfile(filnam,cnt)
148*1350Sbill STRING	filnam;
149*1350Sbill {
150*1350Sbill 	REG INT		fsym;
151*1350Sbill 
152*1350Sbill 	IF !eqstr("-",filnam)
153*1350Sbill 	THEN	fsym=open(filnam,wtflag);
154*1350Sbill 		IF fsym<0 ANDF argcount>cnt
155*1350Sbill 		THEN	IF wtflag
156*1350Sbill 			THEN	fsym=create(filnam);
157*1350Sbill 			FI
158*1350Sbill 			IF fsym<0
159*1350Sbill 			THEN printf("cannot open `%s'\n", filnam);
160*1350Sbill 			FI
161*1350Sbill 		FI
162*1350Sbill 	ELSE	fsym = -1;
163*1350Sbill 	FI
164*1350Sbill 	return(fsym);
165*1350Sbill }
166