xref: /csrg-svn/old/sdb/setup.c (revision 7776)
1*7776Srrh static	char sccsid[] = "@(#)setup.c 4.3 08/17/82";
21350Sbill #
31350Sbill /*
41350Sbill  *
51350Sbill  *	UNIX debugger
61350Sbill  *
71350Sbill  */
81350Sbill 
91350Sbill #include "head.h"
101350Sbill 
111350Sbill MSG		BADMAG;
121350Sbill 
131350Sbill INT		wtflag;
141350Sbill INT		fcor;
151350Sbill INT		fsym;
161350Sbill L_INT		maxfile;
171350Sbill L_INT		maxstor;
181350Sbill L_INT		txtsiz;
191350Sbill L_INT		datsiz;
201350Sbill L_INT		datbas;
211350Sbill L_INT		stksiz;
221350Sbill STRING		errflg;
231350Sbill INT		magic;
241350Sbill L_INT		symbas;
251350Sbill L_INT		symnum;
261350Sbill L_INT		entrypt;
271350Sbill 
281350Sbill INT		argcount;
291350Sbill INT		signo;
301350Sbill struct user u;
311350Sbill 
321350Sbill #define TXTHDRSIZ	(sizeof(txthdr))
331350Sbill 
341350Sbill #ifndef EDDT
readl(f,p,n)351350Sbill readl(f,p,n) int f,n; long * p;{
361350Sbill #ifndef vax
371350Sbill 	int t=0;
381350Sbill 	do {t += read(f,&(p->loword),2); t += read(f,&(p->hiword),2); p++;} while (--n);
391350Sbill 	return(t);
401350Sbill #else
411350Sbill 	return(read(f,p,n*sizeof(long)));
421350Sbill #endif
431350Sbill }
441350Sbill #endif
451350Sbill 
setsym()461350Sbill setsym()
471350Sbill {
481350Sbill #ifndef EDDT
491350Sbill 	TXTHDR		txthdr;
501350Sbill 
511350Sbill 	fsym=getfile(symfil,1);
521350Sbill 	txtmap.ufd=fsym;
531350Sbill 	IF readl(fsym, txthdr, TXTHDRSIZ/sizeof(txthdr[0]))==TXTHDRSIZ
541350Sbill 	THEN	magic=txthdr[0];
551350Sbill 		IF magic!=0410 ANDF magic!=0407 ANDF magic!=0412 ANDF magic!=0413
561350Sbill 		THEN	magic=0;
571350Sbill 		ELSE
581350Sbill 			symnum=txthdr[4]/SYMTABSIZ;
591350Sbill 			txtsiz=txthdr[1];
601350Sbill 			datsiz=txthdr[2];
611350Sbill 			symbas=txtsiz+datsiz;
621350Sbill 			txtmap.f1=txtmap.f2=TXTHDRSIZ;
631350Sbill 			switch (magic) {
641350Sbill 
651350Sbill 			case 0407:
661350Sbill 				txtmap.b1=0;
673555Swnj 				txtmap.e1=0;
681350Sbill 				txtmap.b2=datbas=0;
691350Sbill 				txtmap.e2=symbas;
701350Sbill 				break;
711350Sbill 
721350Sbill 			case 0413:
731350Sbill 				txtmap.f1=txtmap.f2=(CLSIZE*NBPG);
741350Sbill 			case 0410:
751350Sbill 				txtmap.b1=0;
761350Sbill 				txtmap.e1=txtsiz;
771350Sbill 				txtmap.b2=datbas=round(txtsiz,TXTRNDSIZ);
781350Sbill 				txtmap.e2=datbas+datsiz;
791350Sbill 				txtmap.f2+=txtmap.e1;
801350Sbill 			}
811350Sbill 			entrypt=txthdr[5];
821350Sbill 			symbas += txthdr[6]+txthdr[7];
831350Sbill 			symbas += magic==0412||magic==0413 ? (CLSIZE*NBPG) : TXTHDRSIZ;
841350Sbill 			ststart = symbas;
851350Sbill #ifdef FLEXNAMES
861350Sbill 			gstart = ststart+txthdr[4];
871350Sbill #endif
881350Sbill 			/* set up symvec */
891350Sbill 		FI
901350Sbill 	FI
911350Sbill 	IF magic==0 THEN txtmap.e1=maxfile; FI
921350Sbill #endif
931350Sbill }
941350Sbill 
setcor()951350Sbill setcor()
961350Sbill {
971350Sbill 	fcor=getfile(corfil,2);
981350Sbill 	datmap.ufd=fcor;
991350Sbill 	IF read(fcor, &u, ctob(UPAGES))==ctob(UPAGES)
1001350Sbill #ifndef STD
1011350Sbill 	   ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x70000000L
1021350Sbill #else
1031350Sbill 	   ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x80000000L
1041350Sbill #endif
1051350Sbill 	   ANDF (u.u_pcb.pcb_usp & 0xF0000000L)==0x70000000L
1061350Sbill 	THEN
1071350Sbill 		signo = u.u_arg[0]&017;
1081350Sbill 		txtsiz = ctob(u.u_tsize);
1091350Sbill 		datsiz = ctob(u.u_dsize);
1101350Sbill 		stksiz = ctob(u.u_ssize);
1111350Sbill 		datmap.b1 = datbas = (magic==0410?round(txtsiz,TXTRNDSIZ):0);
1121350Sbill 		if (magic == 0413)
1131350Sbill 			datmap.b1 = datbas = txtsiz;
1141350Sbill 		datmap.e1=(magic==0407?txtsiz:datmap.b1)+datsiz;
1151350Sbill #ifdef STD
1161350Sbill 		datmap.f1 = ctob(USIZE);
1171350Sbill #else
1181350Sbill 		datmap.f1 = ctob(UPAGES);
1191350Sbill #endif
1201350Sbill 		datmap.b2 = maxstor-stksiz;
1211350Sbill 		datmap.e2 = maxstor;
1221350Sbill #ifdef STD
1231350Sbill 		datmap.f2 = ctob(USIZE)+(magic==0410?datsiz:datmap.e1);
1241350Sbill #else
1251350Sbill 		datmap.f2 = ctob(UPAGES)+((magic==0410 || magic == 0413)
1261350Sbill 					     ? datsiz : datmap.e1);
1271350Sbill #endif
1281350Sbill 		signo = *(ADDR *)(((ADDR)&u)+ctob(UPAGES)-4*sizeof(int));
1291350Sbill 		IF magic ANDF magic!=u.u_exdata.ux_mag
1301350Sbill 		THEN	printf("%s\n",BADMAG);
1311350Sbill 		FI
1321350Sbill 	ELSE	datmap.e1 = maxfile;
1331350Sbill 	FI
1341350Sbill }
1351350Sbill 
create(f)1361350Sbill create(f)
1371350Sbill STRING	f;
1381350Sbill {	int fd;
1391350Sbill 	IF (fd=creat(f,0644))>=0
1401350Sbill 	THEN close(fd); return(open(f,wtflag));
1411350Sbill 	ELSE return(-1);
1421350Sbill 	FI
1431350Sbill }
1441350Sbill 
getfile(filnam,cnt)1451350Sbill getfile(filnam,cnt)
1461350Sbill STRING	filnam;
1471350Sbill {
1481350Sbill 	REG INT		fsym;
1491350Sbill 
1501350Sbill 	IF !eqstr("-",filnam)
1511350Sbill 	THEN	fsym=open(filnam,wtflag);
1521350Sbill 		IF fsym<0 ANDF argcount>cnt
1531350Sbill 		THEN	IF wtflag
1541350Sbill 			THEN	fsym=create(filnam);
1551350Sbill 			FI
1561350Sbill 			IF fsym<0
1571350Sbill 			THEN printf("cannot open `%s'\n", filnam);
1581350Sbill 			FI
1591350Sbill 		FI
1601350Sbill 	ELSE	fsym = -1;
1611350Sbill 	FI
1621350Sbill 	return(fsym);
1631350Sbill }
164