/* * Copyright (c) 2007 The GNU-Darwin Team, plumber * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ /* * arch_info.c * cpu.so * * Created by plumber on 10/02/06. * Copyright 2007 OpenSpecies, The GNU-Darwin Team. All rights reserved. * */ #include #include #include #include #ifdef WITH_CARBON_CORE #include #else #include #endif unsigned int is_i386() { host_basic_info_data_t host_inf; mach_msg_type_number_t inf_len; inf_len = HOST_BASIC_INFO_COUNT; kern_return_t ret = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&host_inf, &inf_len); return ( (KERN_SUCCESS == ret) && (host_inf.cpu_type == CPU_TYPE_I386) ); } unsigned int is_ppc() { host_basic_info_data_t host_inf; mach_msg_type_number_t inf_len; inf_len = HOST_BASIC_INFO_COUNT; kern_return_t ret = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&host_inf, &inf_len); return ( (KERN_SUCCESS == ret) && (host_inf.cpu_type == CPU_TYPE_POWERPC) ); } unsigned int is_ppc64() { host_basic_info_data_t host_inf; mach_msg_type_number_t inf_len; inf_len = HOST_BASIC_INFO_COUNT; kern_return_t ret = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&host_inf, &inf_len); return ( (KERN_SUCCESS == ret) && (host_inf.cpu_type == CPU_TYPE_POWERPC64) ); } /* Apple Powerpc Family */ unsigned int is_ppcG3() { host_basic_info_data_t host_inf; mach_msg_type_number_t inf_len; inf_len = HOST_BASIC_INFO_COUNT; kern_return_t ret = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&host_inf, &inf_len); return ( (KERN_SUCCESS == ret) && (host_inf.cpu_type == CPU_TYPE_POWERPC) && (host_inf.cpu_subtype == CPU_SUBTYPE_POWERPC_750) ); } unsigned int is_ppcG4() { host_basic_info_data_t host_inf; mach_msg_type_number_t inf_len; inf_len = HOST_BASIC_INFO_COUNT; kern_return_t ret = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&host_inf, &inf_len); return ( (KERN_SUCCESS == ret) && (host_inf.cpu_type == CPU_TYPE_POWERPC) && (host_inf.cpu_subtype == CPU_SUBTYPE_POWERPC_7400 || host_inf.cpu_subtype == CPU_SUBTYPE_POWERPC_7450)); } unsigned int is_ppcG5() { host_basic_info_data_t host_inf; mach_msg_type_number_t inf_len; inf_len = HOST_BASIC_INFO_COUNT; kern_return_t ret = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&host_inf, &inf_len); #ifdef CPU_TYPE_POWERPC64 return ( (KERN_SUCCESS == ret) && (host_inf.cpu_type == CPU_TYPE_POWERPC64) && (host_inf.cpu_subtype == CPU_SUBTYPE_POWERPC_970)); #else return ( (KERN_SUCCESS == ret) && (host_inf.cpu_type == CPU_TYPE_POWERPC) && (host_inf.cpu_subtype == CPU_SUBTYPE_POWERPC_970)); #endif } unsigned int processor_number() { host_basic_info_data_t host_inf; mach_msg_type_number_t inf_len; inf_len = HOST_BASIC_INFO_COUNT; host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&host_inf, &inf_len); return (unsigned int)(host_inf.max_cpus); } /* CarbonCore methods Gestalt */ unsigned long processor_cache_linesize() { #ifdef WITH_CARBON_CORE OSErr err; long res; err = Gestalt(gestaltProcessorCacheLineSize, &res); if (err!=nil) return 0; else (unsigned long) return res; #else const char k[] = "hw.cachelinesize"; u_int64_t linesize; size_t len; len = sizeof(linesize); linesize = 0L; if(sysctlbyname(k, &linesize, &len, NULL, 0 ) < 0) { return 0; } return (unsigned long)linesize; #endif } unsigned long RAM_size() { #ifdef WITH_CARBON_CORE OSErr err; long res; err = Gestalt(gestaltPhysicalRAMSize, &res); if (err!=nil) return 0; else (unsigned long) return res; #else int mib[] = {CTL_HW, HW_MEMSIZE}; uint64_t memsize; size_t len; len = sizeof(memsize); memsize = 0L; if(sysctl(mib, 2, &memsize, &len, NULL, 0) < 0) { return 0; } return (unsigned long) memsize; #endif } unsigned long RAM_sizeMB() { #ifdef WITH_CARBON_CORE OSErr err; long res; err = Gestalt(gestaltPhysicalRAMSizeInMegabytes, &res); if (err!=nil) return 0; else return (unsigned long) res; #else int mib[] = {CTL_HW, HW_MEMSIZE}; uint64_t memsize; size_t len; len = sizeof(memsize); memsize = 0L; if(sysctl(mib, 2, &memsize, &len, NULL, 0) < 0) { return 0; } return (unsigned long) memsize/(1024.0*1024.0); #endif } unsigned long ROM_size() { #ifdef WITH_CARBON_CORE OSErr err; long res; err = Gestalt(gestaltROMSize, &res); if (err!=nil) return 0; else (unsigned long) return res; #else /*TODO*/ return 0; #endif } unsigned long processor_clock_speed() { #ifdef WITH_CARBON_CORE OSErr err; long res; err = Gestalt(gestaltProcClkSpeed, &res); if (err!=nil) return 0; else return res; #else int mib[] = {CTL_HW, HW_CPU_FREQ}; uint32_t freq; size_t len; len = sizeof(freq); freq = 0L; if(sysctl(mib, 2, &freq, &len, NULL, 0) < 0) { return 0; } return (unsigned long)freq; #endif } unsigned long processor_clock_speedMHz() { #ifdef WITH_CARBON_CORE OSErr err; long res; err = Gestalt(gestaltProcClkSpeedMHz, &res); if (err!=nil) return 0; else return res; #else int mib[] = {CTL_HW, HW_CPU_FREQ}; uint32_t freq; size_t len; len = sizeof(freq); if(sysctl(mib, 2, &freq, &len, NULL, 0) < 0) { return 0; } return (unsigned long) (freq / 1000000.0f); #endif } unsigned long processor_bus_speed() { #ifdef WITH_CARBON_CORE OSErr err; long res; err = Gestalt(gestaltProcClkSpeed, &res); if (err!=nil) return 0; else return res; #else int mib[] = {CTL_HW, HW_BUS_FREQ}; uint32_t freq; size_t len; len = sizeof(freq); if(sysctl(mib, 2, &freq, &len, NULL, 0) < 0) { return 0; } return (unsigned long) freq; #endif } unsigned long processor_bus_speedMHz() { #ifdef WITH_CARBON_CORE OSErr err; long res; err = Gestalt(gestaltBusClkSpeedMHz, &res); if (err!=nil) return 0; else return res; #else int mib[] = {CTL_HW, HW_BUS_FREQ}; uint32_t freq; size_t len; len = sizeof(freq); if(sysctl(mib, 2, &freq, &len, NULL, 0) < 0) { return 0; } return (unsigned long) (freq / 1000000.0f); #endif }