Author: ion
Date: Mon Feb 6 19:34:15 2017
New Revision: 73732
URL:
http://svn.reactos.org/svn/reactos?rev=73732&view=rev
Log:
[BOOTLIB]: Don't use __getcallerseflags() in Archx86IsCpuidSupported -- __readeflags
should be good enough.
Modified:
trunk/reactos/boot/environ/include/bl.h
trunk/reactos/boot/environ/lib/misc/util.c
trunk/reactos/boot/environ/lib/mm/i386/mmx86.c
Modified: trunk/reactos/boot/environ/include/bl.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/include/bl.h?…
==============================================================================
--- trunk/reactos/boot/environ/include/bl.h [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/include/bl.h [iso-8859-1] Mon Feb 6 19:34:15 2017
@@ -1562,6 +1562,11 @@
_Out_opt_ PLARGE_INTEGER Frequency
);
+ULONGLONG
+BlArchGetPerformanceCounter (
+ VOID
+ );
+
/* RESOURCE LOCALE INTERNATIONALIZATION ROUTINES *****************************/
NTSTATUS
@@ -1654,6 +1659,18 @@
);
/* UTILITY ROUTINES **********************************************************/
+
+VOID
+BlArchCpuId (
+ _In_ ULONG Function,
+ _In_ ULONG SubFunction,
+ _Out_ INT* Result
+ );
+
+BOOLEAN
+BlArchIsCpuIdFunctionSupported (
+ _In_ ULONG Function
+ );
VOID
BlUtlUpdateProgress (
Modified: trunk/reactos/boot/environ/lib/misc/util.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/misc/util…
==============================================================================
--- trunk/reactos/boot/environ/lib/misc/util.c [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/lib/misc/util.c [iso-8859-1] Mon Feb 6 19:34:15 2017
@@ -776,3 +776,91 @@
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);
+}
Modified: trunk/reactos/boot/environ/lib/mm/i386/mmx86.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/mm/i386/m…
==============================================================================
--- trunk/reactos/boot/environ/lib/mm/i386/mmx86.c [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/lib/mm/i386/mmx86.c [iso-8859-1] Mon Feb 6 19:34:15 2017
@@ -225,94 +225,6 @@
/* Success is if we found a descriptor */
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