]> git.proxmox.com Git - mirror_edk2.git/blob - EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.c
1dec02e65a9424760b72d1df5d7d145b8b9ae37a
[mirror_edk2.git] / EmbeddedPkg / EmbeddedMonotonicCounter / EmbeddedMonotonicCounter.c
1 /** @file
2
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
4
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include <Uefi.h>
16
17 #include <Library/BaseLib.h>
18 #include <Library/DebugLib.h>
19 #include <Library/UefiBootServicesTableLib.h>
20 #include <Library/UefiRuntimeServicesTableLib.h>
21
22 #include <Protocol/MonotonicCounter.h>
23
24 UINT64 gCurrentMonotonicCount = 0;
25
26 EFI_STATUS
27 EFIAPI
28 GetNextMonotonicCount (
29 OUT UINT64 *Count
30 )
31 {
32 if (Count == NULL) {
33 return EFI_INVALID_PARAMETER;
34 }
35
36 *Count = gCurrentMonotonicCount++;
37 return EFI_SUCCESS;
38 }
39
40 EFI_STATUS
41 EFIAPI
42 GetNextHighMonotonicCount (
43 OUT UINT32 *HighCount
44 )
45 {
46 if (HighCount == NULL) {
47 return EFI_INVALID_PARAMETER;
48 }
49
50 gCurrentMonotonicCount += 0x0000000100000000ULL;
51
52 *HighCount = (UINT32)RShiftU64 (gCurrentMonotonicCount, 32) & 0xFFFFFFFF;
53
54 return EFI_SUCCESS;
55 }
56
57
58 EFI_STATUS
59 EFIAPI
60 MonotonicCounterDriverInitialize (
61 IN EFI_HANDLE ImageHandle,
62 IN EFI_SYSTEM_TABLE *SystemTable
63 )
64 {
65 EFI_STATUS Status;
66 EFI_HANDLE Handle = NULL;
67
68 // Make sure the Monotonic Counter Architectural Protocol is not already installed in the system
69 ASSERT_PROTOCOL_ALREADY_INSTALLED(NULL, &gEfiMonotonicCounterArchProtocolGuid);
70
71 // Fill in the EFI Boot Services and EFI Runtime Services Monotonic Counter Fields
72 gBS->GetNextMonotonicCount = GetNextMonotonicCount;
73 gRT->GetNextHighMonotonicCount = GetNextHighMonotonicCount;
74
75 // Install the Monotonic Counter Architectural Protocol onto a new handle
76 Status = gBS->InstallMultipleProtocolInterfaces (
77 &Handle,
78 &gEfiMonotonicCounterArchProtocolGuid, NULL,
79 NULL
80 );
81 return Status;
82 }