xref: /plan9-contrib/sys/src/libmach/map.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * file map routines
33e12c5d1SDavid du Colombier  */
4bd389b36SDavid du Colombier #include <u.h>
5bd389b36SDavid du Colombier #include <libc.h>
6bd389b36SDavid du Colombier #include <bio.h>
7bd389b36SDavid du Colombier #include <mach.h>
83e12c5d1SDavid du Colombier 
9*219b2ee8SDavid du Colombier static int	reloc(Map*, ulong, long*);
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier Map *
12*219b2ee8SDavid du Colombier newmap(Map *map, int fd, int n)
133e12c5d1SDavid du Colombier {
14*219b2ee8SDavid du Colombier 	int size;
15*219b2ee8SDavid du Colombier 
16*219b2ee8SDavid du Colombier 	size = sizeof(Map)+(n-1)*sizeof(struct segment);
17*219b2ee8SDavid du Colombier 	if (map == 0)
18*219b2ee8SDavid du Colombier 		map = malloc(size);
19*219b2ee8SDavid du Colombier 	else
20*219b2ee8SDavid du Colombier 		map = realloc(map, size);
213e12c5d1SDavid du Colombier 	if (map == 0) {
22*219b2ee8SDavid du Colombier 		werrstr("out of memory: %r");
233e12c5d1SDavid du Colombier 		return 0;
243e12c5d1SDavid du Colombier 	}
25*219b2ee8SDavid du Colombier 	memset(map, 0, size);
263e12c5d1SDavid du Colombier 	map->fd = fd;
27*219b2ee8SDavid du Colombier 	map->nsegs = n;
283e12c5d1SDavid du Colombier 	return map;
293e12c5d1SDavid du Colombier }
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier int
32*219b2ee8SDavid du Colombier setmap(Map *map, ulong b, ulong e, ulong f, char *name)
333e12c5d1SDavid du Colombier {
34*219b2ee8SDavid du Colombier 	int i;
35*219b2ee8SDavid du Colombier 
36*219b2ee8SDavid du Colombier 	if (map == 0)
373e12c5d1SDavid du Colombier 		return 0;
38*219b2ee8SDavid du Colombier 	for (i = 0; i < map->nsegs; i++)
39*219b2ee8SDavid du Colombier 		if (!map->seg[i].inuse)
40*219b2ee8SDavid du Colombier 			break;
41*219b2ee8SDavid du Colombier 	if (i >= map->nsegs)
42*219b2ee8SDavid du Colombier 		return 0;
43*219b2ee8SDavid du Colombier 	map->seg[i].b = b;
44*219b2ee8SDavid du Colombier 	map->seg[i].e = e;
45*219b2ee8SDavid du Colombier 	map->seg[i].f = f;
46*219b2ee8SDavid du Colombier 	map->seg[i].inuse = 1;
47*219b2ee8SDavid du Colombier 	map->seg[i].name = name;
483e12c5d1SDavid du Colombier 	return 1;
493e12c5d1SDavid du Colombier }
503e12c5d1SDavid du Colombier 
51*219b2ee8SDavid du Colombier int
52*219b2ee8SDavid du Colombier findseg(Map *map, char *name)
533e12c5d1SDavid du Colombier {
54*219b2ee8SDavid du Colombier 	int i;
55*219b2ee8SDavid du Colombier 
56*219b2ee8SDavid du Colombier 	if (!map)
57*219b2ee8SDavid du Colombier 		return -1;
58*219b2ee8SDavid du Colombier 	for (i = 0; i < map->nsegs; i++)
59*219b2ee8SDavid du Colombier 		if (map->seg[i].inuse && !strcmp(map->seg[i].name, name))
60*219b2ee8SDavid du Colombier 			return i;
61*219b2ee8SDavid du Colombier 	return -1;
62*219b2ee8SDavid du Colombier }
63*219b2ee8SDavid du Colombier 
64*219b2ee8SDavid du Colombier void
65*219b2ee8SDavid du Colombier unusemap(Map *map, int i)
66*219b2ee8SDavid du Colombier {
67*219b2ee8SDavid du Colombier 	if (map != 0 && 0 <= i && i < map->nsegs)
68*219b2ee8SDavid du Colombier 		map->seg[i].inuse = 0;
693e12c5d1SDavid du Colombier }
703e12c5d1SDavid du Colombier 
713e12c5d1SDavid du Colombier Map *
723e12c5d1SDavid du Colombier loadmap(Map *map, int fd, Fhdr *fp)
733e12c5d1SDavid du Colombier {
74*219b2ee8SDavid du Colombier 	map = newmap(map, fd, 2);
753e12c5d1SDavid du Colombier 	if (map == 0)
763e12c5d1SDavid du Colombier 		return 0;
77*219b2ee8SDavid du Colombier 	map->seg[0].b = fp->txtaddr;
78*219b2ee8SDavid du Colombier 	map->seg[0].e = fp->txtaddr+fp->txtsz;
79*219b2ee8SDavid du Colombier 	map->seg[0].f = fp->txtoff;
80*219b2ee8SDavid du Colombier 	map->seg[0].inuse = 1;
81*219b2ee8SDavid du Colombier 	map->seg[0].name = "text";
82*219b2ee8SDavid du Colombier 	map->seg[1].b = fp->dataddr;
83*219b2ee8SDavid du Colombier 	map->seg[1].e = fp->dataddr+fp->datsz;
84*219b2ee8SDavid du Colombier 	map->seg[1].f = fp->datoff;
85*219b2ee8SDavid du Colombier 	map->seg[1].inuse = 1;
86*219b2ee8SDavid du Colombier 	map->seg[1].name = "data";
873e12c5d1SDavid du Colombier 	return map;
883e12c5d1SDavid du Colombier }
89