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