1 | /* $Id $ */
|
---|
2 | /** @file
|
---|
3 | * Mach-0 structures, types and defines.
|
---|
4 | */
|
---|
5 |
|
---|
6 | #ifndef __kLdrModMachO_h__
|
---|
7 | #define __kLdrModMachO_h__
|
---|
8 |
|
---|
9 |
|
---|
10 | #ifndef IMAGE_FAT_SIGNATURE
|
---|
11 | /** The FAT signature (universal binaries). */
|
---|
12 | # define IMAGE_FAT_SIGNATURE UINT32_C(0xcafebabe)
|
---|
13 | #endif
|
---|
14 | #ifndef IMAGE_FAT_SIGNATURE_OE
|
---|
15 | /** The FAT signature (universal binaries), other endian. */
|
---|
16 | # define IMAGE_FAT_SIGNATURE_OE UINT32_C(0xbebafeca)
|
---|
17 | #endif
|
---|
18 |
|
---|
19 | /**
|
---|
20 | * The fat header found at the start of universal binaries.
|
---|
21 | * It is followed by \a nfat_arch numbers of \a fat_arch structures.
|
---|
22 | */
|
---|
23 | typedef struct fat_header
|
---|
24 | {
|
---|
25 | uint32_t magic;
|
---|
26 | uint32_t nfat_arch;
|
---|
27 | } fat_header;
|
---|
28 |
|
---|
29 | /**
|
---|
30 | * Description of fat file item.
|
---|
31 | */
|
---|
32 | struct fat_arch
|
---|
33 | {
|
---|
34 | int32_t cputype;
|
---|
35 | int32_t cpusubtype;
|
---|
36 | uint32_t offset;
|
---|
37 | uint32_t size;
|
---|
38 | uint32_t align; /**< Power of 2. */
|
---|
39 | } fat_arch;
|
---|
40 |
|
---|
41 |
|
---|
42 |
|
---|
43 | #ifdef IMAGE_MACHO32_SIGNATURE
|
---|
44 | /** The 32-bit Mach-O signature. */
|
---|
45 | # define IMAGE_MACHO32_SIGNATURE UINT32_C(0xfeedface)
|
---|
46 | #endif
|
---|
47 | #ifdef IMAGE_MACHO32_SIGNATURE_OE
|
---|
48 | /** The 32-bit Mach-O signature, other endian. */
|
---|
49 | # define IMAGE_MACHO32_SIGNATURE_OE UINT32_C(0xcefaedfe)
|
---|
50 | #endif
|
---|
51 | #define MH_MAGIC IMAGE_MACHO32_SIGNATURE
|
---|
52 | #define MH_CIGAM IMAGE_MACHO32_SIGNATURE_OE
|
---|
53 |
|
---|
54 | /**
|
---|
55 | * 32-bit Mach-O header.
|
---|
56 | * This is followed by \a ncmds number of load commands.
|
---|
57 | * @see mach_header_64
|
---|
58 | */
|
---|
59 | typedef struct mach_header_32
|
---|
60 | {
|
---|
61 | uint32_t magic;
|
---|
62 | int32_t cputype;
|
---|
63 | int32_t cpusubtype;
|
---|
64 | uint32_t filetype;
|
---|
65 | uint32_t ncmds;
|
---|
66 | uint32_t sizeofcmds;
|
---|
67 | uint32_t flags;
|
---|
68 | } mach_header_32;
|
---|
69 |
|
---|
70 |
|
---|
71 |
|
---|
72 | #ifdef IMAGE_MACHO64_SIGNATURE
|
---|
73 | /** The 64-bit Mach-O signature. */
|
---|
74 | # define IMAGE_MACHO64_SIGNATURE UINT32_C(0xfeedfacf)
|
---|
75 | #endif
|
---|
76 | #ifdef IMAGE_MACHO64_SIGNATURE_OE
|
---|
77 | /** The 64-bit Mach-O signature, other endian. */
|
---|
78 | # define IMAGE_MACHO64_SIGNATURE_OE UINT32_C(0xfefaedfe)
|
---|
79 | #endif
|
---|
80 | #define MH_MAGIC_64 IMAGE_MACHO64_SIGNATURE
|
---|
81 | #define MH_CIGAM_64 IMAGE_MACHO64_SIGNATURE_OE
|
---|
82 |
|
---|
83 | /**
|
---|
84 | * 64-bit Mach-O header.
|
---|
85 | * This is followed by \a ncmds number of load commands.
|
---|
86 | * @see mach_header
|
---|
87 | */
|
---|
88 | typedef struct mach_header_64
|
---|
89 | {
|
---|
90 | uint32_t magic;
|
---|
91 | int32_t cputype;
|
---|
92 | int32_t cpusubtype;
|
---|
93 | uint32_t filetype;
|
---|
94 | uint32_t ncmds;
|
---|
95 | uint32_t sizeofcmds;
|
---|
96 | uint32_t flags;
|
---|
97 | uint32_t reserved; /**< (for proper struct and command alignment I guess) */
|
---|
98 | } mach_header_64;
|
---|
99 |
|
---|
100 |
|
---|
101 |
|
---|
102 | /** @name CPU types / bits.
|
---|
103 | * @{
|
---|
104 | */
|
---|
105 | #define CPU_ARCH_MASK INT32_C(0xff000000)
|
---|
106 | #define CPU_ARCH_ABI64 INT32_C(0x01000000)
|
---|
107 | #define CPU_TYPE_ANY INT32_C(-1)
|
---|
108 | #define CPU_TYPE_VAX INT32_C(1)
|
---|
109 | #define CPU_TYPE_MC680x0 INT32_C(6)
|
---|
110 | #define CPU_TYPE_X86 INT32_C(7)
|
---|
111 | #define CPU_TYPE_I386 CPU_TYPE_X86
|
---|
112 | #define CPU_TYPE_X86_64 (CPU_TYPE_X86 | CPU_ARCH_ABI64)
|
---|
113 | #define CPU_TYPE_MC98000 INT32_C(10)
|
---|
114 | #define CPU_TYPE_HPPA INT32_C(11)
|
---|
115 | #define CPU_TYPE_MC88000 INT32_C(13)
|
---|
116 | #define CPU_TYPE_SPARC INT32_C(14)
|
---|
117 | #define CPU_TYPE_I860 INT32_C(15)
|
---|
118 | #define CPU_TYPE_POWERPC INT32_C(18)
|
---|
119 | #define CPU_TYPE_POWERPC64 (CPU_TYPE_POWERPC | CPU_ARCH_ABI64)
|
---|
120 | /** @} */
|
---|
121 |
|
---|
122 | /** @name CPU subtypes
|
---|
123 | * @{ */
|
---|
124 | #define CPU_SUBTYPE_MULTIPLE INT32_C(-1)
|
---|
125 | #define CPU_SUBTYPE_LITTLE_ENDIAN INT32_C(0) /**< figure this one out. */
|
---|
126 | #define CPU_SUBTYPE_BIG_ENDIAN INT32_C(1) /**< ditto */
|
---|
127 |
|
---|
128 | /* VAX */
|
---|
129 | #define CPU_SUBTYPE_VAX_ALL INT32_C(0)
|
---|
130 | #define CPU_SUBTYPE_VAX780 INT32_C(1)
|
---|
131 | #define CPU_SUBTYPE_VAX785 INT32_C(2)
|
---|
132 | #define CPU_SUBTYPE_VAX750 INT32_C(3)
|
---|
133 | #define CPU_SUBTYPE_VAX730 INT32_C(4)
|
---|
134 | #define CPU_SUBTYPE_UVAXI INT32_C(5)
|
---|
135 | #define CPU_SUBTYPE_UVAXII INT32_C(6)
|
---|
136 | #define CPU_SUBTYPE_VAX8200 INT32_C(7)
|
---|
137 | #define CPU_SUBTYPE_VAX8500 INT32_C(8)
|
---|
138 | #define CPU_SUBTYPE_VAX8600 INT32_C(9)
|
---|
139 | #define CPU_SUBTYPE_VAX8650 INT32_C(10)
|
---|
140 | #define CPU_SUBTYPE_VAX8800 INT32_C(11)
|
---|
141 | #define CPU_SUBTYPE_UVAXIII INT32_C(12)
|
---|
142 |
|
---|
143 | /* MC680xx */
|
---|
144 | #define CPU_SUBTYPE_MC680x0_ALL INT32_C(1)
|
---|
145 | #define CPU_SUBTYPE_MC68030 INT32_C(1)
|
---|
146 | #define CPU_SUBTYPE_MC68040 INT32_C(2)
|
---|
147 | #define CPU_SUBTYPE_MC68030_ONLY INT32_C(3)
|
---|
148 |
|
---|
149 | /* I386 */
|
---|
150 | #define CPU_SUBTYPE_INTEL(fam, model) ( (int32_t)(((model) << 4) | (fam)) )
|
---|
151 | #define CPU_SUBTYPE_INTEL_FAMILY(subtype) ( (subtype) & 0xf )
|
---|
152 | #define CPU_SUBTYPE_INTEL_MODEL(subtype) ( (subtype) >> 4 )
|
---|
153 | #define CPU_SUBTYPE_INTEL_FAMILY_MAX 0xf
|
---|
154 | #define CPU_SUBTYPE_INTEL_MODEL_ALL 0
|
---|
155 |
|
---|
156 | #define CPU_SUBTYPE_I386_ALL CPU_SUBTYPE_INTEL(3, 0)
|
---|
157 | #define CPU_SUBTYPE_386 CPU_SUBTYPE_INTEL(3, 0)
|
---|
158 | #define CPU_SUBTYPE_486 CPU_SUBTYPE_INTEL(4, 0)
|
---|
159 | #define CPU_SUBTYPE_486SX CPU_SUBTYPE_INTEL(4, 8)
|
---|
160 | #define CPU_SUBTYPE_586 CPU_SUBTYPE_INTEL(5, 0)
|
---|
161 | #define CPU_SUBTYPE_PENT CPU_SUBTYPE_INTEL(5, 0)
|
---|
162 | #define CPU_SUBTYPE_PENTPRO CPU_SUBTYPE_INTEL(6, 1)
|
---|
163 | #define CPU_SUBTYPE_PENTII_M3 CPU_SUBTYPE_INTEL(6, 3)
|
---|
164 | #define CPU_SUBTYPE_PENTII_M5 CPU_SUBTYPE_INTEL(6, 5)
|
---|
165 | #define CPU_SUBTYPE_CELERON CPU_SUBTYPE_INTEL(7, 6)
|
---|
166 | #define CPU_SUBTYPE_CELERON_MOBILE CPU_SUBTYPE_INTEL(7, 7)
|
---|
167 | #define CPU_SUBTYPE_PENTIUM_3 CPU_SUBTYPE_INTEL(8, 0)
|
---|
168 | #define CPU_SUBTYPE_PENTIUM_3_M CPU_SUBTYPE_INTEL(8, 1)
|
---|
169 | #define CPU_SUBTYPE_PENTIUM_3_XEON CPU_SUBTYPE_INTEL(8, 2)
|
---|
170 | #define CPU_SUBTYPE_PENTIUM_M CPU_SUBTYPE_INTEL(9, 0)
|
---|
171 | #define CPU_SUBTYPE_PENTIUM_4 CPU_SUBTYPE_INTEL(10, 0)
|
---|
172 | #define CPU_SUBTYPE_PENTIUM_4_M CPU_SUBTYPE_INTEL(10, 1)
|
---|
173 | #define CPU_SUBTYPE_ITANIUM CPU_SUBTYPE_INTEL(11, 0)
|
---|
174 | #define CPU_SUBTYPE_ITANIUM_2 CPU_SUBTYPE_INTEL(11, 1)
|
---|
175 | #define CPU_SUBTYPE_XEON CPU_SUBTYPE_INTEL(12, 0)
|
---|
176 | #define CPU_SUBTYPE_XEON_MP CPU_SUBTYPE_INTEL(12, 1)
|
---|
177 |
|
---|
178 | /* X86 */
|
---|
179 | #define CPU_SUBTYPE_X86_ALL INT32_C(3) /* CPU_SUBTYPE_I386_ALL */
|
---|
180 | #define CPU_SUBTYPE_X86_64_ALL INT32_C(3) /* CPU_SUBTYPE_I386_ALL */
|
---|
181 | #define CPU_SUBTYPE_X86_ARCH1 INT32_C(4) /* CPU_SUBTYPE_I486_ALL */
|
---|
182 |
|
---|
183 | /* MIPS */
|
---|
184 | #define CPU_SUBTYPE_MIPS_ALL INT32_C(0)
|
---|
185 | #define CPU_SUBTYPE_MIPS_R2300 INT32_C(1)
|
---|
186 | #define CPU_SUBTYPE_MIPS_R2600 INT32_C(2)
|
---|
187 | #define CPU_SUBTYPE_MIPS_R2800 INT32_C(3)
|
---|
188 | #define CPU_SUBTYPE_MIPS_R2000a INT32_C(4)
|
---|
189 | #define CPU_SUBTYPE_MIPS_R2000 INT32_C(5)
|
---|
190 | #define CPU_SUBTYPE_MIPS_R3000a INT32_C(6)
|
---|
191 | #define CPU_SUBTYPE_MIPS_R3000 INT32_C(7)
|
---|
192 |
|
---|
193 | /* MC98000 (PowerPC) */
|
---|
194 | #define CPU_SUBTYPE_MC98000_ALL INT32_C(0)
|
---|
195 | #define CPU_SUBTYPE_MC98601 INT32_C(1)
|
---|
196 |
|
---|
197 | /* HP-PA */
|
---|
198 | #define CPU_SUBTYPE_HPPA_ALL INT32_C(0)
|
---|
199 | #define CPU_SUBTYPE_HPPA_7100 INT32_C(0)
|
---|
200 | #define CPU_SUBTYPE_HPPA_7100LC INT32_C(1)
|
---|
201 |
|
---|
202 | /* MC88000 */
|
---|
203 | #define CPU_SUBTYPE_MC88000_ALL INT32_C(0)
|
---|
204 | #define CPU_SUBTYPE_MC88100 INT32_C(1)
|
---|
205 | #define CPU_SUBTYPE_MC88110 INT32_C(2)
|
---|
206 |
|
---|
207 | /* SPARC */
|
---|
208 | #define CPU_SUBTYPE_SPARC_ALL INT32_C(0)
|
---|
209 |
|
---|
210 | /* I860 */
|
---|
211 | #define CPU_SUBTYPE_I860_ALL INT32_C(0)
|
---|
212 | #define CPU_SUBTYPE_I860_860 INT32_C(1)
|
---|
213 |
|
---|
214 | /* PowerPC */
|
---|
215 | #define CPU_SUBTYPE_POWERPC_ALL INT32_C(0)
|
---|
216 | #define CPU_SUBTYPE_POWERPC_601 INT32_C(1)
|
---|
217 | #define CPU_SUBTYPE_POWERPC_602 INT32_C(2)
|
---|
218 | #define CPU_SUBTYPE_POWERPC_603 INT32_C(3)
|
---|
219 | #define CPU_SUBTYPE_POWERPC_603e INT32_C(4)
|
---|
220 | #define CPU_SUBTYPE_POWERPC_603ev INT32_C(5)
|
---|
221 | #define CPU_SUBTYPE_POWERPC_604 INT32_C(6)
|
---|
222 | #define CPU_SUBTYPE_POWERPC_604e INT32_C(7)
|
---|
223 | #define CPU_SUBTYPE_POWERPC_620 INT32_C(8)
|
---|
224 | #define CPU_SUBTYPE_POWERPC_750 INT32_C(9)
|
---|
225 | #define CPU_SUBTYPE_POWERPC_7400 INT32_C(10)
|
---|
226 | #define CPU_SUBTYPE_POWERPC_7450 INT32_C(11)
|
---|
227 | #define CPU_SUBTYPE_POWERPC_Max INT32_C(10)
|
---|
228 | #define CPU_SUBTYPE_POWERPC_SCVger INT32_C(11)
|
---|
229 | #define CPU_SUBTYPE_POWERPC_970 INT32_C(100)
|
---|
230 |
|
---|
231 | /** @} */
|
---|
232 |
|
---|
233 | #endif
|
---|
234 |
|
---|