Annotation of GNUtools/cctools/libstuff/arch.c, revision 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.