henesyinit from p9fce6d0435 years agoHistory
88 lines · 1.4 KB · C
RawDownload
/* * file map routines */#include <u.h>#include <libc.h>#include <bio.h>#include <mach.h> static int	reloc(Map*, ulong, long*); Map *newmap(Map *map, int fd, int n){	int size; 	size = sizeof(Map)+(n-1)*sizeof(struct segment);	if (map == 0)		map = malloc(size);	else		map = realloc(map, size);	if (map == 0) {		werrstr("out of memory: %r");		return 0;	}	memset(map, 0, size);	map->fd = fd;	map->nsegs = n;	return map;} intsetmap(Map *map, ulong b, ulong e, ulong f, char *name){	int i; 	if (map == 0)		return 0;	for (i = 0; i < map->nsegs; i++)		if (!map->seg[i].inuse)			break;	if (i >= map->nsegs)		return 0;	map->seg[i].b = b;	map->seg[i].e = e;	map->seg[i].f = f;	map->seg[i].inuse = 1;	map->seg[i].name = name;	return 1;} intfindseg(Map *map, char *name){	int i; 	if (!map)		return -1;	for (i = 0; i < map->nsegs; i++)		if (map->seg[i].inuse && !strcmp(map->seg[i].name, name))			return i;	return -1;} voidunusemap(Map *map, int i){	if (map != 0 && 0 <= i && i < map->nsegs)		map->seg[i].inuse = 0;} Map *loadmap(Map *map, int fd, Fhdr *fp){	map = newmap(map, fd, 2);	if (map == 0)		return 0;	map->seg[0].b = fp->txtaddr;	map->seg[0].e = fp->txtaddr+fp->txtsz;	map->seg[0].f = fp->txtoff;	map->seg[0].inuse = 1;	map->seg[0].name = "text";	map->seg[1].b = fp->dataddr;	map->seg[1].e = fp->dataddr+fp->datsz;	map->seg[1].f = fp->datoff;	map->seg[1].inuse = 1;	map->seg[1].name = "data";	return map;}