-/*++\r
+/** @file\r
+ Produce the UEFI boot service GetNextMonotonicCount() and runtime service\r
+ GetNextHighMonotonicCount().\r
\r
-Copyright (c) 2006 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
http://opensource.org/licenses/bsd-license.php\r
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
-Module Name:\r
-\r
- MonotonicCounter.c\r
-\r
-Abstract:\r
-\r
- Produced the Monotonic Counter Services as defined in the DXE CIS\r
+**/\r
\r
-Revision History:\r
+#include <Uefi.h>\r
\r
---*/\r
+#include <Protocol/MonotonicCounter.h>\r
\r
-#include "MonotonicCounter.h"\r
+#include <Library/BaseLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/UefiRuntimeLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiRuntimeServicesTableLib.h>\r
\r
//\r
-// The Monotonic Counter Handle\r
+// The handle to install Monotonic Counter Architctural Protocol\r
//\r
EFI_HANDLE mMonotonicCounterHandle = NULL;\r
\r
//\r
-// The current Monotonic count value\r
+// The current monotonic counter value\r
//\r
UINT64 mEfiMtc;\r
\r
//\r
-// Event to use to update the Mtc's high part when wrapping\r
+// Event to update the monotonic Counter's high part when low part overflows.\r
//\r
EFI_EVENT mEfiMtcEvent;\r
\r
//\r
-// EfiMtcName - Variable name of the MTC value\r
+// Name of the variable for the high part of monotonic counter\r
//\r
CHAR16 *mEfiMtcName = (CHAR16 *) L"MTC";\r
\r
//\r
-// EfiMtcGuid - Guid of the MTC value\r
+// Vendor GUID of the variable for the high part of monotonic counter\r
//\r
EFI_GUID mEfiMtcGuid = { 0xeb704011, 0x1402, 0x11d3, { 0x8e, 0x77, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b } };\r
\r
-//\r
-// Worker functions\r
-//\r
-STATIC\r
+/**\r
+ Returns a monotonically increasing count for the platform.\r
+\r
+ This function returns a 64-bit value that is numerically larger then the last\r
+ time the function was called.\r
+ The platform monotonic counter is comprised of two parts: the high 32 bits\r
+ and the low 32 bits. The low 32-bit value is volatile and is reset to zero on\r
+ every system reset. It is increased by 1 on every call to GetNextMonotonicCount().\r
+ The high 32-bit value is nonvolatile and is increased by one on whenever the\r
+ system resets or the low 32-bit counter overflows.\r
+\r
+ @param Count Pointer to returned value.\r
+\r
+ @retval EFI_SUCCESS The next monotonic count was returned.\r
+ @retval EFI_DEVICE_ERROR The device is not functioning properly.\r
+ @retval EFI_INVALID_PARAMETER Count is NULL.\r
+ @retval EFI_UNSUPPORTED This function is called at runtime.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
MonotonicCounterDriverGetNextMonotonicCount (\r
OUT UINT64 *Count\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
{\r
EFI_TPL OldTpl;\r
\r
//\r
- // Can not be called after ExitBootServices()\r
+ // Cannot be called after ExitBootServices()\r
//\r
if (EfiAtRuntime ()) {\r
return EFI_UNSUPPORTED;\r
gBS->RestoreTPL (OldTpl);\r
\r
//\r
- // If the MSB bit of the low part toggled, then signal that the high\r
- // part needs updated now\r
+ // If the low 32-bit counter overflows (MSB bit toggled),\r
+ // then signal that the high part needs update now.\r
//\r
- if ((((UINT32) mEfiMtc) ^ ((UINT32) *Count)) & 0x80000000) {\r
+ if ((((UINT32) mEfiMtc) ^ ((UINT32) *Count)) & BIT31) {\r
gBS->SignalEvent (mEfiMtcEvent);\r
}\r
\r
\r
This function may only be called at Runtime.\r
\r
- @param[out] HighCount Pointer to returned value.\r
+ @param HighCount Pointer to returned value.\r
\r
- @retval EFI_INVALID_PARAMETER If HighCount is NULL.\r
- @retval EFI_SUCCESS Operation is successful.\r
+ @retval EFI_SUCCESS The next high monotonic count was returned.\r
+ @retval EFI_INVALID_PARAMETER HighCount is NULL.\r
+ @retval EFI_DEVICE_ERROR The variable could not be saved due to a hardware failure.\r
@retval EFI_OUT_OF_RESOURCES If variable service reports that not enough storage\r
is available to hold the variable and its data.\r
- @retval EFI_DEVICE_ERROR The variable could not be saved due to a hardware failure.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
MonotonicCounterDriverGetNextHighMonotonicCount (\r
OUT UINT32 *HighCount\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
{\r
EFI_TPL OldTpl;\r
\r
mEfiMtc = LShiftU64 (*HighCount, 32);\r
}\r
//\r
- // Update the NvRam store to match the new high part\r
+ // Update the NV variable to match the new high part\r
//\r
return EfiSetVariable (\r
mEfiMtcName,\r
\r
}\r
\r
-STATIC\r
+/**\r
+ Monotonic counter event handler. This handler updates the high part of monotonic counter.\r
+\r
+ @param Event The event to handle.\r
+ @param Context The event context.\r
+\r
+**/\r
VOID\r
EFIAPI\r
EfiMtcEventHandler (\r
IN EFI_EVENT Event,\r
IN VOID *Context\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Monotonic count event handler. This handler updates the high monotonic count.\r
-\r
-Arguments:\r
-\r
- Event The event to handle\r
- Context The event context\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS The event has been handled properly\r
- EFI_NOT_FOUND An error occurred updating the variable.\r
-\r
---*/\r
{\r
UINT32 HighCount;\r
\r
MonotonicCounterDriverGetNextHighMonotonicCount (&HighCount);\r
}\r
\r
+/**\r
+ Entry point of monotonic counter driver.\r
+\r
+ @param ImageHandle The image handle of this driver.\r
+ @param SystemTable The pointer of EFI_SYSTEM_TABLE.\r
+\r
+ @retval EFI_SUCCESS The initialization is successful.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
MonotonicCounterDriverInitialize (\r
IN EFI_HANDLE ImageHandle,\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
-Arguments:\r
- (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
-\r
-Returns:\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
UINT32 HighCount;\r
UINTN BufferSize;\r
\r
//\r
- // Make sure the Monotonic Counter Architectural Protocol is not already installed in the system\r
+ // Make sure the Monotonic Counter Architectural Protocol has not been installed in the system yet.\r
//\r
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiMonotonicCounterArchProtocolGuid);\r
\r
//\r
- // Initialize event to handle overflows\r
+ // Initialize event to handle low-part overflow\r
//\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_SIGNAL,\r
NULL,\r
&mEfiMtcEvent\r
);\r
-\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
// Continue even if it fails. It will only fail if the variable services are\r
// not functional.\r
//\r
- Status = MonotonicCounterDriverGetNextHighMonotonicCount (&HighCount);\r
+ MonotonicCounterDriverGetNextHighMonotonicCount (&HighCount);\r
\r
//\r
// Fill in the EFI Boot Services and EFI Runtime Services Monotonic Counter Fields\r