return Descriptor != NULL;
}
-BOOLEAN
-Archx86IsCpuidSupported (
- VOID
- )
-{
- ULONG CallerFlags, Flags;
-
- /* Read the original flags, and add the CPUID bit */
- CallerFlags = __getcallerseflags() ^ 0x200000;
- __writeeflags(CallerFlags);
-
- /* Read our flags now */
- Flags = __readeflags();
-
- /* Check if the bit stuck */
- return (((CallerFlags ^ Flags) >> 21) & 1) ^ 1;
-}
-
-BOOLEAN
-BlArchIsCpuIdFunctionSupported (
- _In_ ULONG Function
- )
-{
- BOOLEAN Supported;
- INT CpuInfo[4];
-
- /* Check if the CPU supports this instruction */
- Supported = Archx86IsCpuidSupported();
- if (!Supported)
- {
- return FALSE;
- }
-
- /* Check if it's the extended function */
- if (Function >= 0x80000000)
- {
- /* Check if extended functions are supported */
- __cpuid(CpuInfo, 0x80000000);
- if ((CpuInfo[0] & 0xFFFFFF00) != 0x80000000)
- {
- /* Nope */
- return FALSE;
- }
- }
- else
- {
- /* It's a regular function, get the maximum one supported */
- __cpuid(CpuInfo, 0);
- }
-
- /* Check if our function is within bounds */
- if (Function <= CpuInfo[0])
- {
- return TRUE;
- }
-
- /* Nope */
- return FALSE;
-}
-
-VOID
-BlArchCpuId (
- _In_ ULONG Function,
- _In_ ULONG SubFunction,
- _Out_ INT* Result
- )
-{
- /* Use the intrinsic */
- __cpuidex(Result, Function, SubFunction);
-}
-
-ULONGLONG
-BlArchGetPerformanceCounter (
- VOID
- )
-{
- INT CpuInfo[4];
-
- /* Serialize with CPUID, if it exists */
- if (Archx86IsCpuidSupported())
- {
- BlArchCpuId(0, 0, CpuInfo);
- }
-
- /* Read the TSC */
- return __rdtsc();
-}
-
VOID
MmDefpDestroySelfMap (
VOID