/*++\r
\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. 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
- \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
+Copyright (c) 2006 - 2007, Intel Corporation\r
+All rights reserved. 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
+\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
//\r
// Worker functions\r
//\r
+STATIC\r
EFI_STATUS\r
EFIAPI\r
MonotonicCounterDriverGetNextMonotonicCount (\r
//\r
// Update the monotonic counter with a lock\r
//\r
- OldTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+ OldTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);\r
*Count = mEfiMtc;\r
mEfiMtc++;\r
gBS->RestoreTPL (OldTpl);\r
}\r
\r
\r
-\r
/**\r
- Call back function on EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event.\r
-\r
- Fixup internal data so that the driver is callable in EFI runtime \r
- in virtual mode. Convert gRT to virtual address. gRT is from \r
- UefiRuntimeServicesTableLib class. It is not fixed up by \r
- UefiRuntimeServicesTableLib instance.\r
-\r
- @param Event Event whose notification function is being invoked.\r
- @param Context The context of the Notification context. Not used in\r
- this call back function.\r
+ Returns the next high 32 bits of the platform's monotonic counter.\r
+\r
+ The GetNextHighMonotonicCount() function returns the next high 32 bits\r
+ of the platform's monotonic counter. The platform's monotonic counter is\r
+ comprised of two 32 bit quantities: the high 32 bits and the low 32 bits.\r
+ During boot service time the low 32 bit value is volatile: it is reset to\r
+ zero on every system reset and is increased by 1 on every call to GetNextMonotonicCount().\r
+ The high 32 bit value is non-volatile and is increased by 1 whenever the system resets\r
+ or whenever the low 32 bit count [returned by GetNextMonoticCount()] overflows.\r
+ The GetNextMonotonicCount() function is only available at boot services time.\r
+ If the operating system wishes to extend the platform monotonic counter to runtime,\r
+ it may do so by utilizing GetNextHighMonotonicCount(). To do this, before calling\r
+ ExitBootServices() the operating system would call GetNextMonotonicCount() to obtain\r
+ the current platform monotonic count. The operating system would then provide an\r
+ interface that returns the next count by:\r
+ Adding 1 to the last count.\r
+ Before the lower 32 bits of the count overflows, call GetNextHighMonotonicCount().\r
+ This will increase the high 32 bits of the platform's non-volatile portion of the monotonic\r
+ count by 1.\r
+\r
+ This function may only be called at Runtime.\r
+\r
+ @param[out] 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_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
-VOID\r
-EFIAPI\r
-MonotonicCounterDriverSetVirtualAddressMap (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- gRT->ConvertPointer (0, (VOID **) &gRT);\r
-}\r
-\r
-\r
-\r
+STATIC\r
EFI_STATUS\r
EFIAPI\r
MonotonicCounterDriverGetNextHighMonotonicCount (\r
\r
--*/\r
{\r
- EFI_STATUS Status;\r
EFI_TPL OldTpl;\r
\r
//\r
//\r
// Use a lock if called before ExitBootServices()\r
//\r
- OldTpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
+ OldTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);\r
*HighCount = (UINT32) RShiftU64 (mEfiMtc, 32) + 1;\r
mEfiMtc = LShiftU64 (*HighCount, 32);\r
gBS->RestoreTPL (OldTpl);\r
//\r
// Update the NvRam store to match the new high part\r
//\r
- Status = gRT->SetVariable (\r
- mEfiMtcName,\r
- &mEfiMtcGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof (UINT32),\r
- HighCount\r
- );\r
+ return EfiSetVariable (\r
+ mEfiMtcName,\r
+ &mEfiMtcGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof (UINT32),\r
+ HighCount\r
+ );\r
\r
- return Status;\r
}\r
\r
+STATIC\r
VOID\r
EFIAPI\r
EfiMtcEventHandler (\r
\r
Returns:\r
\r
- EFI_SUCCESS The event has been handled properly \r
+ EFI_SUCCESS The event has been handled properly\r
EFI_NOT_FOUND An error occurred updating the variable.\r
\r
--*/\r
// Initialize event to handle overflows\r
//\r
Status = gBS->CreateEvent (\r
- EFI_EVENT_NOTIFY_SIGNAL,\r
- EFI_TPL_CALLBACK,\r
+ EVT_NOTIFY_SIGNAL,\r
+ TPL_CALLBACK,\r
EfiMtcEventHandler,\r
NULL,\r
&mEfiMtcEvent\r
// Read the last high part\r
//\r
BufferSize = sizeof (UINT32);\r
- Status = gRT->GetVariable (\r
- mEfiMtcName,\r
- &mEfiMtcGuid,\r
- NULL,\r
- &BufferSize,\r
- &HighCount\r
- );\r
+ Status = EfiGetVariable (\r
+ mEfiMtcName,\r
+ &mEfiMtcGuid,\r
+ NULL,\r
+ &BufferSize,\r
+ &HighCount\r
+ );\r
if (EFI_ERROR (Status)) {\r
HighCount = 0;\r
}\r