ntdll: Added partial support for SystemLogicalProcessorInformation information class in NtQuerySystemInformation (linux).
This commit is contained in:
parent
b8050f0571
commit
faccf6ad10
146
dlls/ntdll/nt.c
146
dlls/ntdll/nt.c
|
@ -1320,6 +1320,122 @@ void fill_cpu_info(void)
|
||||||
cached_sci.Architecture, cached_sci.Level, cached_sci.Revision, cached_sci.FeatureSet);
|
cached_sci.Architecture, cached_sci.Level, cached_sci.Revision, cached_sci.FeatureSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef linux
|
||||||
|
static inline BOOL logical_proc_info_add_by_id(SYSTEM_LOGICAL_PROCESSOR_INFORMATION *data,
|
||||||
|
DWORD *len, DWORD max_len, LOGICAL_PROCESSOR_RELATIONSHIP rel, DWORD id, DWORD proc)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<*len; i++)
|
||||||
|
{
|
||||||
|
if(data[i].Relationship!=rel || data[i].u.Reserved[1]!=id)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
data[i].ProcessorMask |= (ULONG_PTR)1<<proc;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*len == max_len)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
data[i].Relationship = rel;
|
||||||
|
data[i].ProcessorMask = (ULONG_PTR)1<<proc;
|
||||||
|
/* TODO: set processor core flags */
|
||||||
|
data[i].u.Reserved[0] = 0;
|
||||||
|
data[i].u.Reserved[1] = id;
|
||||||
|
*len = i+1;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **data, DWORD *max_len)
|
||||||
|
{
|
||||||
|
static const char core_info[] = "/sys/devices/system/cpu/cpu%d/%s";
|
||||||
|
|
||||||
|
FILE *fcpu_list, *f;
|
||||||
|
DWORD len = 0, beg, end, i, r;
|
||||||
|
char op, name[MAX_PATH];
|
||||||
|
|
||||||
|
fcpu_list = fopen("/sys/devices/system/cpu/online", "r");
|
||||||
|
if(!fcpu_list)
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
|
while(!feof(fcpu_list))
|
||||||
|
{
|
||||||
|
if(!fscanf(fcpu_list, "%u%c ", &beg, &op))
|
||||||
|
break;
|
||||||
|
if(op == '-') fscanf(fcpu_list, "%u%c ", &end, &op);
|
||||||
|
else end = beg;
|
||||||
|
|
||||||
|
for(i=beg; i<=end; i++)
|
||||||
|
{
|
||||||
|
if(i > 8*sizeof(ULONG_PTR))
|
||||||
|
{
|
||||||
|
FIXME("skipping logical processor %d\n", i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(name, core_info, i, "core_id");
|
||||||
|
f = fopen(name, "r");
|
||||||
|
if(f)
|
||||||
|
{
|
||||||
|
fscanf(f, "%u", &r);
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
else r = i;
|
||||||
|
if(!logical_proc_info_add_by_id(*data, &len, *max_len, RelationProcessorCore, r, i))
|
||||||
|
{
|
||||||
|
SYSTEM_LOGICAL_PROCESSOR_INFORMATION *new_data;
|
||||||
|
|
||||||
|
*max_len *= 2;
|
||||||
|
new_data = RtlReAllocateHeap(GetProcessHeap(), 0, *data, *max_len*sizeof(*new_data));
|
||||||
|
if(!new_data)
|
||||||
|
{
|
||||||
|
fclose(fcpu_list);
|
||||||
|
return STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
*data = new_data;
|
||||||
|
logical_proc_info_add_by_id(*data, &len, *max_len, RelationProcessorCore, r, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(name, core_info, i, "physical_package_id");
|
||||||
|
f = fopen(name, "r");
|
||||||
|
if(f)
|
||||||
|
{
|
||||||
|
fscanf(f, "%u", &r);
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
else r = 0;
|
||||||
|
if(!logical_proc_info_add_by_id(*data, &len, *max_len, RelationProcessorPackage, r, i))
|
||||||
|
{
|
||||||
|
SYSTEM_LOGICAL_PROCESSOR_INFORMATION *new_data;
|
||||||
|
|
||||||
|
*max_len *= 2;
|
||||||
|
new_data = RtlReAllocateHeap(GetProcessHeap(), 0, *data, *max_len*sizeof(*new_data));
|
||||||
|
if(!new_data)
|
||||||
|
{
|
||||||
|
fclose(fcpu_list);
|
||||||
|
return STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
*data = new_data;
|
||||||
|
logical_proc_info_add_by_id(*data, &len, *max_len, RelationProcessorPackage, r, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(fcpu_list);
|
||||||
|
|
||||||
|
*max_len = len * sizeof(**data);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **data, DWORD *max_len)
|
||||||
|
{
|
||||||
|
FIXME("stub\n");
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* NtQuerySystemInformation [NTDLL.@]
|
* NtQuerySystemInformation [NTDLL.@]
|
||||||
* ZwQuerySystemInformation [NTDLL.@]
|
* ZwQuerySystemInformation [NTDLL.@]
|
||||||
|
@ -1754,6 +1870,36 @@ NTSTATUS WINAPI NtQuerySystemInformation(
|
||||||
else ret = STATUS_INFO_LENGTH_MISMATCH;
|
else ret = STATUS_INFO_LENGTH_MISMATCH;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SystemLogicalProcessorInformation:
|
||||||
|
{
|
||||||
|
SYSTEM_LOGICAL_PROCESSOR_INFORMATION *buf;
|
||||||
|
|
||||||
|
/* Each logical processor may use up to 7 entries in returned table:
|
||||||
|
* core, numa node, package, L1i, L1d, L2, L3 */
|
||||||
|
len = 7 * NtCurrentTeb()->Peb->NumberOfProcessors;
|
||||||
|
buf = RtlAllocateHeap(GetProcessHeap(), 0, len * sizeof(*buf));
|
||||||
|
if(!buf)
|
||||||
|
{
|
||||||
|
ret = STATUS_NO_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = create_logical_proc_info(&buf, &len);
|
||||||
|
if( ret != STATUS_SUCCESS )
|
||||||
|
{
|
||||||
|
RtlFreeHeap(GetProcessHeap(), 0, buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Length >= len)
|
||||||
|
{
|
||||||
|
if (!SystemInformation) ret = STATUS_ACCESS_VIOLATION;
|
||||||
|
else memcpy( SystemInformation, buf, len);
|
||||||
|
}
|
||||||
|
else ret = STATUS_INFO_LENGTH_MISMATCH;
|
||||||
|
RtlFreeHeap(GetProcessHeap(), 0, buf);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
FIXME("(0x%08x,%p,0x%08x,%p) stub\n",
|
FIXME("(0x%08x,%p,0x%08x,%p) stub\n",
|
||||||
SystemInformationClass,SystemInformation,Length,ResultLength);
|
SystemInformationClass,SystemInformation,Length,ResultLength);
|
||||||
|
|
Loading…
Reference in New Issue