BSD 4_1_snap release
[unix-history] / usr / src / cmd / sdb / setup.c
static char sccsid[] = "@(#)setup.c 4.2 4/18/81";
#
/*
*
* UNIX debugger
*
*/
#include "head.h"
MSG BADMAG;
INT wtflag;
INT fcor;
INT fsym;
L_INT maxfile;
L_INT maxstor;
L_INT txtsiz;
L_INT datsiz;
L_INT datbas;
L_INT stksiz;
STRING errflg;
INT magic;
L_INT symbas;
L_INT symnum;
L_INT entrypt;
INT argcount;
INT signo;
struct user u;
#define TXTHDRSIZ (sizeof(txthdr))
#ifndef EDDT
readl(f,p,n) int f,n; long * p;{
#ifndef vax
int t=0;
do {t += read(f,&(p->loword),2); t += read(f,&(p->hiword),2); p++;} while (--n);
return(t);
#else
return(read(f,p,n*sizeof(long)));
#endif
}
#endif
setsym()
{
#ifndef EDDT
TXTHDR txthdr;
fsym=getfile(symfil,1);
txtmap.ufd=fsym;
IF readl(fsym, txthdr, TXTHDRSIZ/sizeof(txthdr[0]))==TXTHDRSIZ
THEN magic=txthdr[0];
IF magic!=0410 ANDF magic!=0407 ANDF magic!=0412 ANDF magic!=0413
THEN magic=0;
ELSE
symnum=txthdr[4]/SYMTABSIZ;
txtsiz=txthdr[1];
datsiz=txthdr[2];
symbas=txtsiz+datsiz;
txtmap.f1=txtmap.f2=TXTHDRSIZ;
switch (magic) {
case 0407:
txtmap.b1=0;
txtmap.e1=0;
txtmap.b2=datbas=0;
txtmap.e2=symbas;
break;
case 0413:
txtmap.f1=txtmap.f2=(CLSIZE*NBPG);
case 0410:
txtmap.b1=0;
txtmap.e1=txtsiz;
txtmap.b2=datbas=round(txtsiz,TXTRNDSIZ);
txtmap.e2=datbas+datsiz;
txtmap.f2+=txtmap.e1;
}
entrypt=txthdr[5];
symbas += txthdr[6]+txthdr[7];
symbas += magic==0412||magic==0413 ? (CLSIZE*NBPG) : TXTHDRSIZ;
ststart = symbas;
#ifdef FLEXNAMES
gstart = ststart+txthdr[4];
#endif
/* set up symvec */
FI
FI
IF magic==0 THEN txtmap.e1=maxfile; FI
#endif
}
setcor()
{
fcor=getfile(corfil,2);
datmap.ufd=fcor;
IF read(fcor, &u, ctob(UPAGES))==ctob(UPAGES)
#ifndef STD
ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x70000000L
#else
ANDF (u.u_pcb.pcb_ksp & 0xF0000000L)==0x80000000L
#endif
ANDF (u.u_pcb.pcb_usp & 0xF0000000L)==0x70000000L
THEN
signo = u.u_arg[0]&017;
txtsiz = ctob(u.u_tsize);
datsiz = ctob(u.u_dsize);
stksiz = ctob(u.u_ssize);
datmap.b1 = datbas = (magic==0410?round(txtsiz,TXTRNDSIZ):0);
if (magic == 0413)
datmap.b1 = datbas = txtsiz;
datmap.e1=(magic==0407?txtsiz:datmap.b1)+datsiz;
#ifdef STD
datmap.f1 = ctob(USIZE);
#else
datmap.f1 = ctob(UPAGES);
#endif
datmap.b2 = maxstor-stksiz;
datmap.e2 = maxstor;
#ifdef STD
datmap.f2 = ctob(USIZE)+(magic==0410?datsiz:datmap.e1);
#else
datmap.f2 = ctob(UPAGES)+((magic==0410 || magic == 0413)
? datsiz : datmap.e1);
#endif
signo = *(ADDR *)(((ADDR)&u)+ctob(UPAGES)-4*sizeof(int));
IF magic ANDF magic!=u.u_exdata.ux_mag
THEN printf("%s\n",BADMAG);
FI
ELSE datmap.e1 = maxfile;
FI
}
create(f)
STRING f;
{ int fd;
IF (fd=creat(f,0644))>=0
THEN close(fd); return(open(f,wtflag));
ELSE return(-1);
FI
}
getfile(filnam,cnt)
STRING filnam;
{
REG INT fsym;
IF !eqstr("-",filnam)
THEN fsym=open(filnam,wtflag);
IF fsym<0 ANDF argcount>cnt
THEN IF wtflag
THEN fsym=create(filnam);
FI
IF fsym<0
THEN printf("cannot open `%s'\n", filnam);
FI
FI
ELSE fsym = -1;
FI
return(fsym);
}