]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounter.c
Fix a bug for vlan ping failure.
[mirror_edk2.git] / MdeModulePkg / Universal / MonotonicCounterRuntimeDxe / MonotonicCounter.c
index 31efab323ace8afdb975bb70a71dd3abcc40135b..ddb0d2ed4991258512d258478f6020efb840b425 100644 (file)
@@ -1,7 +1,9 @@
-/*++\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 - 2011, 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
@@ -9,68 +11,64 @@ http://opensource.org/licenses/bsd-license.php
 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
+#include <Guid/MtcVendor.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
-//\r
-CHAR16      *mEfiMtcName = (CHAR16 *) L"MTC";\r
+/**\r
+  Returns a monotonically increasing count for the platform.\r
 \r
-//\r
-// EfiMtcGuid - Guid of the MTC value\r
-//\r
-EFI_GUID    mEfiMtcGuid = { 0xeb704011, 0x1402, 0x11d3, { 0x8e, 0x77, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b } };\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
-//\r
-// Worker functions\r
-//\r
-STATIC\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
@@ -90,10 +88,10 @@ Returns:
   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
@@ -124,30 +122,20 @@ Returns:
 \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
@@ -171,11 +159,11 @@ Returns:
     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
-           &mEfiMtcGuid,\r
+           MTC_VARIABLE_NAME,\r
+           &gMtcVendorGuid,\r
            EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
            sizeof (UINT32),\r
            HighCount\r
@@ -183,64 +171,52 @@ Returns:
 \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
@@ -249,7 +225,6 @@ Returns:
                   NULL,\r
                   &mEfiMtcEvent\r
                   );\r
-\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
@@ -257,8 +232,8 @@ Returns:
   //\r
   BufferSize = sizeof (UINT32);\r
   Status = EfiGetVariable (\r
-             mEfiMtcName,\r
-             &mEfiMtcGuid,\r
+             MTC_VARIABLE_NAME,\r
+             &gMtcVendorGuid,\r
              NULL,\r
              &BufferSize,\r
              &HighCount\r
@@ -276,7 +251,7 @@ Returns:
   // 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