• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
GetNextMonotonicCount(OUT UINT64 * Count)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
GetNextHighMonotonicCount(OUT UINT32 * HighCount)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
MonotonicCounterDriverInitialize(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)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 }
83