Index: ps/trunk/source/lib/sysdep/arch/x86_x64/apic.h =================================================================== --- ps/trunk/source/lib/sysdep/arch/x86_x64/apic.h +++ ps/trunk/source/lib/sysdep/arch/x86_x64/apic.h @@ -40,6 +40,9 @@ // apicId<->contiguousId and apicId<->processor. LIB_API bool AreApicIdsReliable(); +// we may get the apicId of a processor we don't have access to. +LIB_API bool IsProcessorKnown(ApicId apicId); + LIB_API size_t ProcessorFromApicId(ApicId apicId); LIB_API size_t ContiguousIdFromApicId(ApicId apicId); Index: ps/trunk/source/lib/sysdep/arch/x86_x64/apic.cpp =================================================================== --- ps/trunk/source/lib/sysdep/arch/x86_x64/apic.cpp +++ ps/trunk/source/lib/sysdep/arch/x86_x64/apic.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2011 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -110,6 +110,13 @@ return true; } +bool IsProcessorKnown(ApicId apicId) +{ + ModuleInit(&apicInitState, InitApicIds); + + const ApicId* pos = std::find(processorApicIds, processorApicIds+numIds, apicId); + return pos != processorApicIds+numIds; +} static size_t IndexFromApicId(const ApicId* apicIds, ApicId apicId) { Index: ps/trunk/source/lib/sysdep/os/win/wnuma.cpp =================================================================== --- ps/trunk/source/lib/sysdep/os/win/wnuma.cpp +++ ps/trunk/source/lib/sysdep/os/win/wnuma.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2018 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -232,13 +232,19 @@ header = (const AffinityHeader*)(uintptr_t(header) + header->length)) { const AffinityAPIC* affinityAPIC = DynamicCastFromHeader(header); - if(affinityAPIC) + if(!affinityAPIC) + continue; + + if(!IsProcessorKnown(affinityAPIC->apicId)) { - const size_t processor = ProcessorFromApicId(affinityAPIC->apicId); - const u32 proximityDomainNumber = affinityAPIC->ProximityDomainNumber(); - ProximityDomain& proximityDomain = proximityDomains[proximityDomainNumber]; - proximityDomain.processorMask |= Bit(processor); + debug_printf("Processor with APIC ID %d found in SRAT but not known to CPUID.", affinityAPIC->apicId); + continue; } + + const size_t processor = ProcessorFromApicId(affinityAPIC->apicId); + const u32 proximityDomainNumber = affinityAPIC->ProximityDomainNumber(); + ProximityDomain& proximityDomain = proximityDomains[proximityDomainNumber]; + proximityDomain.processorMask |= Bit(processor); } return proximityDomains;