23 #include "precompiled.h"
53 struct StoreEachProcessorsApicId
55 static void Callback(
size_t processor, uintptr_t
UNUSED(data))
72 if(numUnique == 1 && sortedApicIds[0] == 0 &&
numIds != 1)
95 for(
size_t processor = 0; processor <
numIds; processor++)
118 const ApicId* pos = std::find(apicIds, apicIds+
numIds, apicId);
125 const size_t index = pos - apicIds;
144 return apicIds[index];
static Status InitApicIds()
bool AreApicIdsReliable()
#define UNUSED(param)
mark a function parameter as unused and avoid the corresponding compiler warning. ...
static size_t IndexFromApicId(const ApicId *apicIds, ApicId apicId)
static ApicId sortedApicIds[os_cpu_MaxProcessors]
static const size_t os_cpu_MaxProcessors
maximum number of processors supported by the OS (determined by the number of bits in an affinity mas...
Status os_cpu_CallByEachCPU(OsCpuCallback cb, uintptr_t cbData)
execute the specified function once on each processor.
static Status GetAndValidateApicIds()
static ApicId ApicIdFromIndex(const ApicId *apicIds, size_t index)
#define ASSERT(expr)
same as ENSURE in debug mode, does nothing in release mode.
size_t os_cpu_NumProcessors()
ApicId ApicIdFromProcessor(size_t processor)
size_t ProcessorFromApicId(ApicId apicId)
ApicId ApicIdFromContiguousId(size_t contiguousId)
#define UNUSED2(param)
mark a function local variable or parameter as unused and avoid the corresponding compiler warning...
intptr_t ModuleInitState
initialization state of a module (class, source file, etc.) must be initialized to zero (e...
bool cpuid(CpuidRegs *regs)
invoke CPUID instruction.
i64 Status
Error handling system.
size_t ContiguousIdFromApicId(ApicId apicId)
T bits(T num, size_t lo_idx, size_t hi_idx)
extract the value of bits hi_idx:lo_idx within num
const Status CPU_FEATURE_MISSING
#define DEBUG_WARN_ERR(status)
display the error dialog with text corresponding to the given error code.
registers used/returned by cpuid
static ApicId processorApicIds[os_cpu_MaxProcessors]
Status ModuleInit(volatile ModuleInitState *initState, Status(*init)())
calls a user-defined init function if initState is zero.
static ModuleInitState apicInitState
void debug_printf(const wchar_t *fmt,...)
write a formatted string to the debug channel, subject to filtering (see below).
#define RETURN_STATUS_IF_ERR(expression)