Implement QueryPerformanceCounter() and QueryPerformanceFrequency() for both Unix and Windows.
This has been tested in both Unix and Windows in an application using TimerLib. Signed-off-by: Derek Lin <derek.l...@hpe.com> Signed-off-by: Kitty Chen <kitty.c...@hpe.com> --- EmulatorPkg/Unix/Host/EmuThunk.c | 40 +++++++++++++++++++++----------- EmulatorPkg/Win/Host/WinThunk.c | 10 +++++--- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/EmulatorPkg/Unix/Host/EmuThunk.c b/EmulatorPkg/Unix/Host/EmuThunk.c index 1e9dc99187..92703d3088 100644 --- a/EmulatorPkg/Unix/Host/EmuThunk.c +++ b/EmulatorPkg/Unix/Host/EmuThunk.c @@ -11,6 +11,7 @@ Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR> Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR> +(C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -33,6 +34,7 @@ struct timeval settimer_timeval; UINTN settimer_callback = 0; BOOLEAN gEmulatorInterruptEnabled = FALSE; +UINT64 mPerformanceFrequency = 0; UINTN @@ -236,16 +238,6 @@ SecInterruptEanbled (void) return gEmulatorInterruptEnabled; } - -UINT64 -QueryPerformanceFrequency ( - VOID - ) -{ - // Hard code to nanoseconds - return 1000000000ULL; -} - UINT64 QueryPerformanceCounter ( VOID @@ -274,12 +266,34 @@ QueryPerformanceCounter ( return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom; #else - // Need to figure out what to do for Linux? - return 0; + int status; + struct timespec time; + status = clock_gettime(CLOCK_REALTIME, &time); + return MultU64x32 (time.tv_sec, 1000000000) + time.tv_nsec; + #endif } - +UINT64 +QueryPerformanceFrequency ( + VOID + ) +{ + UINT64 Counter1; + UINT64 Counter2; + if (mPerformanceFrequency) { + return mPerformanceFrequency; + } + // + // Don't know how to query performance frequency in Linux, + // so instead, sleep 0.1 second and calculate it. + // + Counter1 = QueryPerformanceCounter(); + SecSleep (100* 1000 * 1000); + Counter2 = QueryPerformanceCounter(); + mPerformanceFrequency = (Counter2-Counter1) * 10; + return mPerformanceFrequency; +} VOID SecSleep ( diff --git a/EmulatorPkg/Win/Host/WinThunk.c b/EmulatorPkg/Win/Host/WinThunk.c index a77be2a64b..41b5cffe18 100644 --- a/EmulatorPkg/Win/Host/WinThunk.c +++ b/EmulatorPkg/Win/Host/WinThunk.c @@ -1,6 +1,7 @@ /**@file Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> +(C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> SPDX-License-Identifier: BSD-2-Clause-Patent Module Name: @@ -438,8 +439,9 @@ SecQueryPerformanceFrequency ( VOID ) { - // Hard code to nanoseconds - return 1000000000ULL; + UINT64 Frequency; + QueryPerformanceFrequency ((LARGE_INTEGER *) &Frequency); + return Frequency; } UINT64 @@ -447,7 +449,9 @@ SecQueryPerformanceCounter ( VOID ) { - return 0; + UINT64 PerformanceCount; + QueryPerformanceCounter ((LARGE_INTEGER *) &PerformanceCount); + return PerformanceCount; } -- 2.17.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#53565): https://edk2.groups.io/g/devel/message/53565 Mute This Topic: https://groups.io/mt/70266535/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-