18#include <Library/BaseMemoryLib.h>
19#include <Library/DebugLib.h>
20#include <Library/UefiBootServicesTableLib.h>
25 IN UINT8 KeyForgotThreshold
32 Target->KeyForgotThreshold = KeyForgotThreshold;
34 if (Target->KeyMapDb == NULL) {
37 if (EFI_ERROR (Status)) {
38 DEBUG ((DEBUG_INFO,
"AppleKeyMapDatabaseProtocol is unavailable - %r\n", Status));
42 Status = Target->KeyMapDb->CreateKeyStrokesBuffer (
45 &Target->KeyMapDbIndex
48 if (EFI_ERROR (Status)) {
49 DEBUG ((DEBUG_INFO,
"CreateKeyStrokesBuffer failed - %r\n", Status));
50 Target->KeyMapDb = NULL;
62 if (Target->KeyMapDb != NULL) {
63 Target->KeyMapDb->RemoveKeyStrokesBuffer (Target->KeyMapDb, Target->KeyMapDbIndex);
64 Target->KeyMapDb = NULL;
67 Target->NumberOfKeys = 0;
68 Target->Modifiers = 0;
69 Target->ModifierCounter = 0;
70 ZeroMem (Target->Keys, sizeof (Target->Keys));
71 ZeroMem (Target->KeyCounters, sizeof (Target->KeyCounters));
84 for (Index = 0; Index < Target->NumberOfKeys; Index++) {
88 if (Target->KeyCounters[Index] + Target->KeyForgotThreshold <= Target->Counter) {
89 Left = Target->NumberOfKeys - (Index + 1);
92 &Target->KeyCounters[Index],
93 &Target->KeyCounters[Index+1],
94 sizeof (Target->KeyCounters[0]) * Left
98 &Target->Keys[Index+1],
99 sizeof (Target->Keys[0]) * Left
103 Target->NumberOfKeys--;
111 if (Target->ModifierCounter + Target->KeyForgotThreshold <= Target->Counter) {
112 Target->Modifiers = 0;
115 return Target->Counter;
128 UINT64 OldestCounter;
132 Target->Modifiers = Modifiers;
133 Target->ModifierCounter = Target->Counter;
142 for (Index = 0; Index < Target->NumberOfKeys; Index++) {
143 if (Target->Keys[Index] == Key) {
147 Target->KeyCounters[Index] = Target->Counter;
152 InsertIndex = Target->NumberOfKeys;
159 OldestCounter = Target->KeyCounters[InsertIndex];
160 for (Index = 1; Index < Target->NumberOfKeys; Index++) {
161 if (OldestCounter > Target->KeyCounters[Index]) {
162 OldestCounter = Target->KeyCounters[Index];
167 Target->NumberOfKeys--;
173 Target->Keys[InsertIndex] = Key;
174 Target->KeyCounters[InsertIndex] = Target->Counter;
175 Target->NumberOfKeys++;
185 if (Target->KeyMapDb != NULL) {
186 Status = Target->KeyMapDb->SetKeyStrokeBufferKeys (
188 Target->KeyMapDbIndex,
190 Target->NumberOfKeys,
194 Status = EFI_NOT_FOUND;
197 if (EFI_ERROR (Status)) {
198 DEBUG ((DEBUG_INFO,
"Failed to submit keys to AppleMapDb - %r\n", Status));
VOID AIKTargetSubmit(IN OUT AIK_TARGET *Target)
VOID AIKTargetWriteEntry(IN OUT AIK_TARGET *Target, IN AMI_EFI_KEY_DATA *KeyData)
UINT64 AIKTargetRefresh(IN OUT AIK_TARGET *Target)
EFI_STATUS AIKTargetInstall(IN OUT AIK_TARGET *Target, IN UINT8 KeyForgotThreshold)
VOID AIKTargetUninstall(IN OUT AIK_TARGET *Target)
#define AIK_TARGET_BUFFER_SIZE
VOID AIKTranslate(IN AMI_EFI_KEY_DATA *KeyData, OUT APPLE_MODIFIER_MAP *Modifiers, OUT APPLE_KEY_CODE *Key)
APPLE_HID_USAGE APPLE_KEY_CODE
UINT16 APPLE_MODIFIER_MAP
EFI_GUID gAppleKeyMapDatabaseProtocolGuid
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)