FreeBSD/Linux Kernel Cross Reference
sys/sys/exec_macho.h
1 /* $NetBSD: exec_macho.h,v 1.20 2008/04/28 20:24:10 martin Exp $ */
2
3 /*-
4 * Copyright (c) 2001 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Christos Zoulas.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #ifndef _SYS_EXEC_MACHO_H_
33 #define _SYS_EXEC_MACHO_H_
34
35 #include <sys/param.h>
36
37 #include <machine/int_types.h>
38 #include <machine/macho_machdep.h>
39
40 /*
41 * CPU supported by a given arch, in sys/arch/<arch>/<arch>/macho_machdep.c
42 */
43 extern uint32_t exec_macho_supported_cpu[];
44
45 /*
46 * the `fat' binary description
47 */
48 struct exec_macho_fat_header {
49 __uint32_t magic;
50 __uint32_t nfat_arch;
51 };
52
53 #define MACHO_FAT_MAGIC 0xcafebabe
54
55 /*
56 * The fat architecture header
57 */
58 struct exec_macho_fat_arch {
59 __uint32_t cputype;
60 __uint32_t cpusubtype;
61 u_long offset;
62 u_long size;
63 u_long align;
64 };
65
66 #define MACHO_CPU_TYPE_ANY ~0
67 #define MACHO_CPU_TYPE_VAX 1
68 #define MACHO_CPU_TYPE_MC680x0 6
69 #define MACHO_CPU_TYPE_I386 7
70 #define MACHO_CPU_TYPE_MIPS 8
71 #define MACHO_CPU_TYPE_MC98000 10
72 #define MACHO_CPU_TYPE_HPPA 11
73 #define MACHO_CPU_TYPE_ARM 12
74 #define MACHO_CPU_TYPE_MC88000 13
75 #define MACHO_CPU_TYPE_SPARC 14
76 #define MACHO_CPU_TYPE_I860 15
77 #define MACHO_CPU_TYPE_ALPHA 16
78 #define MACHO_CPU_TYPE_POWERPC 18
79
80 #define MACHO_CPU_SUBTYPE_MULTIPLE ~0
81 #define MACHO_CPU_SUBTYPE_LITTLE_ENDIAN 0
82 #define MACHO_CPU_SUBTYPE_BIG_ENDIAN 1
83
84 /*
85 * m68k
86 */
87 #define MACHO_CPU_SUBTYPE_MC680x0_ALL 1
88 #define MACHO_CPU_SUBTYPE_MC68030 1
89 #define MACHO_CPU_SUBTYPE_MC68040 2
90 #define MACHO_CPU_SUBTYPE_MC68030_ONLY 3
91
92 /*
93 * x86
94 */
95 #define MACHO_CPU_SUBTYPE_I386_ALL 3
96 #define MACHO_CPU_SUBTYPE_386 3
97 #define MACHO_CPU_SUBTYPE_486 4
98 #define MACHO_CPU_SUBTYPE_486SX (4 + 128)
99 #define MACHO_CPU_SUBTYPE_586 5
100 #define MACHO_CPU_SUBTYPE_INTEL(f, m) ((f) + ((m) << 4))
101 #define MACHO_CPU_SUBTYPE_PENT MACHO_CPU_SUBTYPE_INTEL(5, 0)
102 #define MACHO_CPU_SUBTYPE_PENTPRO MACHO_CPU_SUBTYPE_INTEL(6, 1)
103 #define MACHO_CPU_SUBTYPE_PENTII_M3 MACHO_CPU_SUBTYPE_INTEL(6, 3)
104 #define MACHO_CPU_SUBTYPE_PENTII_M5 MACHO_CPU_SUBTYPE_INTEL(6, 5)
105 #define MACHO_CPU_SUBTYPE_INTEL_FAMILY(x) ((x) & 15)
106 #define MACHO_CPU_SUBTYPE_INTEL_FAMILY_MAX 15
107 #define MACHO_CPU_SUBTYPE_INTEL_MODEL(x) ((x) >> 4)
108 #define MACHO_CPU_SUBTYPE_INTEL_MODEL_ALL 0
109 /*
110 * PowerPC
111 */
112 #define MACHO_CPU_SUBTYPE_POWERPC_ALL 0
113 #define MACHO_CPU_SUBTYPE_POWERPC_601 1
114 #define MACHO_CPU_SUBTYPE_POWERPC_602 2
115 #define MACHO_CPU_SUBTYPE_POWERPC_603 3
116 #define MACHO_CPU_SUBTYPE_POWERPC_603e 4
117 #define MACHO_CPU_SUBTYPE_POWERPC_603ev 5
118 #define MACHO_CPU_SUBTYPE_POWERPC_604 6
119 #define MACHO_CPU_SUBTYPE_POWERPC_604e 7
120 #define MACHO_CPU_SUBTYPE_POWERPC_620 8
121 #define MACHO_CPU_SUBTYPE_POWERPC_750 9
122 #define MACHO_CPU_SUBTYPE_POWERPC_7400 10
123 #define MACHO_CPU_SUBTYPE_POWERPC_7450 11
124
125
126 struct exec_macho_object_header {
127 u_long magic;
128 __uint32_t cputype;
129 __uint32_t cpusubtype;
130 u_long filetype;
131 u_long ncmds;
132 u_long sizeofcmds;
133 u_long flags;
134 };
135
136 #define MACHO_MOH_MAGIC 0xfeedface
137
138 /*
139 * Object header filetype
140 */
141 #define MACHO_MOH_OBJECT 0x1
142 #define MACHO_MOH_EXECUTE 0x2
143 #define MACHO_MOH_FVMLIB 0x3
144 #define MACHO_MOH_CORE 0x4
145 #define MACHO_MOH_PRELOAD 0x5
146 #define MACHO_MOH_DYLIB 0x6
147 #define MACHO_MOH_DYLINKER 0x7
148 #define MACHO_MOH_BUNDLE 0x8
149
150 /*
151 * Object header flags
152 */
153 #define MACHO_MOH_NOUNDEFS 0x001
154 #define MACHO_MOH_INCRLINK 0x002
155 #define MACHO_MOH_DYLDLINK 0x004
156 #define MACHO_MOH_BINDATLOAD 0x008
157 #define MACHO_MOH_PREBOUND 0x010
158 #define MACHO_MOH_SPLIT_SEGS 0x020
159 #define MACHO_MOH_LAZY_INIT 0x040
160 #define MACHO_MOH_TWOLEVEL 0x080
161 #define MACHO_MOH_FORCE_FLAT 0x100
162
163 struct exec_macho_load_command {
164 u_long cmd;
165 u_long cmdsize;
166 };
167
168 #define MACHO_LC_SEGMENT 0x01
169 #define MACHO_LC_SYMTAB 0x02
170 #define MACHO_LC_SYMSEG 0x03
171 #define MACHO_LC_THREAD 0x04
172 #define MACHO_LC_UNIXTHREAD 0x05
173 #define MACHO_LC_LOADFVMLIB 0x06
174 #define MACHO_LC_IDFVMLIB 0x07
175 #define MACHO_LC_IDENT 0x08
176 #define MACHO_LC_FVMFILE 0x09
177 #define MACHO_LC_PREPAGE 0x0a
178 #define MACHO_LC_DYSYMTAB 0x0b
179 #define MACHO_LC_LOAD_DYLIB 0x0c
180 #define MACHO_LC_ID_DYLIB 0x0d
181 #define MACHO_LC_LOAD_DYLINKER 0x0e
182 #define MACHO_LC_ID_DYLINKER 0x0f
183 #define MACHO_LC_PREBOUND_DYLIB 0x10
184 #define MACHO_LC_ROUTINES 0x11
185 #define MACHO_LC_SUB_FRAMEWORK 0x12
186 #define MACHO_LC_SUB_UMBRELLA 0x13
187 #define MACHO_LC_SUB_CLIENT 0x14
188
189 struct exec_macho_segment_command {
190 u_long cmd;
191 u_long cmdsize;
192 char segname[16];
193 u_long vmaddr;
194 u_long vmsize;
195 u_long fileoff;
196 u_long filesize;
197 __uint32_t maxprot;
198 __uint32_t initprot;
199 u_long nsects;
200 u_long flags;
201 };
202
203 union macho_lc_str {
204 u_long offset;
205 char *ptr;
206 };
207
208 #define MACHO_SG_HIGHVM 0x1
209 #define MACHO_SG_FVMLIB 0x2
210 #define MACHO_SG_NORELOC 0x4
211
212 struct exec_macho_dylinker_command {
213 u_long cmd;
214 u_long cmdsize;
215 union macho_lc_str name;
216 };
217
218 struct exec_macho_dylib {
219 union macho_lc_str name;
220 u_long timestamp;
221 u_long current_version;
222 u_long compatibility_version;
223 };
224
225 struct exec_macho_dylib_command {
226 u_long cmd;
227 u_long cmdsize;
228 struct exec_macho_dylib dylib;
229 };
230
231 struct exec_macho_thread_command {
232 u_long cmd;
233 u_long cmdsize;
234 u_long flavor;
235 u_long count;
236 };
237
238 struct exec_macho_emul_arg {
239 const char *path;
240 char filename[MAXPATHLEN];
241 struct exec_macho_object_header *macho_hdr;
242 int dynamic;
243 };
244
245 #ifndef _LKM
246 #include "opt_execfmt.h"
247 #endif
248
249 #ifdef _KERNEL
250 struct exec_package;
251 struct ps_strings;
252 u_long exec_macho_thread_entry(struct exec_macho_thread_command *);
253 int exec_macho_makecmds(struct lwp *, struct exec_package *);
254 int exec_macho_copyargs(struct proc *, struct exec_package *,
255 struct ps_strings *, char **, void *);
256 #endif /* _KERNEL */
257
258 #endif /* !_SYS_EXEC_MACHO_H_ */
Cache object: b70b79d6af1b5abf3e33c9bfcaf248c9
|