Piotr Caban : ntdll: Added processor cache to SystemLogicalProcessorInformation (Mac).
Alexandre Julliard
julliard at winehq.org
Wed Sep 5 15:36:45 CDT 2012
Module: wine
Branch: master
Commit: 682b276ac58b185d567c1026cbf1cbb9addc37b3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=682b276ac58b185d567c1026cbf1cbb9addc37b3
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Sep 5 12:01:28 2012 +0200
ntdll: Added processor cache to SystemLogicalProcessorInformation (Mac).
---
dlls/ntdll/nt.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 69 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 6f2635d..2536d33 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -1609,10 +1609,12 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
#elif defined(__APPLE__)
static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **data, DWORD *max_len)
{
- DWORD len = 0, i, j;
- DWORD cores_no, lcpu_no, lcpu_per_core, cores_per_package;
+ DWORD len = 0, i, j, k;
+ DWORD cores_no, lcpu_no, lcpu_per_core, cores_per_package, assoc;
size_t size;
ULONG_PTR mask;
+ LONGLONG cache_size, cache_line_size, cache_sharing[10];
+ CACHE_DESCRIPTOR cache[4];
lcpu_no = NtCurrentTeb()->Peb->NumberOfProcessors;
@@ -1648,6 +1650,71 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
len++;
}
+ memset(cache, 0, sizeof(cache));
+ cache[0].Level = 1;
+ cache[0].Type = CacheInstruction;
+ cache[1].Level = 1;
+ cache[1].Type = CacheData;
+ cache[2].Level = 2;
+ cache[2].Type = CacheUnified;
+ cache[3].Level = 3;
+ cache[3].Type = CacheUnified;
+
+ size = sizeof(cache_line_size);
+ if(!sysctlbyname("hw.cachelinesize", &cache_line_size, &size, NULL, 0))
+ {
+ for(i=0; i<4; i++)
+ cache[i].LineSize = cache_line_size;
+ }
+
+ /* TODO: set associativity for all caches */
+ size = sizeof(assoc);
+ if(!sysctlbyname("machdep.cpu.cache.L2_associativity", &assoc, &size, NULL, 0))
+ cache[2].Associativity = assoc;
+
+ size = sizeof(cache_size);
+ if(!sysctlbyname("hw.l1icachesize", &cache_size, &size, NULL, 0))
+ cache[0].Size = cache_size;
+ size = sizeof(cache_size);
+ if(!sysctlbyname("hw.l1dcachesize", &cache_size, &size, NULL, 0))
+ cache[1].Size = cache_size;
+ size = sizeof(cache_size);
+ if(!sysctlbyname("hw.l2cachesize", &cache_size, &size, NULL, 0))
+ cache[2].Size = cache_size;
+ size = sizeof(cache_size);
+ if(!sysctlbyname("hw.l3cachesize", &cache_size, &size, NULL, 0))
+ cache[3].Size = cache_size;
+
+ size = sizeof(cache_sharing);
+ if(!sysctlbyname("hw.cacheconfig", cache_sharing, &size, NULL, 0))
+ {
+ for(i=1; i<4 && i<size/sizeof(*cache_sharing); i++)
+ {
+ if(!cache_sharing[i] || !cache[i].Size)
+ continue;
+
+ for(j=0; j<lcpu_no/cache_sharing[i]; j++)
+ {
+ mask = 0;
+ for(k=j*cache_sharing[i]; k<lcpu_no && k<(j+1)*cache_sharing[i]; k++)
+ mask |= (ULONG_PTR)1<<k;
+
+ if(i==1 && cache[0].Size)
+ {
+ (*data)[len].Relationship = RelationCache;
+ (*data)[len].ProcessorMask = mask;
+ (*data)[len].u.Cache = cache[0];
+ len++;
+ }
+
+ (*data)[len].Relationship = RelationCache;
+ (*data)[len].ProcessorMask = mask;
+ (*data)[len].u.Cache = cache[i];
+ len++;
+ }
+ }
+ }
+
mask = 0;
for(i=0; i<lcpu_no; i++)
mask |= (ULONG_PTR)1<<i;
More information about the wine-cvs
mailing list