/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: CpuInfo.cpp Date: 2021-6-12 Author: Reece ***/ #include #include "HWInfo.hpp" #include "CpuInfo.hpp" #include "CpuId.hpp" #if defined(AURORA_IS_POSIX_DERIVED) #include #include #endif #if defined(AURORA_IS_MODERNNT_DERIVED) #include "CpuInfo.NT.hpp" #endif #if defined(AURORA_IS_BSD_DERIVED) #include "CpuInfo.BSD.hpp" #endif #if defined(AURORA_IS_LINUX_DERIVED) #include "CpuInfo.Linux.hpp" #endif namespace Aurora::HWInfo { static void SetCpuTopology() { #if defined(AURORA_IS_MODERNNT_DERIVED) SetCpuTopologyNT(); #elif defined(AURORA_IS_BSD_DERIVED) SetCpuTopologyBSD(); #elif defined(AURORA_IS_LINUX_DERIVED) SetCpuTopologyLinux(); #elif defined(AURORA_IS_POSIX_DERIVED) gCpuInfo.socket = 1; gCpuInfo.cores = 1; gCpuInfo.threads = sysconf(_SC_NPROCESSORS_ONLN); #endif } static void SetFakeTopologyIfMissing() { if (gCpuInfo.threadTopology.size() || gCpuInfo.serverTopology.size()) { return; } bool fakeMtHalf = (gCpuInfo.threads & 1) == 0; gCpuInfo.maskMTHalf = fakeMtHalf; if (fakeMtHalf) { for (int i = 0; i < gCpuInfo.threads / 2; i++) { AuUInt64 shortMask {AuUInt64(1) << AuUInt64(i)}, shortMask2 {AuUInt64(1) << AuUInt64(i + gCpuInfo.threads / 2)}; CpuBitId mask; mask.lower = shortMask | shortMask2; gCpuInfo.serverTopology.push_back(mask); gCpuInfo.threadTopology.push_back(shortMask); } } else { for (int i = 0; i < gCpuInfo.threads; i++) { AuUInt64 shortMask {AuUInt64(1) << AuUInt64(i)}; CpuBitId mask; mask.lower = shortMask; gCpuInfo.serverTopology.push_back(mask); gCpuInfo.threadTopology.push_back(shortMask); } } } void InitCpuInfo() { gCpuInfo.maskMTContig = false; gCpuInfo.maskMTHalf = false; gCpuInfo.cpuArch = Aurora::Build::kCurrentArchitecture; SetCpuId(); SetCpuTopology(); SetFakeTopologyIfMissing(); } }