Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2725 → Rev 2726

/trunk/boot/arch/ia64/loader/gefi/lib/init.c
0,0 → 1,181
/*++
 
Copyright (c) 1998 Intel Corporation
 
Module Name:
 
 
Abstract:
 
 
 
 
Revision History
 
--*/
 
#include "lib.h"
 
VOID
EFIDebugVariable (
VOID
);
 
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;
}
EFIDebugVariable ();
}
 
//
// 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);
}
}
 
VOID
EFIDebugVariable (
VOID
)
{
EFI_STATUS Status;
UINT32 Attributes;
UINTN DataSize;
UINTN NewEFIDebug;
 
DataSize = sizeof(EFIDebug);
Status = RT->GetVariable(L"EFIDebug", &EfiGlobalVariable, &Attributes, &DataSize, &NewEFIDebug);
if (!EFI_ERROR(Status)) {
EFIDebug = NewEFIDebug;
}
}