Blame


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