Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <mach.h>
5 #include "elf.h"
8 Mach *mach;
10 extern Mach mach386;
11 extern Mach machpower;
13 static Mach *machs[] =
14 {
15 &mach386,
16 &machpower,
17 };
19 Mach*
20 machbyname(char *name)
21 {
22 int i;
24 for(i=0; i<nelem(machs); i++)
25 if(strcmp(machs[i]->name, name) == 0){
26 mach = machs[i];
27 return machs[i];
28 }
29 werrstr("machine '%s' not found", name);
30 return nil;
31 }
33 static struct
34 {
35 ulong magic;
36 int (*fn)(int, Fhdr*);
37 } cracktab[] = {
38 0x7F454C46, crackelf,
39 0xFEEDFACE, crackmacho,
40 };
42 Fhdr*
43 crackhdr(char *name, int mode)
44 {
45 uchar buf[4];
46 ulong magic;
47 int i, fd;
48 Fhdr *hdr;
50 if((fd = open(name, mode)) < 0)
51 return nil;
53 if(seek(fd, 0, 0) < 0 || readn(fd, buf, 4) != 4){
54 close(fd);
55 return nil;
56 }
58 hdr = mallocz(sizeof(Fhdr), 1);
59 if(hdr == nil){
60 close(fd);
61 return nil;
62 }
63 hdr->filename = strdup(name);
64 magic = beload4(buf);
65 werrstr("magic doesn't match");
66 for(i=0; i<nelem(cracktab); i++)
67 if(cracktab[i].magic == magic && seek(fd, 0, 0) == 0 && cracktab[i].fn(fd, hdr) >= 0){
68 _addhdr(hdr);
69 return hdr;
70 }
71 werrstr("unknown file type: %r");
72 free(hdr->filename);
73 free(hdr);
74 close(fd);
75 return nil;
76 }
78 void
79 uncrackhdr(Fhdr *hdr)
80 {
81 int i;
83 symclose(hdr);
84 if(hdr->elf)
85 elfclose(hdr->elf);
86 if(hdr->fd >= 0)
87 close(hdr->fd);
88 free(hdr->cmdline);
89 free(hdr->prog);
90 for(i=0; i<hdr->nthread; i++)
91 free(hdr->thread[i].ureg);
92 free(hdr->thread);
93 free(hdr->filename);
94 free(hdr);
95 }
97 int
98 mapfile(Fhdr *fp, u64int base, Map *map, Regs **regs)
99 {
100 if(fp == nil){
101 werrstr("no file");
102 return -1;
104 if(map == nil){
105 werrstr("no map");
106 return -1;
108 if(fp->map == 0){
109 werrstr("cannot load map for this file type");
110 return -1;
112 if(regs)
113 *regs = nil;
114 return fp->map(fp, base, map, regs);
117 void
118 unmapfile(Fhdr *fp, Map *map)
120 int i;
122 if(map == nil || fp == nil)
123 return;
125 for(i=0; i<map->nseg; i++){
126 while(i<map->nseg && map->seg[i].fd == fp->fd){
127 map->nseg--;
128 memmove(&map->seg[i], &map->seg[i+1],
129 (map->nseg-i)*sizeof(map->seg[0]));
134 Regs*
135 coreregs(Fhdr *fp, uint id)
137 UregRegs *r;
138 int i;
140 for(i=0; i<fp->nthread; i++){
141 if(fp->thread[i].id == id){
142 if((r = mallocz(sizeof *r, 1)) == nil)
143 return nil;
144 r->r.rw = _uregrw;
145 r->ureg = fp->thread[i].ureg;
146 return &r->r;
149 werrstr("thread not found");
150 return nil;