/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ /* * init routines */#include "defs.h"#include "fns.h" char *symfil;char *corfil; Map *symmap;Map *cormap;Map *dotmap; int fsym, fcor;static Fhdr fhdr; static int getfile(char*, int, int); voidsetsym(void){ Symbol s; if((fsym = getfile(symfil, 1, wtflag)) < 0) { symmap = dumbmap(-1); return; } if (crackhdr(fsym, &fhdr)) { machbytype(fhdr.type); symmap = loadmap(symmap, fsym, &fhdr); if (symmap == 0) symmap = dumbmap(fsym); if (syminit(fsym, &fhdr) < 0) dprint("%r\n"); if (mach->sbreg && lookup(0, mach->sbreg, &s)) mach->sb = s.value; } else symmap = dumbmap(fsym);} voidsetcor(void){ int i; if (cormap) { for (i = 0; i < cormap->nsegs; i++) if (cormap->seg[i].inuse) close(cormap->seg[i].fd); } fcor = getfile(corfil, 2, ORDWR); if (fcor <= 0) { if (cormap) free(cormap); cormap = dumbmap(-1); return; } if(pid > 0) { /* provide addressability to executing process */ cormap = attachproc(pid, kflag, fcor, &fhdr); if (!cormap) cormap = dumbmap(-1); } else { cormap = newmap(cormap, 2); if (!cormap) cormap = dumbmap(-1); setmap(cormap, fcor, fhdr.txtaddr, fhdr.txtaddr+fhdr.txtsz, fhdr.txtaddr, "text"); setmap(cormap, fcor, fhdr.dataddr, 0xffffffff, fhdr.dataddr, "data"); } kmsys(); return;} Map *dumbmap(int fd){ Map *dumb; extern Mach mi386; extern Machdata i386mach; dumb = newmap(0, 1); setmap(dumb, fd, 0, 0xffffffff, 0, "data"); if (!mach) /* default machine = 386 */ mach = &mi386; if (!machdata) machdata = &i386mach; return dumb;} /* * set up maps for a direct process image (/proc) */ voidcmdmap(Map *map){ int i; char name[MAXSYM]; extern char lastc; rdc(); readsym(name); i = findseg(map, name); if (i < 0) /* not found */ error("Invalid map name"); if (expr(0)) { if (strcmp(name, "text") == 0) textseg(expv, &fhdr); map->seg[i].b = expv; } else error("Invalid base address"); if (expr(0)) map->seg[i].e = expv; else error("Invalid end address"); if (expr(0)) map->seg[i].f = expv; else error("Invalid file offset"); if (rdc()=='?' && map == cormap) { if (fcor) close(fcor); fcor=fsym; corfil=symfil; cormap = symmap; } else if (lastc == '/' && map == symmap) { if (fsym) close(fsym); fsym=fcor; symfil=corfil; symmap=cormap; } else reread();} static intgetfile(char *filnam, int cnt, int omode){ int f; if (filnam == 0) return -1; if (strcmp(filnam, "-") == 0) return 0; f = open(filnam, omode|OCEXEC); if(f < 0 && omode == ORDWR){ f = open(filnam, OREAD|OCEXEC); if(f >= 0) dprint("%s open read-only\n", filnam); } if (f < 0 && xargc > cnt) if (wtflag) f = create(filnam, 1, 0666); if (f < 0) { dprint("cannot open `%s': %r\n", filnam); return -1; } return f;} voidkmsys(void){ int i; i = findseg(symmap, "text"); if (i >= 0) { symmap->seg[i].b = symmap->seg[i].b&~mach->ktmask; symmap->seg[i].e = ~0; } i = findseg(symmap, "data"); if (i >= 0) { symmap->seg[i].b |= mach->kbase; symmap->seg[i].e |= mach->kbase; }} voidattachprocess(void){ char buf[100]; Dir *sym, *mem; int fd; if (!adrflg) { dprint("used pid$a\n"); return; } sym = dirfstat(fsym); sprint(buf, "/proc/%lud/mem", adrval); corfil = buf; setcor(); sprint(buf, "/proc/%lud/text", adrval); fd = open(buf, OREAD); mem = nil; if (sym==nil || fd < 0 || (mem=dirfstat(fd))==nil || sym->qid.path != mem->qid.path) dprint("warning: text images may be inconsistent\n"); free(sym); free(mem); if (fd >= 0) close(fd);}
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
/*
* init routines
*/
#include "defs.h"
#include "fns.h"
char *symfil;
char *corfil;
Map *symmap;
Map *cormap;
Map *dotmap;
int fsym, fcor;
static Fhdr fhdr;
static int getfile(char*, int, int);
void
setsym(void)
{
Symbol s;
if((fsym = getfile(symfil, 1, wtflag)) < 0) {
symmap = dumbmap(-1);
return;
}
if (crackhdr(fsym, &fhdr)) {
machbytype(fhdr.type);
symmap = loadmap(symmap, fsym, &fhdr);
if (symmap == 0)
symmap = dumbmap(fsym);
if (syminit(fsym, &fhdr) < 0)
dprint("%r\n");
if (mach->sbreg && lookup(0, mach->sbreg, &s))
mach->sb = s.value;
}
else
symmap = dumbmap(fsym);
}
void
setcor(void)
{
int i;
if (cormap) {
for (i = 0; i < cormap->nsegs; i++)
if (cormap->seg[i].inuse)
close(cormap->seg[i].fd);
}
fcor = getfile(corfil, 2, ORDWR);
if (fcor <= 0) {
if (cormap)
free(cormap);
cormap = dumbmap(-1);
return;
}
if(pid > 0) { /* provide addressability to executing process */
cormap = attachproc(pid, kflag, fcor, &fhdr);
if (!cormap)
cormap = dumbmap(-1);
} else {
cormap = newmap(cormap, 2);
if (!cormap)
cormap = dumbmap(-1);
setmap(cormap, fcor, fhdr.txtaddr, fhdr.txtaddr+fhdr.txtsz, fhdr.txtaddr, "text");
setmap(cormap, fcor, fhdr.dataddr, 0xffffffff, fhdr.dataddr, "data");
}
kmsys();
return;
}
Map *
dumbmap(int fd)
{
Map *dumb;
extern Mach mi386;
extern Machdata i386mach;
dumb = newmap(0, 1);
setmap(dumb, fd, 0, 0xffffffff, 0, "data");
if (!mach) /* default machine = 386 */
mach = &mi386;
if (!machdata)
machdata = &i386mach;
return dumb;
}
/*
* set up maps for a direct process image (/proc)
*/
void
cmdmap(Map *map)
{
int i;
char name[MAXSYM];
extern char lastc;
rdc();
readsym(name);
i = findseg(map, name);
if (i < 0) /* not found */
error("Invalid map name");
if (expr(0)) {
if (strcmp(name, "text") == 0)
textseg(expv, &fhdr);
map->seg[i].b = expv;
} else
error("Invalid base address");
if (expr(0))
map->seg[i].e = expv;
else
error("Invalid end address");
if (expr(0))
map->seg[i].f = expv;
else
error("Invalid file offset");
if (rdc()=='?' && map == cormap) {
if (fcor)
close(fcor);
fcor=fsym;
corfil=symfil;
cormap = symmap;
} else if (lastc == '/' && map == symmap) {
if (fsym)
close(fsym);
fsym=fcor;
symfil=corfil;
symmap=cormap;
} else
reread();
}
static int
getfile(char *filnam, int cnt, int omode)
{
int f;
if (filnam == 0)
return -1;
if (strcmp(filnam, "-") == 0)
return 0;
f = open(filnam, omode|OCEXEC);
if(f < 0 && omode == ORDWR){
f = open(filnam, OREAD|OCEXEC);
if(f >= 0)
dprint("%s open read-only\n", filnam);
}
if (f < 0 && xargc > cnt)
if (wtflag)
f = create(filnam, 1, 0666);
if (f < 0) {
dprint("cannot open `%s': %r\n", filnam);
return -1;
}
return f;
}
void
kmsys(void)
{
int i;
i = findseg(symmap, "text");
if (i >= 0) {
symmap->seg[i].b = symmap->seg[i].b&~mach->ktmask;
symmap->seg[i].e = ~0;
}
i = findseg(symmap, "data");
if (i >= 0) {
symmap->seg[i].b |= mach->kbase;
symmap->seg[i].e |= mach->kbase;
}
}
void
attachprocess(void)
{
char buf[100];
Dir *sym, *mem;
int fd;
if (!adrflg) {
dprint("used pid$a\n");
return;
}
sym = dirfstat(fsym);
sprint(buf, "/proc/%lud/mem", adrval);
corfil = buf;
setcor();
sprint(buf, "/proc/%lud/text", adrval);
fd = open(buf, OREAD);
mem = nil;
if (sym==nil || fd < 0 || (mem=dirfstat(fd))==nil
|| sym->qid.path != mem->qid.path)
dprint("warning: text images may be inconsistent\n");
free(sym);
free(mem);
if (fd >= 0)
close(fd);
}