summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg/CpuDxe/CpuDxe.c
diff options
context:
space:
mode:
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>2011-06-16 23:28:16 +0000
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>2011-06-16 23:28:16 +0000
commit323940278e0c94d18b3824764236162e2b0dcfcf (patch)
treebc4c8e569d674e90dc1db82627341c60e526f530 /UefiCpuPkg/CpuDxe/CpuDxe.c
parent54cd17e9842d82dae3cd78686e05c4dc37a3540d (diff)
downloadedk2-323940278e0c94d18b3824764236162e2b0dcfcf.tar.gz
edk2-323940278e0c94d18b3824764236162e2b0dcfcf.tar.bz2
edk2-323940278e0c94d18b3824764236162e2b0dcfcf.zip
UefiCpuPkg/CpuDxe: Put CPU to sleep during Idle events
When the MdeModulePkg gCoreEventIdleGuid event is signaled, CpuSleep is called. This will cause the CPU to sleep until the next interrupt occurs. Signed-off-by: jljusten Reviewed-by: mdkinney Reviewed-by: rsun3 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11842 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'UefiCpuPkg/CpuDxe/CpuDxe.c')
-rw-r--r--UefiCpuPkg/CpuDxe/CpuDxe.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.c b/UefiCpuPkg/CpuDxe/CpuDxe.c
index 04d76a5ceb..ad4599dab9 100644
--- a/UefiCpuPkg/CpuDxe/CpuDxe.c
+++ b/UefiCpuPkg/CpuDxe/CpuDxe.c
@@ -1155,6 +1155,25 @@ InitInterruptDescriptorTable (
/**
+ Callback function for idle events.
+
+ @param Event Event whose notification function is being invoked.
+ @param Context The pointer to the notification function's context,
+ which is implementation-dependent.
+
+**/
+VOID
+EFIAPI
+IdleLoopEventCallback (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ CpuSleep ();
+}
+
+
+/**
Initialize the state information for the CPU Architectural Protocol.
@param ImageHandle Image handle this driver.
@@ -1173,6 +1192,7 @@ InitializeCpu (
)
{
EFI_STATUS Status;
+ EFI_EVENT IdleLoopEvent;
//
// Make sure interrupts are disabled
@@ -1204,6 +1224,19 @@ InitializeCpu (
//
RefreshGcdMemoryAttributes ();
+ //
+ // Setup a callback for idle events
+ //
+ Status = gBS->CreateEventEx (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ IdleLoopEventCallback,
+ NULL,
+ &gIdleLoopEventGuid,
+ &IdleLoopEvent
+ );
+ ASSERT_EFI_ERROR (Status);
+
return Status;
}