d9f046947e067694401bf77522127e91a4aeadb9
static char sccsid
[] = "@(#)setup.c 4.5 82/04/01";
* adb - routines to read a.out+core at startup
off_t datbas
; /* offset of the base of the data segment */
off_t stksiz
; /* stack size in the core image */
INT sigcode
; /* belongs in head.h */
register struct nlist
*sp
;
fsym
= getfile(symfil
, 1);
if (read(fsym
, (char *)&hdr
, sizeof hdr
) != sizeof hdr
||
loc
= filhdr
.a_text
+filhdr
.a_data
;
txtmap
.f1
= txtmap
.f2
= N_TXTOFF(filhdr
);
switch (filhdr
.a_magic
) {
txtmap
.b1
= txtmap
.e1
= 0;
txtmap
.e1
= filhdr
.a_text
;
txtmap
.b2
= datbas
= round(filhdr
.a_text
, PAGSIZ
);
txtmap
.e2
= datbas
+ filhdr
.a_data
;
symtab
= (struct nlist
*) malloc(filhdr
.a_syms
);
esymtab
= &symtab
[filhdr
.a_syms
/ sizeof (struct nlist
)];
/* SHOULD SQUISH OUT STABS HERE!!! */
if (read(fsym
, symtab
, filhdr
.a_syms
) != filhdr
.a_syms
)
if (read(fsym
, &ssiz
, sizeof (ssiz
)) != sizeof (ssiz
))
strtab
= (char *) malloc(ssiz
);
if (read(fsym
, strtab
+ sizeof (ssiz
), ssiz
) != ssiz
)
for (sp
= symtab
; sp
< esymtab
; sp
++)
/* SHOULD PERFORM RANGE CHECK HERE */
sp
->n_un
.n_name
= strtab
+ sp
->n_un
.n_strx
;
if (INKERNEL(filhdr
.a_entry
)) {
printf("Error reading symbol|string table\n");
printf("Not enough space for symbol|string table\n");
printf("Old format a.out - no string table\n");
fcor
= datmap
.ufd
= getfile(corfil
,2);
if (kernel
&& fcor
!= -1 && INKERNEL(filhdr
.a_entry
)) {
if (kernel
== 0 && (stb
.st_mode
& S_IFREG
))
printf("sbr %X slr %X\n", sbr
, slr
);
physrw(fcor
, cursym
->n_value
&0x7fffffff, &masterpcbb
, 1);
masterpcbb
= (masterpcbb
&PG_PFNUM
)*512;
if (read(fcor
, (char *)&u
, ctob(UPAGES
))!=ctob(UPAGES
) ||
!INUDOT(u
.u_pcb
.pcb_ksp
) || !INSTACK(u
.u_pcb
.pcb_usp
)) {
filhdr
.a_text
= ctob(u
.u_tsize
);
filhdr
.a_data
= ctob(u
.u_dsize
);
stksiz
= ctob(u
.u_ssize
);
switch (filhdr
.a_magic
) {
datmap
.e1
= filhdr
.a_text
+filhdr
.a_data
;
datmap
.f2
= ctob(UPAGES
) + datmap
.e1
;
datmap
.b1
= round(filhdr
.a_text
, PAGSIZ
);
datmap
.e1
= datmap
.b1
+ filhdr
.a_data
;
datmap
.f2
= ctob(UPAGES
) + filhdr
.a_data
;
datmap
.f1
= ctob(UPAGES
);
datmap
.b2
= MAXSTOR
- stksiz
;
if (filhdr
.a_magic
&& u
.u_exdata
.ux_mag
&&
filhdr
.a_magic
!= u
.u_exdata
.ux_mag
)
printf("corefile not from this program");
lseek(fcor
, masterpcbb
&~0x80000000, 0);
read(fcor
, &pcb
, sizeof (struct pcb
));
pcb
.pcb_p0lr
&= ~AST_CLR
;
printf("p0br %X p0lr %X p1br %X p1lr %X\n",
pcb
.pcb_p0br
, pcb
.pcb_p0lr
, pcb
.pcb_p1br
, pcb
.pcb_p1lr
);
return (open(f
, wtflag
));
fsym
= open(filnam
, wtflag
);
if (fsym
< 0 && xargc
> cnt
) {
printf("cannot open `%s'\n", filnam
);
var
[varchk('b')] = datbas
;
var
[varchk('d')] = filhdr
.a_data
;
var
[varchk('e')] = filhdr
.a_entry
;
var
[varchk('m')] = filhdr
.a_magic
;
var
[varchk('s')] = stksiz
;
var
[varchk('t')] = filhdr
.a_text
;