diff options
author | jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-06-16 23:28:16 +0000 |
---|---|---|
committer | jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-06-16 23:28:16 +0000 |
commit | 323940278e0c94d18b3824764236162e2b0dcfcf (patch) | |
tree | bc4c8e569d674e90dc1db82627341c60e526f530 /UefiCpuPkg/CpuDxe/CpuDxe.c | |
parent | 54cd17e9842d82dae3cd78686e05c4dc37a3540d (diff) | |
download | edk2-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.c | 33 |
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;
}
|