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?rev=73732&r1=73731&r2=73732&view=diff ============================================================================== --- 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.c?rev=73732&r1=73731&r2=73732&view=diff ============================================================================== --- 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/mmx86.c?rev=73732&r1=73731&r2=73732&view=diff ============================================================================== --- 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