]> git.proxmox.com Git - mirror_edk2.git/blob - EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / EmbeddedPkg / EmbeddedMonotonicCounter / EmbeddedMonotonicCounter.c
1 /** @file
2
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
4
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #include <Uefi.h>
10
11 #include <Library/BaseLib.h>
12 #include <Library/DebugLib.h>
13 #include <Library/UefiBootServicesTableLib.h>
14 #include <Library/UefiRuntimeServicesTableLib.h>
15
16 #include <Protocol/MonotonicCounter.h>
17
18 UINT64 gCurrentMonotonicCount = 0;
19
20 EFI_STATUS
21 EFIAPI
22 GetNextMonotonicCount (
23 OUT UINT64 *Count
24 )
25 {
26 if (Count == NULL) {
27 return EFI_INVALID_PARAMETER;
28 }
29
30 *Count = gCurrentMonotonicCount++;
31 return EFI_SUCCESS;
32 }
33
34 EFI_STATUS
35 EFIAPI
36 GetNextHighMonotonicCount (
37 OUT UINT32 *HighCount
38 )
39 {
40 if (HighCount == NULL) {
41 return EFI_INVALID_PARAMETER;
42 }
43
44 gCurrentMonotonicCount += 0x0000000100000000ULL;
45
46 *HighCount = (UINT32)RShiftU64 (gCurrentMonotonicCount, 32) & 0xFFFFFFFF;
47
48 return EFI_SUCCESS;
49 }
50
51 EFI_STATUS
52 EFIAPI
53 MonotonicCounterDriverInitialize (
54 IN EFI_HANDLE ImageHandle,
55 IN EFI_SYSTEM_TABLE *SystemTable
56 )
57 {
58 EFI_STATUS Status;
59 EFI_HANDLE Handle = NULL;
60
61 // Make sure the Monotonic Counter Architectural Protocol is not already installed in the system
62 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiMonotonicCounterArchProtocolGuid);
63
64 // Fill in the EFI Boot Services and EFI Runtime Services Monotonic Counter Fields
65 gBS->GetNextMonotonicCount = GetNextMonotonicCount;
66 gRT->GetNextHighMonotonicCount = GetNextHighMonotonicCount;
67
68 // Install the Monotonic Counter Architectural Protocol onto a new handle
69 Status = gBS->InstallMultipleProtocolInterfaces (
70 &Handle,
71 &gEfiMonotonicCounterArchProtocolGuid,
72 NULL,
73 NULL
74 );
75 return Status;
76 }