X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EmbeddedPkg%2FEmbeddedMonotonicCounter%2FEmbeddedMonotonicCounter.c;fp=EmbeddedPkg%2FEmbeddedMonotonicCounter%2FEmbeddedMonotonicCounter.c;h=66ebe67a92ee537e895b8593fac1ed6b761c2dda;hp=0000000000000000000000000000000000000000;hb=2ef2b01e07c02db339f34004445734a2dbdd80e1;hpb=f7753a96ba1653ddd31b01c198a352f6332ac404 diff --git a/EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.c b/EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.c new file mode 100644 index 0000000000..66ebe67a92 --- /dev/null +++ b/EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.c @@ -0,0 +1,82 @@ +/** @file + + Copyright (c) 2008-2009, Apple Inc. All rights reserved. + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + +#include +#include +#include +#include + +#include + +UINT64 gCurrentMonotonicCount = 0; + +EFI_STATUS +EFIAPI +GetNextMonotonicCount ( + OUT UINT64 *Count + ) +{ + if (Count == NULL) { + return EFI_INVALID_PARAMETER; + } + + *Count = gCurrentMonotonicCount++; + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +GetNextHighMonotonicCount ( + OUT UINT32 *HighCount + ) +{ + if (HighCount == NULL) { + return EFI_INVALID_PARAMETER; + } + + gCurrentMonotonicCount += 0x0000000100000000ULL; + + *HighCount = RShiftU64 (gCurrentMonotonicCount, 32) & 0xFFFFFFFF; + + return EFI_SUCCESS; +} + + +EFI_STATUS +EFIAPI +MonotonicCounterDriverInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HANDLE Handle = NULL; + + // Make sure the Monotonic Counter Architectural Protocol is not already installed in the system + ASSERT_PROTOCOL_ALREADY_INSTALLED(NULL, &gEfiMonotonicCounterArchProtocolGuid); + + // Fill in the EFI Boot Services and EFI Runtime Services Monotonic Counter Fields + gBS->GetNextMonotonicCount = GetNextMonotonicCount; + gRT->GetNextHighMonotonicCount = GetNextHighMonotonicCount; + + // Install the Monotonic Counter Architctural Protocol onto a new handle + Status = gBS->InstallMultipleProtocolInterfaces ( + &Handle, + &gEfiMonotonicCounterArchProtocolGuid, NULL, + NULL + ); + return Status; +}