From: Matthew Carlson <[email protected]> This adds a host based BaseTimerLib that won't assert.
Signed-off-by: Matthew Carlson <[email protected]> --- UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/TimerLibHost.c | 137 ++++++++++++++++++++ UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/BaseTimerLibHost.inf | 40 ++++++ UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/BaseTimerLibHost.uni | 19 +++ UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc | 1 + 4 files changed, 197 insertions(+) diff --git a/UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/TimerLibHost.c b/UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/TimerLibHost.c new file mode 100644 index 000000000000..61304e66f54f --- /dev/null +++ b/UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/TimerLibHost.c @@ -0,0 +1,137 @@ +/** @file + A non-functional instance of the Timer Library. + + Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Base.h> +#include <Library/TimerLib.h> +#include <Library/DebugLib.h> +#include <stdio.h> +#include <stdlib.h> +#include <time.h> + +/** + Stalls the CPU for at least the given number of microseconds. + + Stalls the CPU for the number of microseconds specified by MicroSeconds. + + @param MicroSeconds The minimum number of microseconds to delay. + + @return The value of MicroSeconds inputted. + +**/ +UINTN +EFIAPI +MicroSecondDelay ( + IN UINTN MicroSeconds + ) +{ + return NanoSecondDelay(MicroSeconds * 1000000) / 1000000; +} + +/** + Stalls the CPU for at least the given number of nanoseconds. + + Stalls the CPU for the number of nanoseconds specified by NanoSeconds. + + @param NanoSeconds The minimum number of nanoseconds to delay. + + @return The value of NanoSeconds inputted. + +**/ +UINTN +EFIAPI +NanoSecondDelay ( + IN UINTN NanoSeconds + ) +{ + /*UINT64 start = GetPerformanceCounter(); + UINT64 goal = start + NanoSeconds; + DEBUG(( DEBUG_ERROR, "Delaying for %d ns. Start: %d to %d\n", NanoSeconds, start, goal)); + // check if we need to wait for the counter to roll over + if (start > goal) { + DEBUG(( DEBUG_ERROR, "Start is more than goal\n")); + while (GetPerformanceCounter() > goal); + } + while (GetPerformanceCounter() < goal); + return NanoSeconds;*/ + return 0; +} + +/** + Retrieves the current value of a 64-bit free running performance counter. + + The counter can either count up by 1 or count down by 1. If the physical + performance counter counts by a larger increment, then the counter values + must be translated. The properties of the counter can be retrieved from + GetPerformanceCounterProperties(). + + @return The current value of the free running performance counter. + +**/ +UINT64 +EFIAPI +GetPerformanceCounter ( + VOID + ) +{ + struct timespec ts; + timespec_get(&ts, TIME_UTC); + return ts.tv_nsec; +} + +/** + Retrieves the 64-bit frequency in Hz and the range of performance counter + values. + + If StartValue is not NULL, then the value that the performance counter starts + with immediately after is it rolls over is returned in StartValue. If + EndValue is not NULL, then the value that the performance counter end with + immediately before it rolls over is returned in EndValue. The 64-bit + frequency of the performance counter in Hz is always returned. If StartValue + is less than EndValue, then the performance counter counts up. If StartValue + is greater than EndValue, then the performance counter counts down. For + example, a 64-bit free running counter that counts up would have a StartValue + of 0 and an EndValue of 0xFFFFFFFFFFFFFFFF. A 24-bit free running counter + that counts down would have a StartValue of 0xFFFFFF and an EndValue of 0. + + @param StartValue The value the performance counter starts with when it + rolls over. + @param EndValue The value that the performance counter ends with before + it rolls over. + + @return The frequency in Hz. + +**/ +UINT64 +EFIAPI +GetPerformanceCounterProperties ( + OUT UINT64 *StartValue, OPTIONAL + OUT UINT64 *EndValue OPTIONAL + ) +{ + return (UINT64)(-1); +} + +/** + Converts elapsed ticks of performance counter to time in nanoseconds. + + This function converts the elapsed ticks of running performance counter to + time value in unit of nanoseconds. + + @param Ticks The number of elapsed ticks of running performance counter. + + @return The elapsed time in nanoseconds. + +**/ +UINT64 +EFIAPI +GetTimeInNanoSecond ( + IN UINT64 Ticks + ) +{ + return Ticks; +} diff --git a/UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/BaseTimerLibHost.inf b/UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/BaseTimerLibHost.inf new file mode 100644 index 000000000000..ac091cd10af1 --- /dev/null +++ b/UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/BaseTimerLibHost.inf @@ -0,0 +1,40 @@ +## @file +# NULL instance of Timer Library as a template. +# +# A non-functional instance of the Timer Library that can be used as a template +# for the implementation of a functional timer library instance. This library instance can +# also be used to test build DXE, Runtime, DXE SAL, and DXE SMM modules that require timer +# services as well as EBC modules that require timer services. +# +# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseTimerLibHost + MODULE_UNI_FILE = BaseTimerLibHost.uni + FILE_GUID = a2a413b8-43c3-40cc-a298-be7a214d3564 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = TimerLib + + +# +# VALID_ARCHITECTURES = IA32 X64 EBC AARCH +# + +[Sources] + TimerLibHost.c + + +[Packages] + MdePkg/MdePkg.dec + + +[LibraryClasses] + DebugLib + diff --git a/UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/BaseTimerLibHost.uni b/UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/BaseTimerLibHost.uni new file mode 100644 index 000000000000..6e100bd383d2 --- /dev/null +++ b/UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/BaseTimerLibHost.uni @@ -0,0 +1,19 @@ +// /** @file +// NULL instance of Timer Library as a template. +// +// A non-functional instance of the Timer Library that can be used as a template +// for the implementation of a functional timer library instance. This library instance can +// also be used to test build DXE, Runtime, DXE SAL, and DXE SMM modules that require timer +// services as well as EBC modules that require timer services. +// +// Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "Host instance of Timer Library" + +#string STR_MODULE_DESCRIPTION #language en-US "An instance of the Timer Library that can be used for host based unit tests." + diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index e954968efc52..bc7b7afa1729 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -13,6 +13,7 @@ UnitTestLib|UnitTestFrameworkPkg/Library/UnitTestLib/UnitTestLibCmocka.inf DebugLib|UnitTestFrameworkPkg/Library/Posix/DebugLibPosix/DebugLibPosix.inf MemoryAllocationLib|UnitTestFrameworkPkg/Library/Posix/MemoryAllocationLibPosix/MemoryAllocationLibPosix.inf + TimerLib|UnitTestFrameworkPkg/Library/Host/BaseTimerLibHost/BaseTimerLibHost.inf [BuildOptions] GCC:*_*_*_CC_FLAGS = -fno-pie -- 2.25.1.vfs.1.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#62247): https://edk2.groups.io/g/devel/message/62247 Mute This Topic: https://groups.io/mt/75379678/21656 Group Owner: [email protected] Unsubscribe: https://edk2.groups.io/g/devel/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
