/** @file | |
This file contains the entry code to the HII database, which is defined by | |
UEFI 2.1 specification. | |
Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include "HiiDatabase.h" | |
// | |
// Global variables | |
// | |
EFI_EVENT gHiiKeyboardLayoutChanged; | |
BOOLEAN gExportAfterReadyToBoot = FALSE; | |
HII_DATABASE_PRIVATE_DATA mPrivate = { | |
HII_DATABASE_PRIVATE_DATA_SIGNATURE, | |
{ | |
(LIST_ENTRY *)NULL, | |
(LIST_ENTRY *)NULL | |
}, | |
{ | |
(LIST_ENTRY *)NULL, | |
(LIST_ENTRY *)NULL | |
}, | |
{ | |
HiiStringToImage, | |
HiiStringIdToImage, | |
HiiGetGlyph, | |
HiiGetFontInfo | |
}, | |
{ | |
HiiNewImage, | |
HiiGetImage, | |
HiiSetImage, | |
HiiDrawImage, | |
HiiDrawImageId | |
}, | |
{ | |
HiiNewImageEx, | |
HiiGetImageEx, | |
HiiSetImageEx, | |
HiiDrawImageEx, | |
HiiDrawImageIdEx, | |
HiiGetImageInfo | |
}, | |
{ | |
HiiNewString, | |
HiiGetString, | |
HiiSetString, | |
HiiGetLanguages, | |
HiiGetSecondaryLanguages | |
}, | |
{ | |
HiiNewPackageList, | |
HiiRemovePackageList, | |
HiiUpdatePackageList, | |
HiiListPackageLists, | |
HiiExportPackageLists, | |
HiiRegisterPackageNotify, | |
HiiUnregisterPackageNotify, | |
HiiFindKeyboardLayouts, | |
HiiGetKeyboardLayout, | |
HiiSetKeyboardLayout, | |
HiiGetPackageListHandle | |
}, | |
{ | |
HiiConfigRoutingExtractConfig, | |
HiiConfigRoutingExportConfig, | |
HiiConfigRoutingRouteConfig, | |
HiiBlockToConfig, | |
HiiConfigToBlock, | |
HiiGetAltCfg | |
}, | |
{ | |
EfiConfigKeywordHandlerSetData, | |
EfiConfigKeywordHandlerGetData | |
}, | |
{ | |
(LIST_ENTRY *)NULL, | |
(LIST_ENTRY *)NULL | |
}, | |
0, | |
{ | |
(LIST_ENTRY *)NULL, | |
(LIST_ENTRY *)NULL | |
}, | |
EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK), | |
{ | |
0x00000000, | |
0x0000, | |
0x0000, | |
{ 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00 } | |
}, | |
NULL | |
}; | |
/** | |
The default event handler for gHiiKeyboardLayoutChanged | |
event group. | |
This is internal function. | |
@param Event The event that triggered this notification function. | |
@param Context Pointer to the notification functions context. | |
**/ | |
VOID | |
EFIAPI | |
KeyboardLayoutChangeNullEvent ( | |
IN EFI_EVENT Event, | |
IN VOID *Context | |
) | |
{ | |
return; | |
} | |
/** | |
On Ready To Boot Services Event notification handler. | |
To trigger the function that to export the Hii Configuration setting. | |
@param[in] Event Event whose notification function is being invoked | |
@param[in] Context Pointer to the notification function's context | |
**/ | |
VOID | |
EFIAPI | |
OnReadyToBoot ( | |
IN EFI_EVENT Event, | |
IN VOID *Context | |
) | |
{ | |
// | |
// When ready to boot, we begin to export the HiiDatabase date. | |
// And hook all the possible HiiDatabase change actions to export data. | |
// | |
HiiGetDatabaseInfo (&mPrivate.HiiDatabase); | |
HiiGetConfigRespInfo (&mPrivate.HiiDatabase); | |
gExportAfterReadyToBoot = TRUE; | |
gBS->CloseEvent (Event); | |
} | |
/** | |
Initialize HII Database. | |
@param ImageHandle The image handle. | |
@param SystemTable The system table. | |
@retval EFI_SUCCESS The Hii database is setup correctly. | |
@return Other value if failed to create the default event for | |
gHiiKeyboardLayoutChanged. Check gBS->CreateEventEx for | |
details. Or failed to install the protocols. | |
Check gBS->InstallMultipleProtocolInterfaces for details. | |
Or failed to create Ready To Boot Event. | |
Check EfiCreateEventReadyToBootEx for details. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
InitializeHiiDatabase ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
) | |
{ | |
EFI_STATUS Status; | |
EFI_HANDLE Handle; | |
EFI_EVENT ReadyToBootEvent; | |
// | |
// There will be only one HII Database in the system | |
// If there is another out there, someone is trying to install us | |
// again. Fail that scenario. | |
// | |
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiDatabaseProtocolGuid); | |
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiFontProtocolGuid); | |
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiImageProtocolGuid); | |
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiStringProtocolGuid); | |
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiConfigRoutingProtocolGuid); | |
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiConfigKeywordHandlerProtocolGuid); | |
InitializeListHead (&mPrivate.DatabaseList); | |
InitializeListHead (&mPrivate.DatabaseNotifyList); | |
InitializeListHead (&mPrivate.HiiHandleList); | |
InitializeListHead (&mPrivate.FontInfoList); | |
// | |
// Create a event with EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group type. | |
// | |
Status = gBS->CreateEventEx ( | |
EVT_NOTIFY_SIGNAL, | |
TPL_NOTIFY, | |
KeyboardLayoutChangeNullEvent, | |
NULL, | |
&gEfiHiiKeyBoardLayoutGuid, | |
&gHiiKeyboardLayoutChanged | |
); | |
if (EFI_ERROR (Status)) { | |
return Status; | |
} | |
Handle = NULL; | |
Status = gBS->InstallMultipleProtocolInterfaces ( | |
&Handle, | |
&gEfiHiiFontProtocolGuid, | |
&mPrivate.HiiFont, | |
&gEfiHiiStringProtocolGuid, | |
&mPrivate.HiiString, | |
&gEfiHiiDatabaseProtocolGuid, | |
&mPrivate.HiiDatabase, | |
&gEfiHiiConfigRoutingProtocolGuid, | |
&mPrivate.ConfigRouting, | |
&gEfiConfigKeywordHandlerProtocolGuid, | |
&mPrivate.ConfigKeywordHandler, | |
NULL | |
); | |
if (EFI_ERROR (Status)) { | |
return Status; | |
} | |
if (FeaturePcdGet (PcdSupportHiiImageProtocol)) { | |
Status = gBS->InstallMultipleProtocolInterfaces ( | |
&Handle, | |
&gEfiHiiImageProtocolGuid, | |
&mPrivate.HiiImage, | |
&gEfiHiiImageExProtocolGuid, | |
&mPrivate.HiiImageEx, | |
NULL | |
); | |
} | |
if (FeaturePcdGet (PcdHiiOsRuntimeSupport)) { | |
Status = EfiCreateEventReadyToBootEx ( | |
TPL_CALLBACK, | |
OnReadyToBoot, | |
NULL, | |
&ReadyToBootEvent | |
); | |
if (EFI_ERROR (Status)) { | |
return Status; | |
} | |
} | |
return Status; | |
} |