diff --git a/reactos/boot/environ/include/bl.h b/reactos/boot/environ/include/bl.h index 7b0d3655834..517a2802da2 100644 --- a/reactos/boot/environ/include/bl.h +++ b/reactos/boot/environ/include/bl.h @@ -1562,6 +1562,11 @@ BlTimeQueryPerformanceCounter ( _Out_opt_ PLARGE_INTEGER Frequency ); +ULONGLONG +BlArchGetPerformanceCounter ( + VOID + ); + /* RESOURCE LOCALE INTERNATIONALIZATION ROUTINES *****************************/ NTSTATUS @@ -1655,6 +1660,18 @@ BlStatusError ( /* UTILITY ROUTINES **********************************************************/ +VOID +BlArchCpuId ( + _In_ ULONG Function, + _In_ ULONG SubFunction, + _Out_ INT* Result + ); + +BOOLEAN +BlArchIsCpuIdFunctionSupported ( + _In_ ULONG Function + ); + VOID BlUtlUpdateProgress ( _In_ ULONG Percentage, diff --git a/reactos/boot/environ/lib/misc/util.c b/reactos/boot/environ/lib/misc/util.c index 9abe95d4fae..7a2d24ba877 100644 --- a/reactos/boot/environ/lib/misc/util.c +++ b/reactos/boot/environ/lib/misc/util.c @@ -776,3 +776,91 @@ BlUtlCheckSum ( return PartialSum; } + +BOOLEAN +Archx86IsCpuidSupported ( + VOID + ) +{ + ULONG CallerFlags, Flags; + + /* Read the original flags, and add the CPUID bit */ + CallerFlags = __readeflags() ^ 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; +} + +ULONGLONG +BlArchGetPerformanceCounter ( + VOID + ) +{ + INT CpuInfo[4]; + + /* Serialize with CPUID, if it exists */ + if (Archx86IsCpuidSupported()) + { + BlArchCpuId(0, 0, CpuInfo); + } + + /* Read the TSC */ + return __rdtsc(); +} + +VOID +BlArchCpuId ( + _In_ ULONG Function, + _In_ ULONG SubFunction, + _Out_ INT* Result + ) +{ + /* Use the intrinsic */ + __cpuidex(Result, Function, SubFunction); +} diff --git a/reactos/boot/environ/lib/mm/i386/mmx86.c b/reactos/boot/environ/lib/mm/i386/mmx86.c index e61aaaf2b9e..65ecc1cb7e2 100644 --- a/reactos/boot/environ/lib/mm/i386/mmx86.c +++ b/reactos/boot/environ/lib/mm/i386/mmx86.c @@ -227,94 +227,6 @@ MmArchTranslateVirtualAddress ( 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