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