123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include "system-info.hpp"
- #ifdef __aarch64__
- #import <util/platform.h>
- #import <Foundation/Foundation.h>
- #import <Foundation/NSProcessInfo.h>
- #import <sys/sysctl.h>
- #import <sys/types.h>
- namespace {
- std::optional<std::string> getCpuName()
- {
- std::string name;
- size_t size;
- int ret;
- ret = sysctlbyname("machdep.cpu.brand_string", nullptr, &size, nullptr, 0);
- if (ret != 0)
- return std::nullopt;
- name.resize(size);
- ret = sysctlbyname("machdep.cpu.brand_string", name.data(), &size, nullptr, 0);
- if (ret != 0)
- return std::nullopt;
- // Remove null terminator
- name.resize(name.find('\0'));
- return name;
- }
- // Apple Silicon Macs have a single SoC that contains both GPU and CPU, the same information is valid for both.
- void fillSoCInfo(GoLiveApi::Capabilities &capabilities)
- {
- capabilities.cpu.name = getCpuName();
- // Getting the frequency is not supported on Apple Silicon.
- capabilities.cpu.physical_cores = os_get_physical_cores();
- capabilities.cpu.logical_cores = os_get_logical_cores();
- capabilities.memory.total = os_get_sys_total_size();
- capabilities.memory.free = os_get_sys_free_size();
- // Apple Silicon does not support dGPUs, there's only going to be one (the SoC).
- GoLiveApi::Gpu gpu;
- gpu.model = capabilities.cpu.name.value_or("Unknown");
- gpu.vendor_id = 0x106b; // Always Apple
- gpu.device_id = 0; // Always 0 for Apple Silicon
- std::vector<GoLiveApi::Gpu> gpus;
- gpus.push_back(std::move(gpu));
- capabilities.gpu = gpus;
- }
- void fillSystemInfo(GoLiveApi::System &sysinfo)
- {
- NSProcessInfo *procInfo = [NSProcessInfo processInfo];
- NSOperatingSystemVersion versionObj = [procInfo operatingSystemVersion];
- sysinfo.name = "macOS";
- sysinfo.bits = 64; // 32-bit macOS is long deprecated.
- sysinfo.version = [[procInfo operatingSystemVersionString] UTF8String];
- switch (versionObj.majorVersion) {
- case 11:
- sysinfo.release = "Big Sur";
- break;
- case 12:
- sysinfo.release = "Monterey";
- break;
- case 13:
- sysinfo.release = "Ventura";
- break;
- case 14:
- sysinfo.release = "Sonoma";
- break;
- case 15:
- sysinfo.release = "Sequoia";
- break;
- default:
- sysinfo.release = "unknown";
- }
- sysinfo.arm = true;
- sysinfo.armEmulation = false;
- }
- } // namespace
- void system_info(GoLiveApi::Capabilities &capabilities)
- {
- fillSoCInfo(capabilities);
- fillSystemInfo(capabilities.system);
- }
- #else /* !__aarch64__ */
- void system_info(GoLiveApi::Capabilities &)
- {
- /* Not implemented */
- }
- #endif
|