| /* | |
| * What processor? | |
| * | |
| * Copyright 1995,1997 Morten Welinder | |
| * Copyright 1997-1998 Marcus Meissner | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #include "config.h" | |
| #include "wine/port.h" | |
| #include <stdarg.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #ifdef HAVE_SYS_TIME_H | |
| # include <sys/time.h> | |
| #endif | |
| #define NONAMELESSUNION | |
| #define NONAMELESSSTRUCT | |
| #include "ntstatus.h" | |
| #define WIN32_NO_STATUS | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "winnt.h" | |
| #include "winternl.h" | |
| #include "wine/unicode.h" | |
| #include "wine/debug.h" | |
| #include "ddk/wdm.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(reg); | |
| #define SHARED_DATA ((KSHARED_USER_DATA*)0x7ffe0000) | |
| /**************************************************************************** | |
| * QueryPerformanceCounter (KERNEL32.@) | |
| * | |
| * Get the current value of the performance counter. | |
| * | |
| * PARAMS | |
| * counter [O] Destination for the current counter reading | |
| * | |
| * RETURNS | |
| * Success: TRUE. counter contains the current reading | |
| * Failure: FALSE. | |
| * | |
| * SEE ALSO | |
| * See QueryPerformanceFrequency. | |
| */ | |
| BOOL WINAPI QueryPerformanceCounter(PLARGE_INTEGER counter) | |
| { | |
| NtQueryPerformanceCounter( counter, NULL ); | |
| return TRUE; | |
| } | |
| /**************************************************************************** | |
| * QueryPerformanceFrequency (KERNEL32.@) | |
| * | |
| * Get the resolution of the performance counter. | |
| * | |
| * PARAMS | |
| * frequency [O] Destination for the counter resolution | |
| * | |
| * RETURNS | |
| * Success. TRUE. Frequency contains the resolution of the counter. | |
| * Failure: FALSE. | |
| * | |
| * SEE ALSO | |
| * See QueryPerformanceCounter. | |
| */ | |
| BOOL WINAPI QueryPerformanceFrequency(PLARGE_INTEGER frequency) | |
| { | |
| LARGE_INTEGER counter; | |
| NtQueryPerformanceCounter( &counter, frequency ); | |
| return TRUE; | |
| } | |
| /*********************************************************************** | |
| * GetSystemInfo [KERNEL32.@] | |
| * | |
| * Get information about the system. | |
| * | |
| * RETURNS | |
| * Nothing. | |
| * | |
| * NOTES | |
| * On the first call it creates cached values, so it doesn't have to determine | |
| * them repeatedly. On Linux, the "/proc/cpuinfo" special file is used. | |
| * | |
| * It also creates a cached flag array for IsProcessorFeaturePresent(). | |
| */ | |
| VOID WINAPI GetSystemInfo( | |
| LPSYSTEM_INFO si /* [out] Destination for system information, may not be NULL */) | |
| { | |
| NTSTATUS nts; | |
| SYSTEM_BASIC_INFORMATION sbi; | |
| SYSTEM_CPU_INFORMATION sci; | |
| TRACE("si=0x%p\n", si); | |
| if ((nts = NtQuerySystemInformation( SystemBasicInformation, &sbi, sizeof(sbi), NULL )) != STATUS_SUCCESS || | |
| (nts = NtQuerySystemInformation( SystemCpuInformation, &sci, sizeof(sci), NULL )) != STATUS_SUCCESS) | |
| { | |
| SetLastError(RtlNtStatusToDosError(nts)); | |
| return; | |
| } | |
| si->u.s.wProcessorArchitecture = sci.Architecture; | |
| si->u.s.wReserved = 0; | |
| si->dwPageSize = sbi.PageSize; | |
| si->lpMinimumApplicationAddress = sbi.LowestUserAddress; | |
| si->lpMaximumApplicationAddress = sbi.HighestUserAddress; | |
| si->dwActiveProcessorMask = sbi.ActiveProcessorsAffinityMask; | |
| si->dwNumberOfProcessors = sbi.NumberOfProcessors; | |
| switch (sci.Architecture) | |
| { | |
| case PROCESSOR_ARCHITECTURE_INTEL: | |
| switch (sci.Level) | |
| { | |
| case 3: si->dwProcessorType = PROCESSOR_INTEL_386; break; | |
| case 4: si->dwProcessorType = PROCESSOR_INTEL_486; break; | |
| case 5: | |
| case 6: si->dwProcessorType = PROCESSOR_INTEL_PENTIUM; break; | |
| default: si->dwProcessorType = PROCESSOR_INTEL_PENTIUM; break; | |
| } | |
| break; | |
| case PROCESSOR_ARCHITECTURE_PPC: | |
| switch (sci.Level) | |
| { | |
| case 1: si->dwProcessorType = PROCESSOR_PPC_601; break; | |
| case 3: | |
| case 6: si->dwProcessorType = PROCESSOR_PPC_603; break; | |
| case 4: si->dwProcessorType = PROCESSOR_PPC_604; break; | |
| case 9: si->dwProcessorType = PROCESSOR_PPC_604; break; | |
| case 20: si->dwProcessorType = PROCESSOR_PPC_620; break; | |
| default: si->dwProcessorType = 0; | |
| } | |
| break; | |
| default: FIXME("Unknown processor architecture %x\n", sci.Architecture); | |
| } | |
| si->dwAllocationGranularity = sbi.AllocationGranularity; | |
| si->wProcessorLevel = sci.Level; | |
| si->wProcessorRevision = sci.Revision; | |
| } | |
| /*********************************************************************** | |
| * GetNativeSystemInfo [KERNEL32.@] | |
| */ | |
| VOID WINAPI GetNativeSystemInfo( | |
| LPSYSTEM_INFO si /* [out] Destination for system information, may not be NULL */) | |
| { | |
| static BOOL reported = FALSE; | |
| if (!reported) { | |
| FIXME("(%p) using GetSystemInfo()\n", si); | |
| reported = TRUE; | |
| } else | |
| TRACE("(%p) using GetSystemInfo()\n", si); | |
| GetSystemInfo(si); | |
| } | |
| /*********************************************************************** | |
| * IsProcessorFeaturePresent [KERNEL32.@] | |
| * | |
| * Determine if the cpu supports a given feature. | |
| * | |
| * RETURNS | |
| * TRUE, If the processor supports feature, | |
| * FALSE otherwise. | |
| */ | |
| BOOL WINAPI IsProcessorFeaturePresent ( | |
| DWORD feature /* [in] Feature number, (PF_ constants from "winnt.h") */) | |
| { | |
| if (feature < 64) | |
| return SHARED_DATA->ProcessorFeatures[feature]; | |
| else | |
| return FALSE; | |
| } |