2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
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
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@
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.
43 struct arch_flag
*family_arch_flag
,
44 struct arch_flag
*specific_arch_flag
)
46 struct host_basic_info host_basic_info
;
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
);
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";
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
;
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";
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";
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";
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";
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";
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";
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";
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";
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";
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";
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";
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";
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
);
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";
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";
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";
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";
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
,
252 host_basic_info
.cpu_subtype
);
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";
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";
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";
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";
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";
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";
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";
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";
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";
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
));
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";
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";
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";
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";
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";
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";
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";
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";
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";
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";
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";
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";
471 #endif /* !defined(RLD) */