#ifndef RLD
#include <stdio.h>
#include <limits.h>
#endif
#include <mach-o/fat.h>
#include <stuff/best_arch.h>
#ifndef RLD
__private_extern__
struct fat_arch *
cpusubtype_findbestarch(
cpu_type_t cputype,
cpu_subtype_t cpusubtype,
struct fat_arch *fat_archs,
uint32_t nfat_archs)
{
uint32_t i;
long lowest_family, lowest_model, lowest_index;
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype == cputype &&
(fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
(cpusubtype & ~CPU_SUBTYPE_MASK))
return(fat_archs + i);
}
switch(cputype){
case CPU_TYPE_POWERPC64:
switch(cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_POWERPC_ALL:
case CPU_SUBTYPE_POWERPC_970:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_970)
return(fat_archs + i);
}
default:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_ALL)
return(fat_archs + i);
}
}
break;
case CPU_TYPE_X86_64:
switch(cpusubtype & ~CPU_SUBTYPE_MASK){
default:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_I386_ALL)
return(fat_archs + i);
}
}
break;
case CPU_TYPE_I386:
switch(cpusubtype & ~CPU_SUBTYPE_MASK){
default:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_PENT)
return(fat_archs + i);
}
case CPU_SUBTYPE_PENT:
case CPU_SUBTYPE_486SX:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_486)
return(fat_archs + i);
}
break;
case CPU_SUBTYPE_I386_ALL:
case CPU_SUBTYPE_486:
break;
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_I386_ALL)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_486)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_486SX)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_586)
return(fat_archs + i);
}
lowest_family = CPU_SUBTYPE_INTEL_FAMILY_MAX + 1;
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if(CPU_SUBTYPE_INTEL_FAMILY(fat_archs[i].cpusubtype &
~CPU_SUBTYPE_MASK) <
lowest_family)
lowest_family = CPU_SUBTYPE_INTEL_FAMILY(
fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK);
}
if(lowest_family == CPU_SUBTYPE_INTEL_FAMILY_MAX + 1)
return(NULL);
lowest_model = LONG_MAX;
lowest_index = -1;
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if(CPU_SUBTYPE_INTEL_FAMILY(fat_archs[i].cpusubtype &
~CPU_SUBTYPE_MASK) ==
lowest_family){
if(CPU_SUBTYPE_INTEL_MODEL(fat_archs[i].cpusubtype &
~CPU_SUBTYPE_MASK) <
lowest_model){
lowest_model = CPU_SUBTYPE_INTEL_MODEL(
fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK);
lowest_index = i;
}
}
}
return(fat_archs + lowest_index);
case CPU_TYPE_MC680x0:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_MC680x0_ALL)
return(fat_archs + i);
}
if((cpusubtype & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC680x0_ALL){
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_MC68040)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_MC68030_ONLY)
return(fat_archs + i);
}
}
break;
case CPU_TYPE_POWERPC:
switch(cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_POWERPC_ALL:
case CPU_SUBTYPE_POWERPC_970:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_970)
return(fat_archs + i);
}
case CPU_SUBTYPE_POWERPC_7450:
case CPU_SUBTYPE_POWERPC_7400:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_7450)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_7400)
return(fat_archs + i);
}
case CPU_SUBTYPE_POWERPC_750:
case CPU_SUBTYPE_POWERPC_604e:
case CPU_SUBTYPE_POWERPC_604:
case CPU_SUBTYPE_POWERPC_603ev:
case CPU_SUBTYPE_POWERPC_603e:
case CPU_SUBTYPE_POWERPC_603:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_750)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_604e)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK)
== CPU_SUBTYPE_POWERPC_604)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_603ev)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_603e)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_603)
return(fat_archs + i);
}
default:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_POWERPC_ALL)
return(fat_archs + i);
}
}
break;
case CPU_TYPE_VEO:
switch(cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_VEO_1:
case CPU_SUBTYPE_VEO_3:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_VEO_2)
return(fat_archs + i);
}
case CPU_SUBTYPE_VEO_4:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_VEO_3)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_VEO_2)
return(fat_archs + i);
}
}
break;
case CPU_TYPE_MC88000:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_MC88000_ALL)
return(fat_archs + i);
}
break;
case CPU_TYPE_I860:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_I860_ALL)
return(fat_archs + i);
}
break;
case CPU_TYPE_HPPA:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_HPPA_ALL)
return(fat_archs + i);
}
break;
case CPU_TYPE_SPARC:
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype != cputype)
continue;
if((fat_archs[i].cpusubtype & ~CPU_SUBTYPE_MASK) ==
CPU_SUBTYPE_SPARC_ALL)
return(fat_archs + i);
}
break;
case CPU_TYPE_ARM:
if(cpusubtype == CPU_SUBTYPE_ARM_ALL ||
cpusubtype == CPU_SUBTYPE_ARM_V7 ||
cpusubtype == CPU_SUBTYPE_ARM_V6){
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype == cputype &&
fat_archs[i].cpusubtype == CPU_SUBTYPE_ARM_V6)
return(fat_archs + i);
}
}
if(cpusubtype == CPU_SUBTYPE_ARM_ALL ||
cpusubtype == CPU_SUBTYPE_ARM_V6 ||
cpusubtype == CPU_SUBTYPE_ARM_V5TEJ){
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype == cputype &&
fat_archs[i].cpusubtype == CPU_SUBTYPE_ARM_V5TEJ)
return(fat_archs + i);
}
}
if(cpusubtype == CPU_SUBTYPE_ARM_ALL ||
cpusubtype == CPU_SUBTYPE_ARM_XSCALE){
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype == cputype &&
fat_archs[i].cpusubtype == CPU_SUBTYPE_ARM_XSCALE)
return(fat_archs + i);
}
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype == cputype &&
fat_archs[i].cpusubtype == CPU_SUBTYPE_ARM_V4T)
return(fat_archs + i);
}
for(i = 0; i < nfat_archs; i++){
if(fat_archs[i].cputype == cputype &&
fat_archs[i].cpusubtype == CPU_SUBTYPE_ARM_ALL)
return(fat_archs + i);
}
default:
return(NULL);
}
return(NULL);
}
#endif
__private_extern__
cpu_subtype_t
cpusubtype_combine(
cpu_type_t cputype,
cpu_subtype_t cpusubtype1,
cpu_subtype_t cpusubtype2)
{
if(cputype == CPU_TYPE_I386 || cputype == CPU_TYPE_X86_64)
return(CPU_SUBTYPE_I386_ALL);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) ==
(cpusubtype2 & ~CPU_SUBTYPE_MASK))
return(cpusubtype1);
switch(cputype){
case CPU_TYPE_MC680x0:
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_MC680x0_ALL &&
(cpusubtype1 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_MC68030_ONLY &&
(cpusubtype1 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_MC68040)
return((cpu_subtype_t)-1);
if((cpusubtype2 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_MC680x0_ALL &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_MC68030_ONLY &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_MC68040)
return((cpu_subtype_t)-1);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC68030_ONLY &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC68040)
return((cpu_subtype_t)-1);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC68040 &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC68030_ONLY)
return((cpu_subtype_t)-1);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC68030_ONLY ||
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC68030_ONLY)
return(CPU_SUBTYPE_MC68030_ONLY);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC68040 ||
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC68040)
return(CPU_SUBTYPE_MC68040);
break;
case CPU_TYPE_POWERPC:
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_POWERPC_ALL)
return(cpusubtype2);
if((cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_POWERPC_ALL)
return(cpusubtype1);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_POWERPC_601 ||
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_POWERPC_601)
return(CPU_SUBTYPE_POWERPC_601);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) >
(cpusubtype2 & ~CPU_SUBTYPE_MASK))
return(cpusubtype1);
else
return(cpusubtype2);
break;
case CPU_TYPE_POWERPC64:
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_POWERPC_ALL)
return(cpusubtype2);
if((cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_POWERPC_ALL)
return(cpusubtype1);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) >
(cpusubtype2 & ~CPU_SUBTYPE_MASK))
return(cpusubtype1);
else
return(cpusubtype2);
break;
case CPU_TYPE_VEO:
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_1 &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_2)
return(CPU_SUBTYPE_VEO_1);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_2 &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_1)
return(CPU_SUBTYPE_VEO_1);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_3 &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_2)
return(CPU_SUBTYPE_VEO_3);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_2 &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_3)
return(CPU_SUBTYPE_VEO_3);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_4 &&
((cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_2
|| (cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_3))
return(CPU_SUBTYPE_VEO_4);
if(((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_2
|| (cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_3) &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_VEO_4)
return(CPU_SUBTYPE_VEO_4);
return((cpu_subtype_t)-1);
break;
case CPU_TYPE_MC88000:
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_MC88000_ALL &&
(cpusubtype1 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_MC88110)
return((cpu_subtype_t)-1);
if((cpusubtype2 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_MC88000_ALL &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_MC88110)
return((cpu_subtype_t)-1);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC88110 ||
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_MC88110)
return(CPU_SUBTYPE_MC88110);
break;
case CPU_TYPE_I860:
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_I860_ALL &&
(cpusubtype1 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_I860_860)
return((cpu_subtype_t)-1);
if((cpusubtype2 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_I860_ALL &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_I860_860)
return((cpu_subtype_t)-1);
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_I860_860 ||
(cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_I860_860)
return(CPU_SUBTYPE_I860_860);
break;
case CPU_TYPE_HPPA:
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_HPPA_ALL &&
(cpusubtype1 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_HPPA_7100LC)
return((cpu_subtype_t)-1);
if((cpusubtype2 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_HPPA_ALL &&
(cpusubtype2 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_HPPA_7100LC)
return((cpu_subtype_t)-1);
return(CPU_SUBTYPE_HPPA_7100LC);
break;
case CPU_TYPE_SPARC:
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_SPARC_ALL)
return((cpu_subtype_t)-1);
if((cpusubtype2 & ~CPU_SUBTYPE_MASK) != CPU_SUBTYPE_SPARC_ALL)
return((cpu_subtype_t)-1);
break;
case CPU_TYPE_ARM:
if((cpusubtype1 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_ARM_ALL)
return(cpusubtype2);
if((cpusubtype2 & ~CPU_SUBTYPE_MASK) == CPU_SUBTYPE_ARM_ALL)
return(cpusubtype1);
switch((cpusubtype1 & ~CPU_SUBTYPE_MASK)){
case CPU_SUBTYPE_ARM_V7:
switch((cpusubtype2 & ~CPU_SUBTYPE_MASK)){
case CPU_SUBTYPE_ARM_XSCALE:
return((cpu_subtype_t)-1);
default:
return(CPU_SUBTYPE_ARM_V7);
}
case CPU_SUBTYPE_ARM_V6:
switch((cpusubtype2 & ~CPU_SUBTYPE_MASK)){
case CPU_SUBTYPE_ARM_XSCALE:
return((cpu_subtype_t)-1);
default:
return(CPU_SUBTYPE_ARM_V6);
}
case CPU_SUBTYPE_ARM_XSCALE:
switch((cpusubtype2 & ~CPU_SUBTYPE_MASK)){
case CPU_SUBTYPE_ARM_V7:
case CPU_SUBTYPE_ARM_V6:
case CPU_SUBTYPE_ARM_V5TEJ:
return((cpu_subtype_t)-1);
default:
return(CPU_SUBTYPE_ARM_XSCALE);
}
case CPU_SUBTYPE_ARM_V5TEJ:
switch((cpusubtype2 & ~CPU_SUBTYPE_MASK)){
case CPU_SUBTYPE_ARM_XSCALE:
return((cpu_subtype_t)-1);
case CPU_SUBTYPE_ARM_V7:
return(CPU_SUBTYPE_ARM_V7);
case CPU_SUBTYPE_ARM_V6:
return(CPU_SUBTYPE_ARM_V6);
default:
return(CPU_SUBTYPE_ARM_V5TEJ);
}
case CPU_SUBTYPE_ARM_V4T:
return((cpusubtype2 & ~CPU_SUBTYPE_MASK));
default:
return((cpu_subtype_t)-1);
}
default:
return((cpu_subtype_t)-1);
}
return((cpu_subtype_t)-1);
}
#ifndef RLD
__private_extern__
enum bool
cpusubtype_execute(
cpu_type_t host_cputype,
cpu_subtype_t host_cpusubtype,
cpu_subtype_t exec_cpusubtype)
{
if((host_cpusubtype & ~CPU_SUBTYPE_MASK) ==
(exec_cpusubtype & ~CPU_SUBTYPE_MASK))
return(TRUE);
switch(host_cputype){
case CPU_TYPE_POWERPC:
switch(host_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_POWERPC_970:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_POWERPC_970:
case CPU_SUBTYPE_POWERPC_7450:
case CPU_SUBTYPE_POWERPC_7400:
case CPU_SUBTYPE_POWERPC_750:
case CPU_SUBTYPE_POWERPC_620:
case CPU_SUBTYPE_POWERPC_604e:
case CPU_SUBTYPE_POWERPC_604:
case CPU_SUBTYPE_POWERPC_603ev:
case CPU_SUBTYPE_POWERPC_603e:
case CPU_SUBTYPE_POWERPC_603:
case CPU_SUBTYPE_POWERPC_602:
case CPU_SUBTYPE_POWERPC_ALL:
return(TRUE);
case CPU_SUBTYPE_POWERPC_601:
default:
return(FALSE);
}
break;
case CPU_SUBTYPE_POWERPC_7450:
case CPU_SUBTYPE_POWERPC_7400:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_POWERPC_7450:
case CPU_SUBTYPE_POWERPC_7400:
case CPU_SUBTYPE_POWERPC_750:
case CPU_SUBTYPE_POWERPC_620:
case CPU_SUBTYPE_POWERPC_604e:
case CPU_SUBTYPE_POWERPC_604:
case CPU_SUBTYPE_POWERPC_603ev:
case CPU_SUBTYPE_POWERPC_603e:
case CPU_SUBTYPE_POWERPC_603:
case CPU_SUBTYPE_POWERPC_602:
case CPU_SUBTYPE_POWERPC_ALL:
return(TRUE);
case CPU_SUBTYPE_POWERPC_970:
case CPU_SUBTYPE_POWERPC_601:
default:
return(FALSE);
}
break;
case CPU_SUBTYPE_POWERPC_750:
case CPU_SUBTYPE_POWERPC_620:
case CPU_SUBTYPE_POWERPC_604e:
case CPU_SUBTYPE_POWERPC_604:
case CPU_SUBTYPE_POWERPC_603ev:
case CPU_SUBTYPE_POWERPC_603e:
case CPU_SUBTYPE_POWERPC_603:
case CPU_SUBTYPE_POWERPC_602:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_POWERPC_750:
case CPU_SUBTYPE_POWERPC_620:
case CPU_SUBTYPE_POWERPC_604e:
case CPU_SUBTYPE_POWERPC_604:
case CPU_SUBTYPE_POWERPC_603ev:
case CPU_SUBTYPE_POWERPC_603e:
case CPU_SUBTYPE_POWERPC_603:
case CPU_SUBTYPE_POWERPC_602:
case CPU_SUBTYPE_POWERPC_ALL:
return(TRUE);
case CPU_SUBTYPE_POWERPC_970:
case CPU_SUBTYPE_POWERPC_7450:
case CPU_SUBTYPE_POWERPC_7400:
case CPU_SUBTYPE_POWERPC_601:
default:
return(FALSE);
}
break;
case CPU_SUBTYPE_POWERPC_601:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_POWERPC_750:
case CPU_SUBTYPE_POWERPC_620:
case CPU_SUBTYPE_POWERPC_604e:
case CPU_SUBTYPE_POWERPC_604:
case CPU_SUBTYPE_POWERPC_603ev:
case CPU_SUBTYPE_POWERPC_603e:
case CPU_SUBTYPE_POWERPC_603:
case CPU_SUBTYPE_POWERPC_602:
case CPU_SUBTYPE_POWERPC_601:
case CPU_SUBTYPE_POWERPC_ALL:
return(TRUE);
case CPU_SUBTYPE_POWERPC_970:
case CPU_SUBTYPE_POWERPC_7450:
case CPU_SUBTYPE_POWERPC_7400:
default:
return(FALSE);
}
break;
default:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_POWERPC_ALL:
return(TRUE);
default:
return(FALSE);
}
break;
}
break;
case CPU_TYPE_I386:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_I386_ALL:
case CPU_SUBTYPE_486:
case CPU_SUBTYPE_486SX:
case CPU_SUBTYPE_586:
case CPU_SUBTYPE_PENTPRO:
case CPU_SUBTYPE_PENTII_M3:
case CPU_SUBTYPE_PENTII_M5:
case CPU_SUBTYPE_PENTIUM_4:
return(TRUE);
default:
return(FALSE);
}
break;
case CPU_TYPE_MC680x0:
switch(host_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_MC68040:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_MC68040:
case CPU_SUBTYPE_MC680x0_ALL:
return(TRUE);
case CPU_SUBTYPE_MC68030_ONLY:
default:
return(FALSE);
}
break;
case CPU_SUBTYPE_MC68030:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_MC680x0_ALL:
case CPU_SUBTYPE_MC68030_ONLY:
return(TRUE);
case CPU_SUBTYPE_MC68040:
default:
return(FALSE);
}
break;
default:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_MC680x0_ALL:
return(TRUE);
default:
return(FALSE);
}
break;
}
break;
case CPU_TYPE_MC88000:
switch(host_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_MC88110:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_MC88110:
case CPU_SUBTYPE_MC88000_ALL:
return(TRUE);
default:
return(FALSE);
}
break;
default:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_MC88000_ALL:
return(TRUE);
default:
return(FALSE);
}
break;
}
break;
case CPU_TYPE_HPPA:
switch(host_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_HPPA_7100LC:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_HPPA_ALL:
case CPU_SUBTYPE_HPPA_7100LC:
return(TRUE);
default:
return(FALSE);
}
break;
case CPU_SUBTYPE_HPPA_7100:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_HPPA_ALL:
return(TRUE);
case CPU_SUBTYPE_HPPA_7100LC:
default:
return(FALSE);
}
break;
default:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_HPPA_ALL:
return(TRUE);
default:
return(FALSE);
}
break;
}
break;
case CPU_TYPE_SPARC:
switch(exec_cpusubtype & ~CPU_SUBTYPE_MASK){
case CPU_SUBTYPE_SPARC_ALL:
return(TRUE);
default:
return(FALSE);
}
break;
case CPU_TYPE_ARM:
switch (host_cpusubtype){
case CPU_SUBTYPE_ARM_V6:
switch(exec_cpusubtype){
case CPU_SUBTYPE_ARM_ALL:
case CPU_SUBTYPE_ARM_V4T:
case CPU_SUBTYPE_ARM_V5TEJ:
case CPU_SUBTYPE_ARM_V6:
return(TRUE);
default:
return(FALSE);
}
break;
case CPU_SUBTYPE_ARM_V5TEJ:
switch(exec_cpusubtype){
case CPU_SUBTYPE_ARM_ALL:
case CPU_SUBTYPE_ARM_V5TEJ:
case CPU_SUBTYPE_ARM_V4T:
return(TRUE);
default:
return(FALSE);
}
break;
case CPU_SUBTYPE_ARM_XSCALE:
switch(exec_cpusubtype){
case CPU_SUBTYPE_ARM_ALL:
case CPU_SUBTYPE_ARM_XSCALE:
case CPU_SUBTYPE_ARM_V4T:
return(TRUE);
default:
return(FALSE);
}
break;
case CPU_SUBTYPE_ARM_V4T:
switch(exec_cpusubtype){
case CPU_SUBTYPE_ARM_ALL:
case CPU_SUBTYPE_ARM_V4T:
return(TRUE);
default:
return(FALSE);
}
break;
default:
switch (exec_cpusubtype){
case CPU_SUBTYPE_ARM_ALL:
return(TRUE);
default:
return(FALSE);
}
break;
}
break;
case CPU_TYPE_VEO:
case CPU_TYPE_I860:
default:
return(FALSE);
}
return(FALSE);
}
#endif