Problemas com os relocs
[pspdecompiler.git] / prx.h
blob7f9e21a17ce7f47b22128567217815b2dfca6263
1 #ifndef __PRX_H
2 #define __PRX_H
4 #include "types.h"
5 #include "hash.h"
6 #include "nids.h"
8 #define ELF_HEADER_IDENT 16
9 #define ELF_PRX_TYPE 0xFFA0
10 #define ELF_MACHINE_MIPS 8
11 #define ELF_VERSION_CURRENT 1
12 #define ELF_FLAGS_MACH_ALLEGREX 0x00A20000
13 #define ELF_FLAGS_ABI_EABI32 0x00003000
14 #define ELF_FLAGS_MIPS_ARCH2 0x10000000
17 /* Structure to hold prx header data */
18 struct prx
20 uint8 ident[ELF_HEADER_IDENT];
21 uint16 type;
22 uint16 machine;
23 uint32 version;
24 uint32 entry;
25 uint32 phoff;
26 uint32 shoff;
27 uint32 flags;
28 uint16 ehsize;
29 uint16 phentsize;
30 uint16 phnum;
31 uint16 shentsize;
32 uint16 shnum;
33 uint16 shstrndx;
35 uint32 size;
36 const uint8 *data;
38 struct elf_section *sections;
39 struct hashtable *secbyname;
41 struct elf_program *programs;
43 uint32 relocnum;
44 struct prx_reloc *relocs;
46 struct prx_modinfo *modinfo;
49 #define SHT_NULL 0
50 #define SHT_PROGBITS 1
51 #define SHT_STRTAB 3
52 #define SHT_NOBITS 8
53 #define SHT_LOPROC 0x70000000
54 #define SHT_HIPROC 0x7fffffff
55 #define SHT_LOUSER 0x80000000
56 #define SHT_HIUSER 0xffffffff
58 #define SHT_PRXRELOC (SHT_LOPROC | 0xA0)
60 #define SHF_WRITE 1
61 #define SHF_ALLOC 2
62 #define SHF_EXECINSTR 4
64 /* Structure defining a single elf section */
65 struct elf_section
67 uint32 idxname;
68 uint32 type;
69 uint32 flags;
70 uint32 addr;
71 uint32 offset;
72 uint32 size;
73 uint32 link;
74 uint32 info;
75 uint32 addralign;
76 uint32 entsize;
78 const uint8 *data;
79 const char *name;
83 #define PT_NULL 0
84 #define PT_LOAD 1
85 #define PT_LOPROC 0x70000000
86 #define PT_HIPROC 0x7fffffff
87 #define PT_PRX (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_REL32 3
113 #define R_MIPS_26 4
114 #define R_MIPS_HI16 5
115 #define R_MIPS_LO16 6
116 #define R_MIPS_GPREL16 7
117 #define R_MIPS_LITERAL 8
118 #define R_MIPS_GOT16 9
119 #define R_MIPS_PC16 10
120 #define R_MIPS_CALL16 11
121 #define R_MIPS_GPREL32 12
123 struct prx_reloc {
124 uint32 offset;
125 uint8 type;
126 uint8 offsbase;
127 uint8 addrbase;
128 uint8 extra;
129 uint32 vaddr;
130 uint32 target;
133 struct prx_modinfo {
135 uint16 attributes;
136 uint16 version;
137 uint32 gp;
138 uint32 expvaddr;
139 uint32 expvaddrbtm;
140 uint32 impvaddr;
141 uint32 impvaddrbtm;
143 uint32 numimports;
144 uint32 numexports;
146 struct prx_import *imports;
147 struct prx_export *exports;
149 const char *name;
152 struct prx_import {
154 uint32 namevaddr;
155 uint32 flags;
156 uint8 size;
157 uint8 nvars;
158 uint16 nfuncs;
159 uint32 nidsvaddr;
160 uint32 funcsvaddr;
161 uint32 varsvaddr;
163 struct prx_function *funcs;
164 struct prx_variable *vars;
166 const char *name;
170 struct prx_export {
171 uint32 namevaddr;
172 uint32 flags;
173 uint8 size;
174 uint8 nvars;
175 uint16 nfuncs;
176 uint32 expvaddr;
178 struct prx_function *funcs;
179 struct prx_variable *vars;
181 const char *name;
184 struct prx_function {
185 uint32 vaddr;
186 uint32 nid;
187 const char *name;
190 struct prx_variable {
191 uint32 vaddr;
192 uint32 nid;
193 const char *name;
198 struct prx *prx_load (const char *path);
199 void prx_free (struct prx *p);
200 void prx_print (struct prx *p);
201 void prx_resolve_nids (struct prx *p, struct nidstable *nids);
202 uint32 prx_translate (struct prx *p, uint32 vaddr);
204 #endif /* __PRX_H */