mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-18 15:27:48 +01:00
7c0aa811ec
Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
252 lines
6.4 KiB
C
252 lines
6.4 KiB
C
/** @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;
|
|
}
|
|
|