Melhorado o structures
[pspdecompiler.git] / prx.h
blob35e6eab986532762b9f320cabce000557e960851
1 /**
2 * Author: Humberto Naves (hsnaves@gmail.com)
3 */
5 #ifndef __PRX_H
6 #define __PRX_H
8 #include "types.h"
9 #include "nids.h"
11 #define ELF_HEADER_IDENT 16
12 #define ELF_PRX_TYPE 0xFFA0
13 #define ELF_MACHINE_MIPS 8
14 #define ELF_VERSION_CURRENT 1
15 #define ELF_FLAGS_MACH_ALLEGREX 0x00A20000
16 #define ELF_FLAGS_ABI_EABI32 0x00003000
17 #define ELF_FLAGS_MIPS_ARCH2 0x10000000
20 /* Structure to hold prx header data */
21 struct prx
23 uint8 ident[ELF_HEADER_IDENT];
24 uint16 type;
25 uint16 machine;
26 uint32 version;
27 uint32 entry;
28 uint32 phoff;
29 uint32 shoff;
30 uint32 flags;
31 uint16 ehsize;
32 uint16 phentsize;
33 uint16 phnum;
34 uint16 shentsize;
35 uint16 shnum;
36 uint16 shstrndx;
38 uint32 size;
39 const uint8 *data;
41 struct elf_section *sections;
43 struct elf_program *programs;
45 uint32 relocnum;
46 struct prx_reloc *relocs;
47 struct prx_reloc *relocsbyaddr;
49 struct prx_modinfo *modinfo;
52 #define SHT_NULL 0
53 #define SHT_PROGBITS 1
54 #define SHT_STRTAB 3
55 #define SHT_NOBITS 8
56 #define SHT_LOPROC 0x70000000
57 #define SHT_HIPROC 0x7fffffff
58 #define SHT_LOUSER 0x80000000
59 #define SHT_HIUSER 0xffffffff
61 #define SHT_PRXRELOC (SHT_LOPROC | 0xA0)
63 #define SHF_WRITE 1
64 #define SHF_ALLOC 2
65 #define SHF_EXECINSTR 4
67 /* Structure defining a single elf section */
68 struct elf_section
70 uint32 idxname;
71 uint32 type;
72 uint32 flags;
73 uint32 addr;
74 uint32 offset;
75 uint32 size;
76 uint32 link;
77 uint32 info;
78 uint32 addralign;
79 uint32 entsize;
81 const uint8 *data;
82 const char *name;
86 #define PT_NULL 0
87 #define PT_LOAD 1
88 #define PT_LOPROC 0x70000000
89 #define PT_HIPROC 0x7fffffff
90 #define PT_PRXRELOC (PT_LOPROC | 0xA0)
91 #define PT_PRXRELOC2 (PT_LOPROC | 0xA1)
93 #define PF_X 1
94 #define PF_W 2
95 #define PF_R 4
97 struct elf_program
99 uint32 type;
100 uint32 offset;
101 uint32 vaddr;
102 uint32 paddr;
103 uint32 filesz;
104 uint32 memsz;
105 uint32 flags;
106 uint32 align;
108 const uint8 *data;
112 /* MIPS Reloc Entry Types */
113 #define R_MIPS_NONE 0
114 #define R_MIPS_16 1
115 #define R_MIPS_32 2
116 #define R_MIPS_26 4
117 #define R_MIPS_HI16 5
118 #define R_MIPS_LO16 6
119 #define R_MIPSX_HI16 13
120 #define R_MIPSX_J26 14
121 #define R_MIPSX_JAL26 15
124 struct prx_reloc {
125 uint32 offset;
126 uint8 type;
127 uint8 offsbase;
128 uint8 addrbase;
129 uint8 extra;
130 uint32 addend;
131 uint32 vaddr;
132 uint32 target;
135 struct prx_modinfo {
137 uint16 attributes;
138 uint16 version;
139 uint32 gp;
140 uint32 expvaddr;
141 uint32 expvaddrbtm;
142 uint32 impvaddr;
143 uint32 impvaddrbtm;
145 uint32 numimports;
146 uint32 numexports;
148 struct prx_import *imports;
149 struct prx_export *exports;
151 const char *name;
154 struct prx_import {
156 uint32 namevaddr;
157 uint32 flags;
158 uint8 size;
159 uint8 nvars;
160 uint16 nfuncs;
161 uint32 nidsvaddr;
162 uint32 funcsvaddr;
163 uint32 varsvaddr;
165 struct prx_function *funcs;
166 struct prx_variable *vars;
168 const char *name;
172 struct prx_export {
173 uint32 namevaddr;
174 uint32 flags;
175 uint8 size;
176 uint8 nvars;
177 uint16 nfuncs;
178 uint32 expvaddr;
180 struct prx_function *funcs;
181 struct prx_variable *vars;
183 const char *name;
186 struct prx_function {
187 uint32 vaddr;
188 uint32 nid;
189 const char *name;
190 const char *libname;
191 void *pfunc;
192 int numargs;
195 struct prx_variable {
196 uint32 vaddr;
197 uint32 nid;
198 const char *name;
199 const char *libname;
202 uint32 read_uint32_le (const uint8 *bytes);
203 uint16 read_uint16_le (const uint8 *bytes);
204 void write_uint32_le (uint8 *bytes, uint32 val);
206 struct prx *prx_load (const char *path);
207 void prx_free (struct prx *p);
208 void prx_print (struct prx *p, int prtrelocs);
210 void prx_resolve_nids (struct prx *p, struct nidstable *nids);
212 uint32 prx_translate (struct prx *p, uint32 vaddr);
214 int prx_inside_prx (struct prx *p, uint32 offset, uint32 size);
215 int prx_inside_progfile (struct elf_program *program, uint32 vaddr, uint32 size);
216 int prx_inside_progmem (struct elf_program *program, uint32 vaddr, uint32 size);
217 int prx_inside_strprogfile (struct elf_program *program, uint32 vaddr);
219 uint32 prx_findreloc (struct prx *p, uint32 target);
220 uint32 prx_findrelocbyaddr (struct prx *p, uint32 vaddr);
224 #endif /* __PRX_H */