From: Roderick Colenbrander Subject: [PATCH 4/5] ntdll: GetLogicalProcessorInformationEx report LTP_PC_SMT for SMT cores. Message-Id: <20180621052946.9971-5-thunderbird2k@gmail.com> Date: Wed, 20 Jun 2018 22:29:45 -0700 In-Reply-To: <20180621052946.9971-1-thunderbird2k@gmail.com> References: <20180621052946.9971-1-thunderbird2k@gmail.com> Signed-off-by: Roderick Colenbrander --- dlls/ntdll/nt.c | 27 +++++++++++++++------------ include/winnt.h | 2 ++ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index b16f320957..5712e4cc1b 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -1309,6 +1309,17 @@ static DWORD log_proc_ex_size_plus(DWORD size) return sizeof(LOGICAL_PROCESSOR_RELATIONSHIP) + sizeof(DWORD) + size; } +static DWORD count_bits(ULONG_PTR mask) +{ + DWORD count = 0; + while (mask > 0) + { + mask >>= 1; + count++; + } + return count; +} + /* Store package and core information for a logical processor. Parsing of processor * data may happen in multiple passes; the 'id' parameter is then used to locate * previously stored data. The type of data stored in 'id' depends on 'rel': @@ -1377,7 +1388,10 @@ static inline BOOL logical_proc_info_add_by_id(SYSTEM_LOGICAL_PROCESSOR_INFORMAT dataex->Relationship = rel; dataex->Size = log_proc_ex_size_plus(sizeof(PROCESSOR_RELATIONSHIP)); - dataex->u.Processor.Flags = 0; /* TODO */ + if (rel == RelationProcessorCore) + dataex->u.Processor.Flags = count_bits(mask) > 1 ? LTP_PC_SMT : 0; + else + dataex->u.Processor.Flags = 0; dataex->u.Processor.EfficiencyClass = 0; dataex->u.Processor.GroupCount = 1; dataex->u.Processor.GroupMask[0].Mask = mask; @@ -1520,17 +1534,6 @@ static inline BOOL logical_proc_info_add_group(SYSTEM_LOGICAL_PROCESSOR_INFORMAT } #ifdef linux -static DWORD count_bits(ULONG_PTR mask) -{ - DWORD count = 0; - while (mask > 0) - { - mask >>= 1; - count++; - } - return count; -} - /* for 'data', max_len is the array count. for 'dataex', max_len is in bytes */ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **data, SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX **dataex, DWORD *max_len) diff --git a/include/winnt.h b/include/winnt.h index 54bf11dabd..862cc45291 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -5982,6 +5982,8 @@ typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP RelationAll = 0xffff } LOGICAL_PROCESSOR_RELATIONSHIP; +#define LTP_PC_SMT 0x1 + typedef enum _PROCESSOR_CACHE_TYPE { CacheUnified, -- 2.14.4