Passo intermediario, ainda falta um longo caminho
[pspdecompiler.git] / prx.h
blob20e88e4ed29cfe3d7454636770e3dc58a5a9abf9
1 #ifndef __PRX_H
2 #define __PRX_H
4 #include "types.h"
5 #include "nids.h"
7 #define ELF_HEADER_IDENT 16
8 #define ELF_PRX_TYPE 0xFFA0
9 #define ELF_MACHINE_MIPS 8
10 #define ELF_VERSION_CURRENT 1
11 #define ELF_FLAGS_MACH_ALLEGREX 0x00A20000
12 #define ELF_FLAGS_ABI_EABI32 0x00003000
13 #define ELF_FLAGS_MIPS_ARCH2 0x10000000
16 /* Structure to hold prx header data */
17 struct prx
19 uint8 ident[ELF_HEADER_IDENT];
20 uint16 type;
21 uint16 machine;
22 uint32 version;
23 uint32 entry;
24 uint32 phoff;
25 uint32 shoff;
26 uint32 flags;
27 uint16 ehsize;
28 uint16 phentsize;
29 uint16 phnum;
30 uint16 shentsize;
31 uint16 shnum;
32 uint16 shstrndx;
34 uint32 size;
35 const uint8 *data;
37 struct elf_section *sections;
39 struct elf_program *programs;
41 uint32 relocnum;
42 struct prx_reloc *relocs;
43 struct prx_reloc *relocsbyaddr;
45 struct prx_modinfo *modinfo;
48 #define SHT_NULL 0
49 #define SHT_PROGBITS 1
50 #define SHT_STRTAB 3
51 #define SHT_NOBITS 8
52 #define SHT_LOPROC 0x70000000
53 #define SHT_HIPROC 0x7fffffff
54 #define SHT_LOUSER 0x80000000
55 #define SHT_HIUSER 0xffffffff
57 #define SHT_PRXRELOC (SHT_LOPROC | 0xA0)
59 #define SHF_WRITE 1
60 #define SHF_ALLOC 2
61 #define SHF_EXECINSTR 4
63 /* Structure defining a single elf section */
64 struct elf_section
66 uint32 idxname;
67 uint32 type;
68 uint32 flags;
69 uint32 addr;
70 uint32 offset;
71 uint32 size;
72 uint32 link;
73 uint32 info;
74 uint32 addralign;
75 uint32 entsize;
77 const uint8 *data;
78 const char *name;
82 #define PT_NULL 0
83 #define PT_LOAD 1
84 #define PT_LOPROC 0x70000000
85 #define PT_HIPROC 0x7fffffff
86 #define PT_PRXRELOC (PT_LOPROC | 0xA0)
87 #define PT_PRXRELOC2 (PT_LOPROC | 0xA1)
89 #define PF_X 1
90 #define PF_W 2
91 #define PF_R 4
93 struct elf_program
95 uint32 type;
96 uint32 offset;
97 uint32 vaddr;
98 uint32 paddr;
99 uint32 filesz;
100 uint32 memsz;
101 uint32 flags;
102 uint32 align;
104 const uint8 *data;
108 /* MIPS Reloc Entry Types */
109 #define R_MIPS_NONE 0
110 #define R_MIPS_16 1
111 #define R_MIPS_32 2
112 #define R_MIPS_26 4
113 #define R_MIPS_HI16 5
114 #define R_MIPS_LO16 6
115 #define R_MIPSX_HI16 13
116 #define R_MIPSX_J26 14
117 #define R_MIPSX_JAL26 15
120 struct prx_reloc {
121 uint32 offset;
122 uint8 type;
123 uint8 offsbase;
124 uint8 addrbase;
125 uint8 extra;
126 uint32 addend;
127 uint32 vaddr;
128 uint32 target;
131 struct prx_modinfo {
133 uint16 attributes;
134 uint16 version;
135 uint32 gp;
136 uint32 expvaddr;
137 uint32 expvaddrbtm;
138 uint32 impvaddr;
139 uint32 impvaddrbtm;
141 uint32 numimports;
142 uint32 numexports;
144 struct prx_import *imports;
145 struct prx_export *exports;
147 const char *name;
150 struct prx_import {
152 uint32 namevaddr;
153 uint32 flags;
154 uint8 size;
155 uint8 nvars;
156 uint16 nfuncs;
157 uint32 nidsvaddr;
158 uint32 funcsvaddr;
159 uint32 varsvaddr;
161 struct prx_function *funcs;
162 struct prx_variable *vars;
164 const char *name;
168 struct prx_export {
169 uint32 namevaddr;
170 uint32 flags;
171 uint8 size;
172 uint8 nvars;
173 uint16 nfuncs;
174 uint32 expvaddr;
176 struct prx_function *funcs;
177 struct prx_variable *vars;
179 const char *name;
182 struct prx_function {
183 uint32 vaddr;
184 uint32 nid;
185 const char *name;
186 const char *libname;
187 void *pfunc;
188 int numargs;
191 struct prx_variable {
192 uint32 vaddr;
193 uint32 nid;
194 const char *name;
195 const char *libname;
198 uint32 read_uint32_le (const uint8 *bytes);
199 uint16 read_uint16_le (const uint8 *bytes);
200 void write_uint32_le (uint8 *bytes, uint32 val);
202 struct prx *prx_load (const char *path);
203 void prx_free (struct prx *p);
204 void prx_print (struct prx *p, int prtrelocs);
206 void prx_resolve_nids (struct prx *p, struct nidstable *nids);
208 uint32 prx_translate (struct prx *p, uint32 vaddr);
210 int prx_inside_prx (struct prx *p, uint32 offset, uint32 size);
211 int prx_inside_progfile (struct elf_program *program, uint32 vaddr, uint32 size);
212 int prx_inside_progmem (struct elf_program *program, uint32 vaddr, uint32 size);
213 int prx_inside_strprogfile (struct elf_program *program, uint32 vaddr);
215 uint32 prx_findreloc (struct prx *p, uint32 target);
216 uint32 prx_findrelocbyaddr (struct prx *p, uint32 vaddr);
220 #endif /* __PRX_H */