summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2011-06-21 23:41:31 +0000
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2011-06-21 23:41:31 +0000
commit1ef41207dc5fe92acb63dc0e4d0e4d9fab2ff3d9 (patch)
tree817ad765aa53295eca94d95ed32590d7686fbfaf
parent090f3fdbf96e4cba61de228b05cbeddeff387066 (diff)
downloadedk2-platforms-1ef41207dc5fe92acb63dc0e4d0e4d9fab2ff3d9.tar.xz
InOsEmuPkg: Add TimerLib for PEI, DXE_CORE, and DXE/EFI drivers/applications.
Start using MdeModulePkg MetronomeDxe driver. Add PEI and DXE_CORE TimerLibs that just call back to the emulator. Add a DXE/UEFI TimerLib that also does a gBS->WaitForEvent() if the stall is for a long period of time. Change the Thunk API for Sleep to nanoseconds. Signed-off-by: andrewfish git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11872 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--InOsEmuPkg/CpuRuntimeDxe/MpService.c2
-rw-r--r--InOsEmuPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.c128
-rw-r--r--InOsEmuPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.inf44
-rw-r--r--InOsEmuPkg/Library/DxeTimerLib/DxeTimerLib.c206
-rw-r--r--InOsEmuPkg/Library/DxeTimerLib/DxeTimerLib.inf51
-rw-r--r--InOsEmuPkg/Library/PeiTimerLib/PeiTimerLib.c174
-rw-r--r--InOsEmuPkg/Library/PeiTimerLib/PeiTimerLib.inf47
-rw-r--r--InOsEmuPkg/MetronomeDxe/Metronome.c125
-rw-r--r--InOsEmuPkg/MetronomeDxe/Metronome.h56
-rw-r--r--InOsEmuPkg/MetronomeDxe/Metronome.inf59
-rw-r--r--InOsEmuPkg/TimerDxe/Timer.c15
-rw-r--r--InOsEmuPkg/Unix/Sec/EmuThunk.c6
-rw-r--r--InOsEmuPkg/Unix/Sec/Gasket.h2
-rw-r--r--InOsEmuPkg/Unix/Sec/SecMain.h2
-rw-r--r--InOsEmuPkg/Unix/UnixX64.dsc7
-rw-r--r--InOsEmuPkg/Unix/UnixX64.fdf4
16 files changed, 672 insertions, 256 deletions
diff --git a/InOsEmuPkg/CpuRuntimeDxe/MpService.c b/InOsEmuPkg/CpuRuntimeDxe/MpService.c
index af3328c50a..7f3b1995f2 100644
--- a/InOsEmuPkg/CpuRuntimeDxe/MpService.c
+++ b/InOsEmuPkg/CpuRuntimeDxe/MpService.c
@@ -1221,7 +1221,7 @@ CpuDriverApIdolLoop (
// Poll 5 times a seconds, 200ms
// Don't want to burn too many system resources doing nothing.
- gEmuThunk->Sleep (200);
+ gEmuThunk->Sleep (200 * 1000);
}
return 0;
diff --git a/InOsEmuPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.c b/InOsEmuPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.c
new file mode 100644
index 0000000000..db3b313829
--- /dev/null
+++ b/InOsEmuPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.c
@@ -0,0 +1,128 @@
+/** @file
+ A non-functional instance of the Timer Library.
+
+ Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php.
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiPei.h>
+#include <Library/TimerLib.h>
+#include <Library/DebugLib.h>
+#include <Library/EmuThunkLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+
+#include <Protocol/Timer.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 * 1000);
+}
+
+
+/**
+ 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
+ )
+{
+ gEmuThunk->Sleep (NanoSeconds);
+ return NanoSeconds;
+}
+
+
+/**
+ 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
+ )
+{
+ return gEmuThunk->QueryPerformanceCounter ();
+}
+
+/**
+ 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
+ )
+{
+
+ if (StartValue != NULL) {
+ *StartValue = 0ULL;
+ }
+ if (EndValue != NULL) {
+ *EndValue = (UINT64)-1LL;
+ }
+
+ return gEmuThunk->QueryPerformanceFrequency ();
+}
+
+
diff --git a/InOsEmuPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.inf b/InOsEmuPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.inf
new file mode 100644
index 0000000000..52d8394368
--- /dev/null
+++ b/InOsEmuPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.inf
@@ -0,0 +1,44 @@
+## @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 - 2010, Intel Corporation. All rights reserved.<BR>
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php.
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = EmuDxeCodeTimerLib
+ FILE_GUID = FB184AF4-A2F2-EE4E-8885-E81E5D8B0135
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = TimerLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER UEFI_APPLICATION
+
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC
+#
+
+[Sources]
+ DxeCoreTimerLib.c
+
+
+[Packages]
+ MdePkg/MdePkg.dec
+ InOsEmuPkg/InOsEmuPkg.dec
+
+[LibraryClasses]
+ DebugLib
+ EmuThunkLib
+
diff --git a/InOsEmuPkg/Library/DxeTimerLib/DxeTimerLib.c b/InOsEmuPkg/Library/DxeTimerLib/DxeTimerLib.c
new file mode 100644
index 0000000000..14bb17f00e
--- /dev/null
+++ b/InOsEmuPkg/Library/DxeTimerLib/DxeTimerLib.c
@@ -0,0 +1,206 @@
+/** @file
+ A non-functional instance of the Timer Library.
+
+ Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php.
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiPei.h>
+#include <Library/BaseLib.h>
+#include <Library/TimerLib.h>
+#include <Library/DebugLib.h>
+#include <Library/EmuThunkLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+
+#include <Protocol/Timer.h>
+
+
+STATIC UINT64 gTimerPeriod = 0;
+STATIC EFI_TIMER_ARCH_PROTOCOL *gTimerAp = NULL;
+STATIC EFI_EVENT gTimerEvent = NULL;
+STATIC VOID *gRegistration = NULL;
+
+VOID
+EFIAPI
+RegisterTimerArchProtocol (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+
+ Status = gBS->LocateProtocol (&gEfiTimerArchProtocolGuid, NULL, (VOID **)&gTimerAp);
+ if (!EFI_ERROR (Status)) {
+ Status = gTimerAp->GetTimerPeriod (gTimerAp, &gTimerPeriod);
+ ASSERT_EFI_ERROR (Status);
+
+ // Convert to Nanoseconds.
+ gTimerPeriod = MultU64x32 (gTimerPeriod, 100);
+
+ if (gTimerEvent == NULL) {
+ Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, (VOID **)&gTimerEvent);
+ ASSERT_EFI_ERROR (Status);
+ }
+ }
+}
+
+
+
+/**
+ 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 * 1000);
+}
+
+
+/**
+ 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
+ )
+{
+ EFI_STATUS Status;
+ UINT64 HundredNanoseconds;
+ UINTN Index;
+
+ if ((gTimerPeriod != 0) &&
+ ((UINT64)NanoSeconds > gTimerPeriod) &&
+ (EfiGetCurrentTpl () == TPL_APPLICATION)) {
+ //
+ // This stall is long, so use gBS->WaitForEvent () to yield CPU to DXE Core
+ //
+
+ HundredNanoseconds = DivU64x32 (NanoSeconds, 100);
+ Status = gBS->SetTimer (gTimerEvent, TimerRelative, HundredNanoseconds);
+ ASSERT_EFI_ERROR (Status);
+
+ Status = gBS->WaitForEvent (sizeof (gTimerEvent)/sizeof (EFI_EVENT), &gTimerEvent, &Index);
+ ASSERT_EFI_ERROR (Status);
+
+ } else {
+ gEmuThunk->Sleep (NanoSeconds);
+ }
+ return NanoSeconds;
+}
+
+
+/**
+ 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
+ )
+{
+ return gEmuThunk->QueryPerformanceCounter ();
+}
+
+/**
+ 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
+ )
+{
+
+ if (StartValue != NULL) {
+ *StartValue = 0ULL;
+ }
+ if (EndValue != NULL) {
+ *EndValue = (UINT64)-1LL;
+ }
+
+ return gEmuThunk->QueryPerformanceFrequency ();
+}
+
+
+/**
+ Register for the Timer AP protocol.
+
+ @param ImageHandle The firmware allocated handle for the EFI image.
+ @param SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
+
+**/
+EFI_STATUS
+EFIAPI
+DxeTimerLibConstructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EfiCreateProtocolNotifyEvent (
+ &gEfiTimerArchProtocolGuid,
+ TPL_CALLBACK,
+ RegisterTimerArchProtocol,
+ NULL,
+ &gRegistration
+ );
+
+ return EFI_SUCCESS;
+}
+
diff --git a/InOsEmuPkg/Library/DxeTimerLib/DxeTimerLib.inf b/InOsEmuPkg/Library/DxeTimerLib/DxeTimerLib.inf
new file mode 100644
index 0000000000..ba1e3e276b
--- /dev/null
+++ b/InOsEmuPkg/Library/DxeTimerLib/DxeTimerLib.inf
@@ -0,0 +1,51 @@
+## @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 - 2010, Intel Corporation. All rights reserved.<BR>
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php.
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = EmuDxeTimerLib
+ FILE_GUID = 74B62391-AD0D-1B4D-8784-151404F9D538
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = TimerLib|DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER UEFI_APPLICATION
+
+ CONSTRUCTOR = DxeTimerLibConstructor
+
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC
+#
+
+[Sources]
+ DxeTimerLib.c
+
+
+[Packages]
+ MdePkg/MdePkg.dec
+ InOsEmuPkg/InOsEmuPkg.dec
+
+[LibraryClasses]
+ BaseLib
+ DebugLib
+ EmuThunkLib
+ UefiLib
+ UefiBootServicesTableLib
+
+[Protocols]
+ gEfiTimerArchProtocolGuid
diff --git a/InOsEmuPkg/Library/PeiTimerLib/PeiTimerLib.c b/InOsEmuPkg/Library/PeiTimerLib/PeiTimerLib.c
new file mode 100644
index 0000000000..caf8a7c14a
--- /dev/null
+++ b/InOsEmuPkg/Library/PeiTimerLib/PeiTimerLib.c
@@ -0,0 +1,174 @@
+/** @file
+ A non-functional instance of the Timer Library.
+
+ Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php.
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiPei.h>
+#include <Library/TimerLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PeiServicesLib.h>
+
+#include <Ppi/EmuThunk.h>
+#include <Protocol/EmuThunk.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 * 1000);
+}
+
+/**
+ 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
+ )
+{
+ EMU_THUNK_PPI *ThunkPpi;
+ EFI_STATUS Status;
+ EMU_THUNK_PROTOCOL *Thunk;
+
+ //
+ // Locate EmuThunkPpi for
+ //
+ Status = PeiServicesLocatePpi (
+ &gEmuThunkPpiGuid,
+ 0,
+ NULL,
+ (VOID **) &ThunkPpi
+ );
+ if (!EFI_ERROR (Status)) {
+ Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
+ Thunk->Sleep (NanoSeconds * 100);
+ 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
+ )
+{
+ EMU_THUNK_PPI *ThunkPpi;
+ EFI_STATUS Status;
+ EMU_THUNK_PROTOCOL *Thunk;
+
+ //
+ // Locate EmuThunkPpi for
+ //
+ Status = PeiServicesLocatePpi (
+ &gEmuThunkPpiGuid,
+ 0,
+ NULL,
+ (VOID **) &ThunkPpi
+ );
+ if (!EFI_ERROR (Status)) {
+ Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
+ return Thunk->QueryPerformanceCounter ();
+ }
+
+ return 0;
+}
+
+/**
+ 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
+ )
+{
+ EMU_THUNK_PPI *ThunkPpi;
+ EFI_STATUS Status;
+ EMU_THUNK_PROTOCOL *Thunk;
+
+ //
+ // Locate EmuThunkPpi for
+ //
+ Status = PeiServicesLocatePpi (
+ &gEmuThunkPpiGuid,
+ 0,
+ NULL,
+ (VOID **) &ThunkPpi
+ );
+ if (!EFI_ERROR (Status)) {
+ if (StartValue != NULL) {
+ *StartValue = 0ULL;
+ }
+ if (EndValue != NULL) {
+ *EndValue = (UINT64)-1LL;
+ }
+
+ Thunk = (EMU_THUNK_PROTOCOL *)ThunkPpi->Thunk ();
+ return Thunk->QueryPerformanceFrequency ();
+ }
+
+ return 0;
+}
diff --git a/InOsEmuPkg/Library/PeiTimerLib/PeiTimerLib.inf b/InOsEmuPkg/Library/PeiTimerLib/PeiTimerLib.inf
new file mode 100644
index 0000000000..c9f4858053
--- /dev/null
+++ b/InOsEmuPkg/Library/PeiTimerLib/PeiTimerLib.inf
@@ -0,0 +1,47 @@
+## @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 - 2010, Intel Corporation. All rights reserved.<BR>
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php.
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = EmuPeiTimerLib
+ FILE_GUID = 6ABE5FDC-AE4B-474E-8E52-9546C96AE536
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = TimerLib|PEIM PEI_CORE SEC
+
+
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC
+#
+
+[Sources]
+ PeiTimerLib.c
+
+
+[Packages]
+ MdePkg/MdePkg.dec
+ InOsEmuPkg/InOsEmuPkg.dec
+
+[LibraryClasses]
+ DebugLib
+ PeiServicesLib
+
+[Ppis]
+ gEmuThunkPpiGuid \ No newline at end of file
diff --git a/InOsEmuPkg/MetronomeDxe/Metronome.c b/InOsEmuPkg/MetronomeDxe/Metronome.c
deleted file mode 100644
index 34f946984f..0000000000
--- a/InOsEmuPkg/MetronomeDxe/Metronome.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*++ @file
- Emu Emulation Metronome Architectural Protocol Driver as defined in DXE CIS
-
-Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
-**/
-
-#include "Metronome.h"
-
-
-//
-// Global Variables
-//
-EFI_METRONOME_ARCH_PROTOCOL mMetronome = {
- EmuMetronomeDriverWaitForTick,
- TICK_PERIOD
-};
-
-//
-// Worker Functions
-//
-
-EFI_STATUS
-EFIAPI
-EmuMetronomeDriverWaitForTick (
- IN EFI_METRONOME_ARCH_PROTOCOL *This,
- IN UINT32 TickNumber
- )
-/*++
-
-Routine Description:
-
- The WaitForTick() function waits for the number of ticks specified by
- TickNumber from a known time source in the platform. If TickNumber of
- ticks are detected, then EFI_SUCCESS is returned. The actual time passed
- between entry of this function and the first tick is between 0 and
- TickPeriod 100 nS units. If you want to guarantee that at least TickPeriod
- time has elapsed, wait for two ticks. This function waits for a hardware
- event to determine when a tick occurs. It is possible for interrupt
- processing, or exception processing to interrupt the execution of the
- WaitForTick() function. Depending on the hardware source for the ticks, it
- is possible for a tick to be missed. This function cannot guarantee that
- ticks will not be missed. If a timeout occurs waiting for the specified
- number of ticks, then EFI_TIMEOUT is returned.
-
-Arguments:
-
- This - The EFI_METRONOME_ARCH_PROTOCOL instance.
- TickNumber - Number of ticks to wait.
-
-Returns:
-
- EFI_SUCCESS - The wait for the number of ticks specified by TickNumber
- succeeded.
-
-**/
-{
- UINT64 SleepTime;
-
- //
- // Calculate the time to sleep. Emu smallest unit to sleep is 1 millisec
- // Tick Period is in 100ns units, divide by 10000 to convert to ms
- //
- SleepTime = DivU64x32 (MultU64x32 ((UINT64) TickNumber, TICK_PERIOD) + 9999, 10000);
- gEmuThunk->Sleep (SleepTime);
-
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-EFIAPI
-EmuMetronomeDriverInitialize (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-/*++
-
-Routine Description:
-
- Initialize the Metronome Architectural Protocol driver
-
-Arguments:
-
- ImageHandle - ImageHandle of the loaded driver
-
-
- SystemTable - Pointer to the System Table
-
-Returns:
-
- EFI_SUCCESS - Metronome Architectural Protocol created
-
- EFI_OUT_OF_RESOURCES - Not enough resources available to initialize driver.
-
- EFI_DEVICE_ERROR - A device error occured attempting to initialize the driver.
-
-**/
-{
- EFI_STATUS Status;
- EFI_HANDLE Handle;
-
-
- //
- // Install the Metronome Architectural Protocol onto a new handle
- //
- Handle = NULL;
- Status = gBS->InstallProtocolInterface (
- &Handle,
- &gEfiMetronomeArchProtocolGuid,
- EFI_NATIVE_INTERFACE,
- &mMetronome
- );
-
- return Status;
-}
diff --git a/InOsEmuPkg/MetronomeDxe/Metronome.h b/InOsEmuPkg/MetronomeDxe/Metronome.h
deleted file mode 100644
index 5115e0b55b..0000000000
--- a/InOsEmuPkg/MetronomeDxe/Metronome.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*++ @file
- Emu Emulation Metronome Architectural Protocol Driver as defined in DXE CIS
-
-Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EMU_THUNK_METRONOME_H_
-#define _EMU_THUNK_METRONOME_H_
-
-#include <PiDxe.h>
-
-#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
-#include <Library/UefiLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/EmuThunkLib.h>
-
-#include <Protocol/Metronome.h>
-
-
-
-//
-// Period of on tick in 100 nanosecond units
-//
-#define TICK_PERIOD 2000
-
-//
-// Function Prototypes
-//
-
-EFI_STATUS
-EFIAPI
-EmuMetronomeDriverInitialize (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- );
-
-EFI_STATUS
-EFIAPI
-EmuMetronomeDriverWaitForTick (
- IN EFI_METRONOME_ARCH_PROTOCOL *This,
- IN UINT32 TickNumber
- );
-
-#endif
diff --git a/InOsEmuPkg/MetronomeDxe/Metronome.inf b/InOsEmuPkg/MetronomeDxe/Metronome.inf
deleted file mode 100644
index 4befdf3d61..0000000000
--- a/InOsEmuPkg/MetronomeDxe/Metronome.inf
+++ /dev/null
@@ -1,59 +0,0 @@
-## @file
-# Emu Emulation Metronome Architectural Protocol Driver as defined in DXE CIS
-#
-# This metronome module simulates metronome by Sleep WinAPI.
-# Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
-# Portions copyright (c) 2011, Apple Inc. All rights reserved.
-#
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution. The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = Metronome
- FILE_GUID = f348f6fe-8985-11db-b4c3-0040d02b1835
- MODULE_TYPE = DXE_DRIVER
- VERSION_STRING = 1.0
-
- ENTRY_POINT = EmuMetronomeDriverInitialize
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = IA32 X64 IPF EBC
-#
-
-[Sources]
- Metronome.h
- Metronome.c
-
-
-[Packages]
- MdePkg/MdePkg.dec
- InOsEmuPkg/InOsEmuPkg.dec
-
-
-[LibraryClasses]
- UefiBootServicesTableLib
- MemoryAllocationLib
- EmuThunkLib
- UefiDriverEntryPoint
- UefiLib
- DebugLib
- BaseLib
-
-
-[Protocols]
- gEfiMetronomeArchProtocolGuid # PROTOCOL ALWAYS_PRODUCED
-
-
-[Depex]
- TRUE
-
diff --git a/InOsEmuPkg/TimerDxe/Timer.c b/InOsEmuPkg/TimerDxe/Timer.c
index 143591395a..d19ced7dd9 100644
--- a/InOsEmuPkg/TimerDxe/Timer.c
+++ b/InOsEmuPkg/TimerDxe/Timer.c
@@ -326,6 +326,14 @@ Returns:
ASSERT_EFI_ERROR (Status);
//
+ // Start the timer thread at the default timer period
+ //
+ Status = mTimer.SetTimerPeriod (&mTimer, DEFAULT_TIMER_TICK_DURATION);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ //
// Install the Timer Architectural Protocol onto a new handle
//
Handle = NULL;
@@ -339,13 +347,6 @@ Returns:
return Status;
}
- //
- // Start the timer thread at the default timer period
- //
- Status = mTimer.SetTimerPeriod (&mTimer, DEFAULT_TIMER_TICK_DURATION);
- if (EFI_ERROR (Status)) {
- return Status;
- }
return EFI_SUCCESS;
}
diff --git a/InOsEmuPkg/Unix/Sec/EmuThunk.c b/InOsEmuPkg/Unix/Sec/EmuThunk.c
index ca8be55a0f..194cf137f9 100644
--- a/InOsEmuPkg/Unix/Sec/EmuThunk.c
+++ b/InOsEmuPkg/Unix/Sec/EmuThunk.c
@@ -250,15 +250,15 @@ QueryPerformanceCounter (
VOID
SecSleep (
- IN UINT64 Milliseconds
+ IN UINT64 Nanoseconds
)
{
struct timespec rq, rm;
struct timeval start, end;
unsigned long MicroSec;
- rq.tv_sec = Milliseconds / 1000;
- rq.tv_nsec = (Milliseconds % 1000) * 1000000;
+ rq.tv_sec = Nanoseconds / 1000000000;
+ rq.tv_nsec = Nanoseconds % 1000000000;
//
// nanosleep gets interrupted by our timer tic.
diff --git a/InOsEmuPkg/Unix/Sec/Gasket.h b/InOsEmuPkg/Unix/Sec/Gasket.h
index e5966964c5..725e250eb3 100644
--- a/InOsEmuPkg/Unix/Sec/Gasket.h
+++ b/InOsEmuPkg/Unix/Sec/Gasket.h
@@ -109,7 +109,7 @@ GasketQueryPerformanceCounter (
VOID
EFIAPI
GasketSecSleep (
- IN UINT64 Milliseconds
+ IN UINT64 Nanoseconds
);
VOID
diff --git a/InOsEmuPkg/Unix/Sec/SecMain.h b/InOsEmuPkg/Unix/Sec/SecMain.h
index 01254de0c7..68cb007ed8 100644
--- a/InOsEmuPkg/Unix/Sec/SecMain.h
+++ b/InOsEmuPkg/Unix/Sec/SecMain.h
@@ -336,7 +336,7 @@ MapFd0 (
-VOID SecSleep (UINT64 Milliseconds);
+VOID SecSleep (UINT64 Nanoseconds);
VOID SecEnableInterrupt (VOID);
VOID SecDisableInterrupt (VOID);
BOOLEAN SecInterruptEanbled (VOID);
diff --git a/InOsEmuPkg/Unix/UnixX64.dsc b/InOsEmuPkg/Unix/UnixX64.dsc
index 4012acfdeb..d6ce60ee30 100644
--- a/InOsEmuPkg/Unix/UnixX64.dsc
+++ b/InOsEmuPkg/Unix/UnixX64.dsc
@@ -124,6 +124,7 @@
SerialPortLib|InOsEmuPkg/Library/PeiEmuSerialPortLib/PeiEmuSerialPortLib.inf
PpiListLib|InOsEmuPkg/Library/SecPpiListLib/SecPpiListLib.inf
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
+ TimerLib|InOsEmuPkg/Library/PeiTimerLib/PeiTimerLib.inf
[LibraryClasses.common.USER_DEFINED, LibraryClasses.common.BASE]
DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
@@ -147,6 +148,7 @@
ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf
SerialPortLib|InOsEmuPkg/Library/PeiEmuSerialPortLib/PeiEmuSerialPortLib.inf
ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
+ TimerLib|InOsEmuPkg/Library/PeiTimerLib/PeiTimerLib.inf
[LibraryClasses.common.PEI_CORE]
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
@@ -161,6 +163,8 @@
PeCoffExtraActionLib|InOsEmuPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActionLib.inf
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+ TimerLib|InOsEmuPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.inf
+ EmuThunkLib|InOsEmuPkg/Library/DxeEmuLib/DxeEmuLib.inf
[LibraryClasses.common.DXE_RUNTIME_DRIVER, LibraryClasses.common.UEFI_DRIVER, LibraryClasses.common.DXE_DRIVER, LibraryClasses.common.UEFI_APPLICATION]
HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
@@ -170,6 +174,7 @@
EmuThunkLib|InOsEmuPkg/Library/DxeEmuLib/DxeEmuLib.inf
PeCoffExtraActionLib|InOsEmuPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActionLib.inf
ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
+ TimerLib|InOsEmuPkg/Library/DxeTimerLib/DxeTimerLib.inf
[LibraryClasses.common.UEFI_DRIVER]
PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
@@ -340,7 +345,7 @@
SerialPortLib|InOsEmuPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.inf
}
- InOsEmuPkg/MetronomeDxe/Metronome.inf
+ MdeModulePkg/Universal/Metronome/Metronome.inf
InOsEmuPkg/RealTimeClockRuntimeDxe/RealTimeClock.inf
InOsEmuPkg/ResetRuntimeDxe/Reset.inf
MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
diff --git a/InOsEmuPkg/Unix/UnixX64.fdf b/InOsEmuPkg/Unix/UnixX64.fdf
index 1f2fe7e633..b6d80a22ea 100644
--- a/InOsEmuPkg/Unix/UnixX64.fdf
+++ b/InOsEmuPkg/Unix/UnixX64.fdf
@@ -165,7 +165,7 @@ APRIORI PEI {
}
APRIORI DXE {
INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
- INF InOsEmuPkg/MetronomeDxe/Metronome.inf
+ INF MdeModulePkg/Universal/Metronome/Metronome.inf
}
INF InOsEmuPkg/Sec/Sec.inf
INF MdeModulePkg/Core/Pei/PeiMain.inf
@@ -187,7 +187,7 @@ INF MdeModulePkg/Core/Dxe/DxeMain.inf
INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
INF MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf
INF MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf
-INF InOsEmuPkg/MetronomeDxe/Metronome.inf
+INF MdeModulePkg/Universal/Metronome/Metronome.inf
INF InOsEmuPkg/RealTimeClockRuntimeDxe/RealTimeClock.inf
INF InOsEmuPkg/ResetRuntimeDxe/Reset.inf
INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf