You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
3.4 KiB
157 lines
3.4 KiB
/*++
|
|
|
|
Copyright (c) 1998 Intel Corporation
|
|
|
|
Module Name:
|
|
|
|
|
|
Abstract:
|
|
|
|
|
|
|
|
|
|
Revision History
|
|
|
|
--*/
|
|
|
|
#include "lib.h"
|
|
|
|
VOID
|
|
InitializeLib (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes EFI library for use
|
|
|
|
Arguments:
|
|
|
|
Firmware's EFI system table
|
|
|
|
Returns:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
EFI_LOADED_IMAGE *LoadedImage;
|
|
EFI_STATUS Status;
|
|
CHAR8 *LangCode;
|
|
|
|
if (!LibInitialized) {
|
|
LibInitialized = TRUE;
|
|
LibFwInstance = FALSE;
|
|
|
|
/*
|
|
* Set up global pointer to the system table, boot services table,
|
|
* and runtime services table
|
|
*/
|
|
|
|
ST = SystemTable;
|
|
BS = SystemTable->BootServices;
|
|
RT = SystemTable->RuntimeServices;
|
|
/* ASSERT (CheckCrc(0, &ST->Hdr));
|
|
* ASSERT (CheckCrc(0, &BS->Hdr));
|
|
* ASSERT (CheckCrc(0, &RT->Hdr)); */
|
|
|
|
|
|
/*
|
|
* Initialize pool allocation type
|
|
*/
|
|
|
|
if (ImageHandle) {
|
|
Status = BS->HandleProtocol (
|
|
ImageHandle,
|
|
&LoadedImageProtocol,
|
|
(VOID*)&LoadedImage
|
|
);
|
|
|
|
if (!EFI_ERROR(Status)) {
|
|
PoolAllocationType = LoadedImage->ImageDataType;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Initialize Guid table
|
|
*/
|
|
|
|
InitializeGuid();
|
|
|
|
InitializeLibPlatform(ImageHandle,SystemTable);
|
|
}
|
|
|
|
/*
|
|
*
|
|
*/
|
|
|
|
if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) {
|
|
LangCode = LibGetVariable (VarLanguage, &EfiGlobalVariable);
|
|
InitializeUnicodeSupport (LangCode);
|
|
if (LangCode) {
|
|
FreePool (LangCode);
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID
|
|
InitializeUnicodeSupport (
|
|
CHAR8 *LangCode
|
|
)
|
|
{
|
|
EFI_UNICODE_COLLATION_INTERFACE *Ui;
|
|
EFI_STATUS Status;
|
|
CHAR8 *Languages;
|
|
UINTN Index, Position, Length;
|
|
UINTN NoHandles;
|
|
EFI_HANDLE *Handles;
|
|
|
|
/*
|
|
* If we don't know it, lookup the current language code
|
|
*/
|
|
|
|
LibLocateHandle (ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles, &Handles);
|
|
if (!LangCode || !NoHandles) {
|
|
goto Done;
|
|
}
|
|
|
|
/*
|
|
* Check all driver's for a matching language code
|
|
*/
|
|
|
|
for (Index=0; Index < NoHandles; Index++) {
|
|
Status = BS->HandleProtocol (Handles[Index], &UnicodeCollationProtocol, (VOID*)&Ui);
|
|
if (EFI_ERROR(Status)) {
|
|
continue;
|
|
}
|
|
|
|
/*
|
|
* Check for a matching language code
|
|
*/
|
|
|
|
Languages = Ui->SupportedLanguages;
|
|
Length = strlena(Languages);
|
|
for (Position=0; Position < Length; Position += ISO_639_2_ENTRY_SIZE) {
|
|
|
|
/*
|
|
* If this code matches, use this driver
|
|
*/
|
|
|
|
if (CompareMem (Languages+Position, LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
|
|
UnicodeInterface = Ui;
|
|
goto Done;
|
|
}
|
|
}
|
|
}
|
|
|
|
Done:
|
|
/*
|
|
* Cleanup
|
|
*/
|
|
|
|
if (Handles) {
|
|
FreePool (Handles);
|
|
}
|
|
}
|