//\r
UINT64 mEfiMtc;\r
\r
-\r
//\r
// Event to use to update the Mtc's high part when wrapping\r
//\r
return EFI_SUCCESS;\r
}\r
\r
+\r
+/**\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
EFI_STATUS\r
EFIAPI\r
MonotonicCounterDriverGetNextHighMonotonicCount (\r
\r
--*/\r
{\r
- EFI_STATUS Status;\r
EFI_TPL OldTpl;\r
\r
//\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
VOID\r