809
[darwin-xtools.git] / cctools / libstuff / get_arch_from_host.c
blob38a532902a18711f16f3f49bb311142ae6352b30
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
23 #ifndef RLD
24 #include "stdio.h"
25 #include "stdlib.h"
26 #include "string.h"
27 #include <mach/mach.h>
28 #include "stuff/openstep_mach.h"
29 #include "stuff/arch.h"
30 #include "stuff/allocate.h"
33 * get_arch_from_host() gets the architecture from the host this is running on
34 * and returns zero if the architecture is not known and zero if the
35 * architecture is known. If the parameters family_arch_flag and
36 * specific_arch_flag are not NULL they get fill in with the family
37 * architecture and specific architecure for the host. If the architecture
38 * is unknown and the parameters are not NULL then all fields are set to zero.
40 __private_extern__
41 int
42 get_arch_from_host(
43 struct arch_flag *family_arch_flag,
44 struct arch_flag *specific_arch_flag)
46 struct host_basic_info host_basic_info;
47 unsigned int count;
48 kern_return_t r;
49 mach_port_t my_mach_host_self;
51 if(family_arch_flag != NULL)
52 memset(family_arch_flag, '\0', sizeof(struct arch_flag));
53 if(specific_arch_flag != NULL)
54 memset(specific_arch_flag, '\0', sizeof(struct arch_flag));
56 count = HOST_BASIC_INFO_COUNT;
57 my_mach_host_self = mach_host_self();
58 if((r = host_info(my_mach_host_self, HOST_BASIC_INFO,
59 (host_info_t)(&host_basic_info),
60 &count)) != KERN_SUCCESS){
61 mach_port_deallocate(mach_task_self(), my_mach_host_self);
62 return(0);
64 mach_port_deallocate(mach_task_self(), my_mach_host_self);
66 if(family_arch_flag != NULL){
67 family_arch_flag->cputype = host_basic_info.cpu_type;
69 if(specific_arch_flag != NULL){
70 specific_arch_flag->cputype = host_basic_info.cpu_type;
71 specific_arch_flag->cpusubtype = host_basic_info.cpu_subtype;
73 switch(host_basic_info.cpu_type){
74 case CPU_TYPE_MC680x0:
75 switch(host_basic_info.cpu_subtype){
76 case CPU_SUBTYPE_MC680x0_ALL:
77 case CPU_SUBTYPE_MC68030_ONLY:
78 if(family_arch_flag != NULL){
79 family_arch_flag->name = "m68k";
80 family_arch_flag->cpusubtype = CPU_SUBTYPE_MC680x0_ALL;
82 if(specific_arch_flag != NULL){
83 specific_arch_flag->name = "m68030";
84 /*
85 * There is a "bug" in the kernel for compatiblity that on
86 * an 030 machine host_info() returns cpusubtype
87 * CPU_SUBTYPE_MC680x0_ALL and not CPU_SUBTYPE_MC68030_ONLY.
89 specific_arch_flag->cpusubtype = CPU_SUBTYPE_MC68030_ONLY;
91 return(1);
92 case CPU_SUBTYPE_MC68040:
93 if(family_arch_flag != NULL){
94 family_arch_flag->name = "m68k";
95 family_arch_flag->cpusubtype = CPU_SUBTYPE_MC680x0_ALL;
97 if(specific_arch_flag != NULL)
98 specific_arch_flag->name = "m68040";
99 return(1);
101 break;
102 case CPU_TYPE_POWERPC:
103 switch(host_basic_info.cpu_subtype){
104 case CPU_SUBTYPE_POWERPC_ALL:
105 if(family_arch_flag != NULL){
106 family_arch_flag->name = "ppc";
107 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
109 if(specific_arch_flag != NULL)
110 specific_arch_flag->name = "ppc";
111 return(1);
112 case CPU_SUBTYPE_POWERPC_601:
113 if(family_arch_flag != NULL){
114 family_arch_flag->name = "ppc";
115 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
117 if(specific_arch_flag != NULL)
118 specific_arch_flag->name = "ppc601";
119 return(1);
120 case CPU_SUBTYPE_POWERPC_603:
121 if(family_arch_flag != NULL){
122 family_arch_flag->name = "ppc";
123 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
125 if(specific_arch_flag != NULL)
126 specific_arch_flag->name = "ppc603";
127 return(1);
128 case CPU_SUBTYPE_POWERPC_603e:
129 if(family_arch_flag != NULL){
130 family_arch_flag->name = "ppc";
131 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
133 if(specific_arch_flag != NULL)
134 specific_arch_flag->name = "ppc603e";
135 return(1);
136 case CPU_SUBTYPE_POWERPC_603ev:
137 if(family_arch_flag != NULL){
138 family_arch_flag->name = "ppc";
139 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
141 if(specific_arch_flag != NULL)
142 specific_arch_flag->name = "ppc603ev";
143 return(1);
144 case CPU_SUBTYPE_POWERPC_604:
145 if(family_arch_flag != NULL){
146 family_arch_flag->name = "ppc";
147 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
149 if(specific_arch_flag != NULL)
150 specific_arch_flag->name = "ppc604";
151 return(1);
152 case CPU_SUBTYPE_POWERPC_604e:
153 if(family_arch_flag != NULL){
154 family_arch_flag->name = "ppc";
155 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
157 if(specific_arch_flag != NULL)
158 specific_arch_flag->name = "ppc604e";
159 return(1);
160 case CPU_SUBTYPE_POWERPC_750:
161 if(family_arch_flag != NULL){
162 family_arch_flag->name = "ppc";
163 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
165 if(specific_arch_flag != NULL)
166 specific_arch_flag->name = "ppc750";
167 return(1);
168 case CPU_SUBTYPE_POWERPC_7400:
169 if(family_arch_flag != NULL){
170 family_arch_flag->name = "ppc";
171 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
173 if(specific_arch_flag != NULL)
174 specific_arch_flag->name = "ppc7400";
175 return(1);
176 case CPU_SUBTYPE_POWERPC_7450:
177 if(family_arch_flag != NULL){
178 family_arch_flag->name = "ppc";
179 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
181 if(specific_arch_flag != NULL)
182 specific_arch_flag->name = "ppc7450";
183 return(1);
184 case CPU_SUBTYPE_POWERPC_970:
185 if(family_arch_flag != NULL){
186 family_arch_flag->name = "ppc";
187 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
189 if(specific_arch_flag != NULL)
190 specific_arch_flag->name = "ppc970";
191 return(1);
192 default:
193 if(family_arch_flag != NULL){
194 family_arch_flag->name = "ppc";
195 family_arch_flag->cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
197 if(specific_arch_flag != NULL){
198 specific_arch_flag->name =
199 savestr("PowerPC cpusubtype 1234567890");
200 if(specific_arch_flag->name != NULL)
201 sprintf(specific_arch_flag->name,
202 "PowerPC cpusubtype %u",
203 host_basic_info.cpu_subtype);
205 return(1);
207 break;
208 case CPU_TYPE_VEO:
209 switch(host_basic_info.cpu_subtype){
210 case CPU_SUBTYPE_VEO_1:
211 if(family_arch_flag != NULL){
212 family_arch_flag->name = "veo";
213 family_arch_flag->cpusubtype = CPU_SUBTYPE_VEO_ALL;
215 if(specific_arch_flag != NULL)
216 specific_arch_flag->name = "veo1";
217 return(1);
218 case CPU_SUBTYPE_VEO_2:
219 if(family_arch_flag != NULL){
220 family_arch_flag->name = "veo";
221 family_arch_flag->cpusubtype = CPU_SUBTYPE_VEO_ALL;
223 if(specific_arch_flag != NULL)
224 specific_arch_flag->name = "veo2";
225 return(1);
226 case CPU_SUBTYPE_VEO_3:
227 if(family_arch_flag != NULL){
228 family_arch_flag->name = "veo";
229 family_arch_flag->cpusubtype = CPU_SUBTYPE_VEO_ALL;
231 if(specific_arch_flag != NULL)
232 specific_arch_flag->name = "veo3";
233 return(1);
234 case CPU_SUBTYPE_VEO_4:
235 if(family_arch_flag != NULL){
236 family_arch_flag->name = "veo";
237 family_arch_flag->cpusubtype = CPU_SUBTYPE_VEO_ALL;
239 if(specific_arch_flag != NULL)
240 specific_arch_flag->name = "veo4";
241 return(1);
242 default:
243 if(family_arch_flag != NULL){
244 family_arch_flag->name = "veo";
245 family_arch_flag->cpusubtype = CPU_SUBTYPE_VEO_ALL;
247 if(specific_arch_flag != NULL){
248 specific_arch_flag->name =
249 savestr("VEO cpusubtype 1234567890");
250 sprintf(specific_arch_flag->name,
251 "VEO cpusubtype %u",
252 host_basic_info.cpu_subtype);
254 return(1);
256 break;
257 case CPU_TYPE_MC88000:
258 switch(host_basic_info.cpu_subtype){
259 case CPU_SUBTYPE_MC88000_ALL:
260 case CPU_SUBTYPE_MC88110:
261 if(family_arch_flag != NULL){
262 family_arch_flag->name = "m88k";
263 family_arch_flag->cpusubtype = CPU_SUBTYPE_MC88000_ALL;
265 if(specific_arch_flag != NULL)
266 specific_arch_flag->name = "m88k";
267 return(1);
269 break;
270 case CPU_TYPE_I386:
271 switch(host_basic_info.cpu_subtype){
272 case CPU_SUBTYPE_I386_ALL:
273 /* case CPU_SUBTYPE_386: same value as above */
274 if(family_arch_flag != NULL){
275 family_arch_flag->name = "i386";
276 family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
278 if(specific_arch_flag != NULL)
279 specific_arch_flag->name = "i386";
280 return(1);
281 case CPU_SUBTYPE_486:
282 if(family_arch_flag != NULL){
283 family_arch_flag->name = "i386";
284 family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
286 if(specific_arch_flag != NULL)
287 specific_arch_flag->name = "i486";
288 return(1);
289 case CPU_SUBTYPE_486SX:
290 if(family_arch_flag != NULL){
291 family_arch_flag->name = "i386";
292 family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
294 if(specific_arch_flag != NULL)
295 specific_arch_flag->name = "i486SX";
296 return(1);
297 case CPU_SUBTYPE_PENT: /* same as CPU_SUBTYPE_586 */
298 if(family_arch_flag != NULL){
299 family_arch_flag->name = "i386";
300 family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
302 if(specific_arch_flag != NULL)
303 specific_arch_flag->name = "pentium";
304 return(1);
305 case CPU_SUBTYPE_PENTPRO:
306 if(family_arch_flag != NULL){
307 family_arch_flag->name = "i386";
308 family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
310 if(specific_arch_flag != NULL)
311 specific_arch_flag->name = "pentpro";
312 return(1);
313 case CPU_SUBTYPE_PENTII_M3:
314 if(family_arch_flag != NULL){
315 family_arch_flag->name = "i386";
316 family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
318 if(specific_arch_flag != NULL)
319 specific_arch_flag->name = "pentIIm3";
320 return(1);
321 case CPU_SUBTYPE_PENTII_M5:
322 if(family_arch_flag != NULL){
323 family_arch_flag->name = "i386";
324 family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
326 if(specific_arch_flag != NULL)
327 specific_arch_flag->name = "pentIIm5";
328 return(1);
329 case CPU_SUBTYPE_PENTIUM_4:
330 if(family_arch_flag != NULL){
331 family_arch_flag->name = "i386";
332 family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
334 if(specific_arch_flag != NULL)
335 specific_arch_flag->name = "pentium4";
336 return(1);
337 default:
338 if(family_arch_flag != NULL){
339 family_arch_flag->name = "i386";
340 family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
342 if(specific_arch_flag != NULL){
343 specific_arch_flag->name =
344 savestr("Intel family 12 model 12345678");
345 if(specific_arch_flag->name != NULL)
346 sprintf(specific_arch_flag->name,
347 "Intel family %u model %u",
348 CPU_SUBTYPE_INTEL_FAMILY(host_basic_info.cpu_subtype),
349 CPU_SUBTYPE_INTEL_MODEL(host_basic_info.cpu_subtype));
351 return(1);
353 break;
354 case CPU_TYPE_I860:
355 switch(host_basic_info.cpu_subtype){
356 case CPU_SUBTYPE_I860_ALL:
357 case CPU_SUBTYPE_I860_860:
358 if(family_arch_flag != NULL){
359 family_arch_flag->name = "i860";
360 family_arch_flag->cpusubtype = CPU_SUBTYPE_I860_ALL;
362 if(specific_arch_flag != NULL)
363 specific_arch_flag->name = "i860";
364 return(1);
366 break;
367 case CPU_TYPE_HPPA:
368 switch(host_basic_info.cpu_subtype){
369 case CPU_SUBTYPE_HPPA_ALL:
370 if(family_arch_flag != NULL){
371 family_arch_flag->name = "hppa";
372 family_arch_flag->cpusubtype = CPU_SUBTYPE_HPPA_ALL;
374 if(specific_arch_flag != NULL)
375 specific_arch_flag->name = "hppa";
376 return(1);
377 case CPU_SUBTYPE_HPPA_7100LC:
378 if(family_arch_flag != NULL){
379 family_arch_flag->name = "hppa";
380 family_arch_flag->cpusubtype = CPU_SUBTYPE_HPPA_ALL;
382 if(specific_arch_flag != NULL)
383 specific_arch_flag->name = "hppa7100LC";
384 return(1);
387 break;
388 case CPU_TYPE_SPARC:
389 switch(host_basic_info.cpu_subtype){
390 case /*CPU_SUBTYPE_SPARC_ALL*/0:
391 if(family_arch_flag != NULL){
392 family_arch_flag->name = "sparc";
393 family_arch_flag->cpusubtype = CPU_SUBTYPE_SPARC_ALL;
395 if(specific_arch_flag != NULL)
396 specific_arch_flag->name = "sparc";
397 return(1);
399 break;
400 case CPU_TYPE_ARM:
401 switch(host_basic_info.cpu_subtype){
402 case CPU_SUBTYPE_ARM_ALL:
403 if(family_arch_flag != NULL){
404 family_arch_flag->name = "arm";
405 family_arch_flag->cpusubtype = CPU_SUBTYPE_ARM_ALL;
407 if(specific_arch_flag != NULL)
408 specific_arch_flag->name = "arm";
409 return(1);
410 case CPU_SUBTYPE_ARM_V4T:
411 if(family_arch_flag != NULL){
412 family_arch_flag->name = "arm";
413 family_arch_flag->cpusubtype = CPU_SUBTYPE_ARM_ALL;
415 if(specific_arch_flag != NULL)
416 specific_arch_flag->name = "armv4t";
417 return(1);
418 case CPU_SUBTYPE_ARM_V5TEJ:
419 if(family_arch_flag != NULL){
420 family_arch_flag->name = "arm";
421 family_arch_flag->cpusubtype = CPU_SUBTYPE_ARM_ALL;
423 if(specific_arch_flag != NULL)
424 specific_arch_flag->name = "armv5";
425 return(1);
426 case CPU_SUBTYPE_ARM_XSCALE:
427 if(family_arch_flag != NULL){
428 family_arch_flag->name = "arm";
429 family_arch_flag->cpusubtype = CPU_SUBTYPE_ARM_ALL;
431 if(specific_arch_flag != NULL)
432 specific_arch_flag->name = "xscale";
433 return(1);
434 case CPU_SUBTYPE_ARM_V6:
435 if(family_arch_flag != NULL){
436 family_arch_flag->name = "arm";
437 family_arch_flag->cpusubtype = CPU_SUBTYPE_ARM_ALL;
439 if(specific_arch_flag != NULL)
440 specific_arch_flag->name = "armv6";
441 return(1);
442 case CPU_SUBTYPE_ARM_V7:
443 if(family_arch_flag != NULL){
444 family_arch_flag->name = "arm";
445 family_arch_flag->cpusubtype = CPU_SUBTYPE_ARM_ALL;
447 if(specific_arch_flag != NULL)
448 specific_arch_flag->name = "armv7";
449 return(1);
450 case CPU_SUBTYPE_ARM_V7F:
451 if(family_arch_flag != NULL){
452 family_arch_flag->name = "arm";
453 family_arch_flag->cpusubtype = CPU_SUBTYPE_ARM_ALL;
455 if(specific_arch_flag != NULL)
456 specific_arch_flag->name = "armv7f";
457 return(1);
458 case CPU_SUBTYPE_ARM_V7K:
459 if(family_arch_flag != NULL){
460 family_arch_flag->name = "arm";
461 family_arch_flag->cpusubtype = CPU_SUBTYPE_ARM_ALL;
463 if(specific_arch_flag != NULL)
464 specific_arch_flag->name = "armv7k";
465 return(1);
467 break;
469 return(0);
471 #endif /* !defined(RLD) */