[PATCH 3/4] ntdll: Use rdtsc(p) for RtlQueryPerformanceCounter when enabled.
Rémi Bernon
rbernon at codeweavers.com
Mon Mar 22 04:42:51 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/ntdll/time.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/dlls/ntdll/time.c b/dlls/ntdll/time.c
index c0eb1f7f923..404a07a4402 100644
--- a/dlls/ntdll/time.c
+++ b/dlls/ntdll/time.c
@@ -39,6 +39,7 @@
#include "wine/exception.h"
#include "wine/debug.h"
#include "ntdll_misc.h"
+#include "intrin.h"
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
@@ -380,6 +381,26 @@ LONGLONG WINAPI RtlGetSystemTimePrecise( void )
*/
BOOL WINAPI DECLSPEC_HOTPATCH RtlQueryPerformanceCounter( LARGE_INTEGER *counter )
{
+ if (user_shared_data->u3.QpcBypassEnabled & SHARED_GLOBAL_FLAGS_QPC_BYPASS_ENABLED)
+ {
+ unsigned __int64 tsc;
+ unsigned int aux;
+
+ if (user_shared_data->u3.QpcBypassEnabled & SHARED_GLOBAL_FLAGS_QPC_BYPASS_USE_RDTSCP)
+ tsc = __rdtscp(&aux);
+ else
+ {
+ if (user_shared_data->u3.QpcBypassEnabled & SHARED_GLOBAL_FLAGS_QPC_BYPASS_USE_MFENCE)
+ __asm__ __volatile__ ( "mfence" : : : "memory" );
+ if (user_shared_data->u3.QpcBypassEnabled & SHARED_GLOBAL_FLAGS_QPC_BYPASS_USE_LFENCE)
+ __asm__ __volatile__ ( "lfence" : : : "memory" );
+ tsc = __rdtsc();
+ }
+
+ counter->QuadPart = (tsc + user_shared_data->QpcBias) >> user_shared_data->u3.QpcShift;
+ return TRUE;
+ }
+
NtQueryPerformanceCounter( counter, NULL );
return TRUE;
}
--
2.30.2
More information about the wine-devel
mailing list