Annotation of GNUtools/cctools/libstuff/arch.c, revision 1.1.1.1

1.1       root        1: #include "string.h"
                      2: #include <mach/mach.h>
                      3: #include "stuff/arch.h"
                      4: 
                      5: /*
                      6:  * The array of all currently know architecture flags (terminated with an entry
                      7:  * with all zeros).  Pointer to this returned with get_arch_flags().
                      8:  */
                      9: static const struct arch_flag arch_flags[] = {
                     10:     { "any",   CPU_TYPE_ANY,     CPU_SUBTYPE_MULTIPLE },
                     11:     { "little",        CPU_TYPE_ANY,     CPU_SUBTYPE_LITTLE_ENDIAN },
                     12:     { "big",   CPU_TYPE_ANY,     CPU_SUBTYPE_BIG_ENDIAN },
                     13:     /* architecture families */
                     14:     { "m68k",   CPU_TYPE_MC680x0, CPU_SUBTYPE_MC680x0_ALL },
                     15:     { "m98k",   CPU_TYPE_MC98000, CPU_SUBTYPE_MC98000_ALL },
                     16:     { "m88k",   CPU_TYPE_MC88000, CPU_SUBTYPE_MC88000_ALL },
                     17:     { "i386",   CPU_TYPE_I386,    CPU_SUBTYPE_I386_ALL },
                     18:     { "i860",   CPU_TYPE_I860,    CPU_SUBTYPE_I860_ALL },
                     19:     { "hppa",   CPU_TYPE_HPPA,    CPU_SUBTYPE_HPPA_ALL },
                     20:     { "sparc", CPU_TYPE_SPARC,   CPU_SUBTYPE_SPARC_ALL },
                     21:     /* specific architecture implementations */
                     22:     { "m68030", CPU_TYPE_MC680x0, CPU_SUBTYPE_MC68030_ONLY },
                     23:     { "m68040", CPU_TYPE_MC680x0, CPU_SUBTYPE_MC68040 },
                     24:     { "i486",   CPU_TYPE_I386,    CPU_SUBTYPE_486 },
                     25:     { "i486SX", CPU_TYPE_I386,    CPU_SUBTYPE_486SX },
                     26:     { "i586",   CPU_TYPE_I386,    CPU_SUBTYPE_586 },
                     27:     { "i586SX", CPU_TYPE_I386,    CPU_SUBTYPE_586SX },
                     28:     { "hppa7100LC", CPU_TYPE_HPPA,  CPU_SUBTYPE_HPPA_7100LC },
                     29:     { NULL,    0,                0 }
                     30: };
                     31: 
                     32: /*
                     33:  * get_arch_from_flag() is passed a name of an architecture flag and returns
                     34:  * zero if that flag is not known and non-zero if the flag is known.
                     35:  * If the pointer to the arch_flag is not NULL it is filled in with the
                     36:  * arch_flag struct that matches the name.
                     37:  */
                     38: int
                     39: get_arch_from_flag(
                     40: char *name,
                     41: struct arch_flag *arch_flag)
                     42: {
                     43:     unsigned long i;
                     44: 
                     45:        for(i = 0; arch_flags[i].name != NULL; i++){
                     46:            if(strcmp(arch_flags[i].name, name) == 0){
                     47:                if(arch_flag != NULL)
                     48:                    *arch_flag = arch_flags[i];
                     49:                return(1);
                     50:            }
                     51:        }
                     52:        if(arch_flag != NULL)
                     53:            memset(arch_flag, '\0', sizeof(struct arch_flag));
                     54:        return(0);
                     55: }
                     56: 
                     57: /*
                     58:  * get_arch_from_host() gets the architecture from the host this is running on
                     59:  * and returns zero if the architecture is not known and zero if the
                     60:  * architecture is known.  If the parameters family_arch_flag and
                     61:  * specific_arch_flag are not NULL they get fill in with the family
                     62:  * architecture and specific architecure for the host.  If the architecture
                     63:  * is unknown and the parameters are not NULL then all fields are set to zero.
                     64:  */
                     65: int
                     66: get_arch_from_host(
                     67: struct arch_flag *family_arch_flag,
                     68: struct arch_flag *specific_arch_flag)
                     69: {
                     70:     struct host_basic_info host_basic_info;
                     71:     unsigned int count;
                     72:     kern_return_t r;
                     73: 
                     74:        if(family_arch_flag != NULL)
                     75:            memset(family_arch_flag, '\0', sizeof(struct arch_flag));
                     76:        if(specific_arch_flag != NULL)
                     77:            memset(specific_arch_flag, '\0', sizeof(struct arch_flag));
                     78: 
                     79:        count = HOST_BASIC_INFO_COUNT;
                     80:        if((r = host_info(host_self(), HOST_BASIC_INFO,
                     81:                          (host_info_t)(&host_basic_info),
                     82:                          &count)) != KERN_SUCCESS)
                     83:            return(0);
                     84: 
                     85:        if(family_arch_flag != NULL){
                     86:            family_arch_flag->cputype = host_basic_info.cpu_type;
                     87:        }
                     88:        if(specific_arch_flag != NULL){
                     89:            specific_arch_flag->cputype = host_basic_info.cpu_type;
                     90:            specific_arch_flag->cpusubtype = host_basic_info.cpu_subtype;
                     91:        }
                     92:        switch(host_basic_info.cpu_type){
                     93:        case CPU_TYPE_MC680x0:
                     94:            switch(host_basic_info.cpu_subtype){
                     95:            case CPU_SUBTYPE_MC680x0_ALL:
                     96:            case CPU_SUBTYPE_MC68030_ONLY:
                     97:                if(family_arch_flag != NULL){
                     98:                    family_arch_flag->name = "m68k";
                     99:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_MC680x0_ALL;
                    100:                }
                    101:                if(specific_arch_flag != NULL){
                    102:                    specific_arch_flag->name = "m68030";
                    103:                    /* 
                    104:                     * There is a "bug" in the kernel for compatiblity that on
                    105:                     * an 030 machine host_info() returns cpusubtype
                    106:                     * CPU_SUBTYPE_MC680x0_ALL and not CPU_SUBTYPE_MC68030_ONLY.
                    107:                     */
                    108:                    specific_arch_flag->cpusubtype = CPU_SUBTYPE_MC68030_ONLY;
                    109:                }
                    110:                return(1);
                    111:            case CPU_SUBTYPE_MC68040:
                    112:                if(family_arch_flag != NULL){
                    113:                    family_arch_flag->name = "m68k";
                    114:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_MC680x0_ALL;
                    115:                }
                    116:                if(specific_arch_flag != NULL)
                    117:                    specific_arch_flag->name = "m68040";
                    118:                return(1);
                    119:            }
                    120:            break;
                    121:        case CPU_TYPE_MC98000:
                    122:            switch(host_basic_info.cpu_subtype){
                    123:            case CPU_SUBTYPE_MC98000_ALL:
                    124:                if(family_arch_flag != NULL){
                    125:                    family_arch_flag->name = "m98k";
                    126:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_MC98000_ALL;
                    127:                }
                    128:                if(specific_arch_flag != NULL)
                    129:                    specific_arch_flag->name = "m98k";
                    130:                return(1);
                    131:            }
                    132:            break;
                    133:        case CPU_TYPE_MC88000:
                    134:            switch(host_basic_info.cpu_subtype){
                    135:            case CPU_SUBTYPE_MC88000_ALL:
                    136:            case CPU_SUBTYPE_MC88110:
                    137:                if(family_arch_flag != NULL){
                    138:                    family_arch_flag->name = "m88k";
                    139:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_MC88000_ALL;
                    140:                }
                    141:                if(specific_arch_flag != NULL)
                    142:                    specific_arch_flag->name = "m88k";
                    143:                return(1);
                    144:            }
                    145:            break;
                    146:        case CPU_TYPE_I386:
                    147:            switch(host_basic_info.cpu_subtype){
                    148:            case CPU_SUBTYPE_I386_ALL:
                    149:            /* case CPU_SUBTYPE_386: same value as above */
                    150:                if(family_arch_flag != NULL){
                    151:                    family_arch_flag->name = "i386";
                    152:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
                    153:                }
                    154:                if(specific_arch_flag != NULL)
                    155:                    specific_arch_flag->name = "i386";
                    156:                return(1);
                    157:            case CPU_SUBTYPE_486:
                    158:                if(family_arch_flag != NULL){
                    159:                    family_arch_flag->name = "i386";
                    160:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
                    161:                }
                    162:                if(specific_arch_flag != NULL)
                    163:                    specific_arch_flag->name = "i486";
                    164:                return(1);
                    165:            case CPU_SUBTYPE_486SX:
                    166:                if(family_arch_flag != NULL){
                    167:                    family_arch_flag->name = "i386";
                    168:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
                    169:                }
                    170:                if(specific_arch_flag != NULL)
                    171:                    specific_arch_flag->name = "i486SX";
                    172:                return(1);
                    173:            case CPU_SUBTYPE_586:
                    174:                if(family_arch_flag != NULL){
                    175:                    family_arch_flag->name = "i386";
                    176:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
                    177:                }
                    178:                if(specific_arch_flag != NULL)
                    179:                    specific_arch_flag->name = "i586";
                    180:                return(1);
                    181:            case CPU_SUBTYPE_586SX:
                    182:                if(family_arch_flag != NULL){
                    183:                    family_arch_flag->name = "i386";
                    184:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_I386_ALL;
                    185:                }
                    186:                if(specific_arch_flag != NULL)
                    187:                    specific_arch_flag->name = "i586SX";
                    188:                return(1);
                    189:            }
                    190:            break;
                    191:        case CPU_TYPE_I860:
                    192:            switch(host_basic_info.cpu_subtype){
                    193:            case CPU_SUBTYPE_I860_ALL:
                    194:            case CPU_SUBTYPE_I860_860:
                    195:                if(family_arch_flag != NULL){
                    196:                    family_arch_flag->name = "i860";
                    197:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_I860_ALL;
                    198:                }
                    199:                if(specific_arch_flag != NULL)
                    200:                    specific_arch_flag->name = "i860";
                    201:                return(1);
                    202:            }
                    203:            break;
                    204:        case CPU_TYPE_HPPA:
                    205:            switch(host_basic_info.cpu_subtype){
                    206:            case CPU_SUBTYPE_HPPA_ALL:
                    207:                if(family_arch_flag != NULL){
                    208:                    family_arch_flag->name = "hppa";
                    209:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_HPPA_ALL;
                    210:                }
                    211:                if(specific_arch_flag != NULL)
                    212:                    specific_arch_flag->name = "hppa";
                    213:                return(1);
                    214:            case CPU_SUBTYPE_HPPA_7100LC:
                    215:                if(family_arch_flag != NULL){
                    216:                    family_arch_flag->name = "hppa";
                    217:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_HPPA_ALL;
                    218:                }
                    219:                if(specific_arch_flag != NULL)
                    220:                    specific_arch_flag->name = "hppa7100LC";
                    221:                return(1);
                    222:              
                    223:            }
                    224:            break;
                    225:        case CPU_TYPE_SPARC:
                    226:            switch(host_basic_info.cpu_subtype){
                    227:            case /*CPU_SUBTYPE_SPARC_ALL*/0:
                    228:                if(family_arch_flag != NULL){
                    229:                    family_arch_flag->name = "sparc";
                    230:                    family_arch_flag->cpusubtype = CPU_SUBTYPE_SPARC_ALL;
                    231:                }
                    232:                if(specific_arch_flag != NULL)
                    233:                    specific_arch_flag->name = "sparc";
                    234:                return(1);
                    235:            }
                    236:            break;
                    237:        }
                    238:        return(0);
                    239: }
                    240: 
                    241: /*
                    242:  * get_arch_flags() returns a pointer to an array of all currently know
                    243:  * architecture flags (terminated with an entry with all zeros).
                    244:  */
                    245: const struct arch_flag *
                    246: get_arch_flags(
                    247: void)
                    248: {
                    249:        return(arch_flags);
                    250: }
                    251: 
                    252: /*
                    253:  * get_arch_name_from_types() returns the name of the architecture for the
                    254:  * specified cputype and cpusubtype if known.  If unknown it returns a pointer
                    255:  * to the string "unknown".
                    256:  */
                    257: const char *
                    258: get_arch_name_from_types(
                    259: cpu_type_t cputype,
                    260: cpu_subtype_t cpusubtype)
                    261: {
                    262:     unsigned long i;
                    263: 
                    264:        for(i = 0; arch_flags[i].name != NULL; i++){
                    265:            if(arch_flags[i].cputype == cputype &&
                    266:               arch_flags[i].cpusubtype == cpusubtype)
                    267:                return(arch_flags[i].name);
                    268:        }
                    269:        return("unknown");
                    270: }
                    271: 
                    272: /*
                    273:  * get_arch_family_from_cputype() returns the family architecture for the
                    274:  * specified cputype if known.  If unknown it returns NULL.
                    275:  */
                    276: const struct arch_flag *
                    277: get_arch_family_from_cputype(
                    278: cpu_type_t cputype)
                    279: {
                    280:     unsigned long i;
                    281: 
                    282:        for(i = 0; arch_flags[i].name != NULL; i++){
                    283:            if(arch_flags[i].cputype == cputype)
                    284:                return(arch_flags + i);
                    285:        }
                    286:        return(NULL);
                    287: }
                    288: 
                    289: /*
                    290:  * get_byte_sex_from_flag() returns the byte sex of the architecture for the
                    291:  * specified cputype and cpusubtype if known.  If unknown it returns
                    292:  * UNKNOWN_BYTE_SEX.  If the bytesex can be determined directly as in the case
                    293:  * of reading a magic number from a file that should be done and this routine
                    294:  * should not be used as it could be out of date.
                    295:  */
                    296: enum byte_sex
                    297: get_byte_sex_from_flag(
                    298: const struct arch_flag *flag)
                    299: {
                    300:    if(flag->cputype == CPU_TYPE_MC680x0 ||
                    301:       flag->cputype == CPU_TYPE_MC88000 ||
                    302:       flag->cputype == CPU_TYPE_MC98000 ||
                    303:       flag->cputype == CPU_TYPE_HPPA ||
                    304:       flag->cputype == CPU_TYPE_SPARC ||
                    305:       flag->cputype == CPU_TYPE_I860)
                    306:         return BIG_ENDIAN_BYTE_SEX;
                    307:     else if(flag->cputype == CPU_TYPE_I386)
                    308:         return LITTLE_ENDIAN_BYTE_SEX;
                    309:     else
                    310:         return UNKNOWN_BYTE_SEX;
                    311: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.