Initial import.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
278
MdePkg/Library/UefiLib/Console.c
Normal file
278
MdePkg/Library/UefiLib/Console.c
Normal file
@@ -0,0 +1,278 @@
|
||||
/** @file
|
||||
Mde UEFI library functions.
|
||||
|
||||
Copyright (c) 2006, Intel Corporation<BR>
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name: Console.c
|
||||
|
||||
**/
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
CHAR16 WChar;
|
||||
UINT32 Width;
|
||||
} UNICODE_WIDTH_ENTRY;
|
||||
|
||||
UNICODE_WIDTH_ENTRY mUnicodeWidthTable[] = {
|
||||
//
|
||||
// General script area
|
||||
//
|
||||
{(CHAR16)0x1FFF, 1},
|
||||
/*
|
||||
* Merge the blocks and replace them with the above entry as they fall to
|
||||
* the same category and they are all narrow glyph. This will reduce search
|
||||
* time and table size. The merge will omit the reserved code.
|
||||
*
|
||||
* Remove the above item if below is un-commented.
|
||||
*
|
||||
{(CHAR16)0x007F, 1}, // C0 controls and basic Latin. 0x0000-0x007F
|
||||
{(CHAR16)0x00FF, 1}, // C1 controls and Latin-1 support. 0x0080-0x00FF
|
||||
{(CHAR16)0x017F, 1}, // Latin extended-A. 0x0100-0x017F
|
||||
{(CHAR16)0x024F, 1}, // Latin extended-B. 0x0180-0x024F
|
||||
{(CHAR16)0x02AF, 1}, // IPA extensions. 0x0250-0x02AF
|
||||
{(CHAR16)0x02FF, 1}, // Spacing modifier letters. 0x02B0-0x02FF
|
||||
{(CHAR16)0x036F, 1}, // Combining diacritical marks. 0x0300-0x036F
|
||||
{(CHAR16)0x03FF, 1}, // Greek. 0x0370-0x03FF
|
||||
{(CHAR16)0x04FF, 1}, // Cyrillic. 0x0400-0x04FF
|
||||
{(CHAR16)0x052F, 0}, // Unassigned. As Armenian in ver3.0. 0x0500-0x052F
|
||||
{(CHAR16)0x058F, 1}, // Armenian. 0x0530-0x058F
|
||||
{(CHAR16)0x05FF, 1}, // Hebrew. 0x0590-0x05FF
|
||||
{(CHAR16)0x06FF, 1}, // Arabic. 0x0600-0x06FF
|
||||
{(CHAR16)0x08FF, 0}, // Unassigned. 0x0700-0x08FF
|
||||
{(CHAR16)0x097F, 1}, // Devanagari. 0x0900-0x097F
|
||||
{(CHAR16)0x09FF, 1}, // Bengali. 0x0980-0x09FF
|
||||
{(CHAR16)0x0A7F, 1}, // Gurmukhi. 0x0A00-0x0A7F
|
||||
{(CHAR16)0x0AFF, 1}, // Gujarati. 0x0A80-0x0AFF
|
||||
{(CHAR16)0x0B7F, 1}, // Oriya. 0x0B00-0x0B7F
|
||||
{(CHAR16)0x0BFF, 1}, // Tamil. (See page 7-92). 0x0B80-0x0BFF
|
||||
{(CHAR16)0x0C7F, 1}, // Telugu. 0x0C00-0x0C7F
|
||||
{(CHAR16)0x0CFF, 1}, // Kannada. (See page 7-100). 0x0C80-0x0CFF
|
||||
{(CHAR16)0x0D7F, 1}, // Malayalam (See page 7-104). 0x0D00-0x0D7F
|
||||
{(CHAR16)0x0DFF, 0}, // Unassigned. 0x0D80-0x0DFF
|
||||
{(CHAR16)0x0E7F, 1}, // Thai. 0x0E00-0x0E7F
|
||||
{(CHAR16)0x0EFF, 1}, // Lao. 0x0E80-0x0EFF
|
||||
{(CHAR16)0x0FBF, 1}, // Tibetan. 0x0F00-0x0FBF
|
||||
{(CHAR16)0x109F, 0}, // Unassigned. 0x0FC0-0x109F
|
||||
{(CHAR16)0x10FF, 1}, // Georgian. 0x10A0-0x10FF
|
||||
{(CHAR16)0x11FF, 1}, // Hangul Jamo. 0x1100-0x11FF
|
||||
{(CHAR16)0x1DFF, 0}, // Unassigned. 0x1200-0x1DFF
|
||||
{(CHAR16)0x1EFF, 1}, // Latin extended additional. 0x1E00-0x1EFF
|
||||
{(CHAR16)0x1FFF, 1}, // Greek extended. 0x1F00-0x1FFF
|
||||
*
|
||||
*/
|
||||
|
||||
//
|
||||
// Symbol area
|
||||
//
|
||||
{(CHAR16)0x2FFF, 1},
|
||||
/*
|
||||
* Merge the blocks and replace them with the above entry as they fall to
|
||||
* the same category and they are all narrow glyph. This will reduce search
|
||||
* time and table size. The merge will omit the reserved code.
|
||||
*
|
||||
* Remove the above item if below is un-commented.
|
||||
*
|
||||
{(CHAR16)0x206F, 1}, // General punctuation. (See page7-154). 0x200-0x206F
|
||||
{(CHAR16)0x209F, 1}, // Superscripts and subscripts. 0x2070-0x209F
|
||||
{(CHAR16)0x20CF, 1}, // Currency symbols. 0x20A0-0x20CF
|
||||
{(CHAR16)0x20FF, 1}, // Combining diacritical marks for symbols. 0x20D0-0x20FF
|
||||
{(CHAR16)0x214F, 1}, // Letterlike sympbols. 0x2100-0x214F
|
||||
{(CHAR16)0x218F, 1}, // Number forms. 0x2150-0x218F
|
||||
{(CHAR16)0x21FF, 1}, // Arrows. 0x2190-0x21FF
|
||||
{(CHAR16)0x22FF, 1}, // Mathematical operators. 0x2200-0x22FF
|
||||
{(CHAR16)0x23FF, 1}, // Miscellaneous technical. 0x2300-0x23FF
|
||||
{(CHAR16)0x243F, 1}, // Control pictures. 0x2400-0x243F
|
||||
{(CHAR16)0x245F, 1}, // Optical character recognition. 0x2440-0x245F
|
||||
{(CHAR16)0x24FF, 1}, // Enclosed alphanumerics. 0x2460-0x24FF
|
||||
{(CHAR16)0x257F, 1}, // Box drawing. 0x2500-0x257F
|
||||
{(CHAR16)0x259F, 1}, // Block elements. 0x2580-0x259F
|
||||
{(CHAR16)0x25FF, 1}, // Geometric shapes. 0x25A0-0x25FF
|
||||
{(CHAR16)0x26FF, 1}, // Miscellaneous symbols. 0x2600-0x26FF
|
||||
{(CHAR16)0x27BF, 1}, // Dingbats. 0x2700-0x27BF
|
||||
{(CHAR16)0x2FFF, 0}, // Reserved. 0x27C0-0x2FFF
|
||||
*
|
||||
*/
|
||||
|
||||
//
|
||||
// CJK phonetics and symbol area
|
||||
//
|
||||
{(CHAR16)0x33FF, 2},
|
||||
/*
|
||||
* Merge the blocks and replace them with the above entry as they fall to
|
||||
* the same category and they are all wide glyph. This will reduce search
|
||||
* time and table size. The merge will omit the reserved code.
|
||||
*
|
||||
* Remove the above item if below is un-commented.
|
||||
*
|
||||
{(CHAR16)0x303F, 2}, // CJK symbols and punctuation. 0x3000-0x303F
|
||||
{(CHAR16)0x309F, 2}, // Hiragana. 0x3040-0x309F
|
||||
{(CHAR16)0x30FF, 2}, // Katakana. 0x30A0-0x30FF
|
||||
{(CHAR16)0x312F, 2}, // Bopomofo. 0x3100-0x312F
|
||||
{(CHAR16)0x318F, 2}, // Hangul compatibility jamo. 0x3130-0x318F
|
||||
{(CHAR16)0x319F, 2}, // Kanbun. 0x3190-0x319F
|
||||
{(CHAR16)0x31FF, 0}, // Reserved. As Bopomofo extended in ver3.0. 0x31A0-0x31FF
|
||||
{(CHAR16)0x32FF, 2}, // Enclosed CJK letters and months. 0x3200-0x32FF
|
||||
{(CHAR16)0x33FF, 2}, // CJK compatibility. 0x3300-0x33FF
|
||||
*
|
||||
*/
|
||||
|
||||
//
|
||||
// CJK ideograph area
|
||||
//
|
||||
{(CHAR16)0x9FFF, 2},
|
||||
/*
|
||||
* Merge the blocks and replace them with the above entry as they fall to
|
||||
* the same category and they are all wide glyph. This will reduce search
|
||||
* time and table size. The merge will omit the reserved code.
|
||||
*
|
||||
* Remove the above item if below is un-commented.
|
||||
*
|
||||
{(CHAR16)0x4DFF, 0}, // Reserved. 0x3400-0x4DBF as CJK unified ideographs
|
||||
// extension A in ver3.0. 0x3400-0x4DFF
|
||||
{(CHAR16)0x9FFF, 2}, // CJK unified ideographs. 0x4E00-0x9FFF
|
||||
*
|
||||
*/
|
||||
|
||||
//
|
||||
// Reserved
|
||||
//
|
||||
{(CHAR16)0xABFF, 0}, // Reserved. 0xA000-0xA490 as Yi syllables. 0xA490-0xA4D0
|
||||
// as Yi radicals in ver3.0. 0xA000-0xABFF
|
||||
//
|
||||
// Hangul syllables
|
||||
//
|
||||
{(CHAR16)0xD7FF, 2},
|
||||
/*
|
||||
* Merge the blocks and replace them with the above entry as they fall to
|
||||
* the same category and they are all wide glyph. This will reduce search
|
||||
* time and table size. The merge will omit the reserved code.
|
||||
*
|
||||
* Remove the above item if below is un-commented.
|
||||
*
|
||||
{(CHAR16)0xD7A3, 2}, // Hangul syllables. 0xAC00-0xD7A3
|
||||
{(CHAR16)0xD7FF, 0}, // Reserved. 0xD7A3-0xD7FF
|
||||
*
|
||||
*/
|
||||
|
||||
//
|
||||
// Surrogates area
|
||||
//
|
||||
{(CHAR16)0xDFFF, 0}, // Surrogates, not used now. 0xD800-0xDFFF
|
||||
|
||||
//
|
||||
// Private use area
|
||||
//
|
||||
{(CHAR16)0xF8FF, 0}, // Private use area. 0xE000-0xF8FF
|
||||
|
||||
//
|
||||
// Compatibility area and specials
|
||||
//
|
||||
{(CHAR16)0xFAFF, 2}, // CJK compatibility ideographs. 0xF900-0xFAFF
|
||||
{(CHAR16)0xFB4F, 1}, // Alphabetic presentation forms. 0xFB00-0xFB4F
|
||||
{(CHAR16)0xFDFF, 1}, // Arabic presentation forms-A. 0xFB50-0xFDFF
|
||||
{(CHAR16)0xFE1F, 0}, // Reserved. As variation selectors in ver3.0. 0xFE00-0xFE1F
|
||||
{(CHAR16)0xFE2F, 1}, // Combining half marks. 0xFE20-0xFE2F
|
||||
{(CHAR16)0xFE4F, 2}, // CJK compatibility forms. 0xFE30-0xFE4F
|
||||
{(CHAR16)0xFE6F, 1}, // Small Form Variants. 0xFE50-0xFE6F
|
||||
{(CHAR16)0xFEFF, 1}, // Arabic presentation forms-B. 0xFE70-0xFEFF
|
||||
{(CHAR16)0xFFEF, 1}, // Half width and full width forms. 0xFF00-0xFFEF
|
||||
{(CHAR16)0xFFFF, 0}, // Speicials. 0xFFF0-0xFFFF
|
||||
};
|
||||
|
||||
/**
|
||||
This function computes and returns the width of the Unicode character
|
||||
specified by UnicodeChar.
|
||||
|
||||
@param UnicodeChar A Unicode character.
|
||||
|
||||
@retval 0 The width if UnicodeChar could not be determined.
|
||||
@retval 1 UnicodeChar is a narrow glyph.
|
||||
@retval 2 UnicodeChar is a wide glyph.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
EFIAPI
|
||||
GetGlyphWidth (
|
||||
IN CHAR16 UnicodeChar
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
UINTN Low;
|
||||
UINTN High;
|
||||
UNICODE_WIDTH_ENTRY *Item;
|
||||
|
||||
Item = NULL;
|
||||
Low = 0;
|
||||
High = (sizeof (mUnicodeWidthTable)) / (sizeof (UNICODE_WIDTH_ENTRY)) - 1;
|
||||
while (Low <= High) {
|
||||
Index = (Low + High) >> 1;
|
||||
Item = &(mUnicodeWidthTable[Index]);
|
||||
if (Index == 0) {
|
||||
if (UnicodeChar <= Item->WChar) {
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (UnicodeChar > Item->WChar) {
|
||||
Low = Index + 1;
|
||||
} else if (UnicodeChar <= mUnicodeWidthTable[Index - 1].WChar) {
|
||||
High = Index - 1;
|
||||
} else {
|
||||
//
|
||||
// Index - 1 < UnicodeChar <= Index. Found
|
||||
//
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Low <= High) {
|
||||
return Item->Width;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
This function computes and returns the display length of
|
||||
the Null-terminated Unicode string specified by String.
|
||||
If String is NULL, then 0 is returned.
|
||||
If any of the widths of the Unicode characters in String
|
||||
can not be determined, then 0 is returned.
|
||||
|
||||
@param String A pointer to a Null-terminated Unicode string.
|
||||
|
||||
@return The display length of the Null-terminated Unicode string specified by String.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
EFIAPI
|
||||
UnicodeStringDisplayLength (
|
||||
IN CONST CHAR16 *String
|
||||
)
|
||||
{
|
||||
UINTN Length;
|
||||
UINTN Width;
|
||||
|
||||
Length = 0;
|
||||
while (*String != 0) {
|
||||
Width = GetGlyphWidth (*String);
|
||||
if (Width == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Length += Width;
|
||||
String++;
|
||||
}
|
||||
|
||||
return Length;
|
||||
}
|
650
MdePkg/Library/UefiLib/UefiLib.c
Normal file
650
MdePkg/Library/UefiLib/UefiLib.c
Normal file
@@ -0,0 +1,650 @@
|
||||
/** @file
|
||||
Mde UEFI library functions.
|
||||
|
||||
Copyright (c) 2006, Intel Corporation<BR>
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name: UefiLib.c
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
Compare whether two names of languages are identical.
|
||||
|
||||
@param Language1 Name of language 1.
|
||||
@param Language2 Name of language 2.
|
||||
|
||||
@retval TRUE Language 1 and language 2 are the same.
|
||||
@retval FALSE Language 1 and language 2 are not the same.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
CompareIso639LanguageCode (
|
||||
IN CONST CHAR8 *Language1,
|
||||
IN CONST CHAR8 *Language2
|
||||
)
|
||||
{
|
||||
return (BOOLEAN) (ReadUnaligned24 ((CONST UINT32 *) Language1) == ReadUnaligned24 ((CONST UINT32 *) Language2));
|
||||
}
|
||||
|
||||
/**
|
||||
This function searches the list of configuration tables stored in the EFI System
|
||||
Table for a table with a GUID that matches TableGuid. If a match is found,
|
||||
then a pointer to the configuration table is returned in Table, and EFI_SUCCESS
|
||||
is returned. If a matching GUID is not found, then EFI_NOT_FOUND is returned.
|
||||
|
||||
@param TableGuid Pointer to table's GUID type..
|
||||
@param Table Pointer to the table associated with TableGuid in the EFI System Table.
|
||||
|
||||
@retval EFI_SUCCESS A configuration table matching TableGuid was found.
|
||||
@retval EFI_NOT_FOUND A configuration table matching TableGuid could not be found.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiGetSystemConfigurationTable (
|
||||
IN EFI_GUID *TableGuid,
|
||||
OUT VOID **Table
|
||||
)
|
||||
{
|
||||
EFI_SYSTEM_TABLE *SystemTable;
|
||||
UINTN Index;
|
||||
|
||||
ASSERT (TableGuid != NULL);
|
||||
ASSERT (Table != NULL);
|
||||
|
||||
SystemTable = gST;
|
||||
*Table = NULL;
|
||||
for (Index = 0; Index < SystemTable->NumberOfTableEntries; Index++) {
|
||||
if (CompareGuid (TableGuid, &(SystemTable->ConfigurationTable[Index].VendorGuid))) {
|
||||
*Table = SystemTable->ConfigurationTable[Index].VendorTable;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
This function causes the notification function to be executed for every protocol
|
||||
of type ProtocolGuid instance that exists in the system when this function is
|
||||
invoked. In addition, every time a protocol of type ProtocolGuid instance is
|
||||
installed or reinstalled, the notification function is also executed.
|
||||
|
||||
@param ProtocolGuid Supplies GUID of the protocol upon whose installation the event is fired.
|
||||
@param NotifyTpl Supplies the task priority level of the event notifications.
|
||||
@param NotifyFunction Supplies the function to notify when the event is signaled.
|
||||
@param NotifyContext The context parameter to pass to NotifyFunction.
|
||||
@param Registration A pointer to a memory location to receive the registration value.
|
||||
|
||||
@return The notification event that was created.
|
||||
|
||||
**/
|
||||
EFI_EVENT
|
||||
EFIAPI
|
||||
EfiCreateProtocolNotifyEvent(
|
||||
IN EFI_GUID *ProtocolGuid,
|
||||
IN EFI_TPL NotifyTpl,
|
||||
IN EFI_EVENT_NOTIFY NotifyFunction,
|
||||
IN VOID *NotifyContext, OPTIONAL
|
||||
OUT VOID *Registration
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_EVENT Event;
|
||||
|
||||
//
|
||||
// Create the event
|
||||
//
|
||||
|
||||
Status = gBS->CreateEvent (
|
||||
EFI_EVENT_NOTIFY_SIGNAL,
|
||||
NotifyTpl,
|
||||
NotifyFunction,
|
||||
NotifyContext,
|
||||
&Event
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Register for protocol notifactions on this event
|
||||
//
|
||||
|
||||
Status = gBS->RegisterProtocolNotify (
|
||||
ProtocolGuid,
|
||||
Event,
|
||||
Registration
|
||||
);
|
||||
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Kick the event so we will perform an initial pass of
|
||||
// current installed drivers
|
||||
//
|
||||
|
||||
gBS->SignalEvent (Event);
|
||||
return Event;
|
||||
}
|
||||
|
||||
/**
|
||||
This function creates an event using NotifyTpl, NoifyFunction, and NotifyContext.
|
||||
This event is signaled with EfiNamedEventSignal(). This provide the ability for
|
||||
one or more listeners on the same event named by the GUID specified by Name.
|
||||
|
||||
@param Name Supplies GUID name of the event.
|
||||
@param NotifyTpl Supplies the task priority level of the event notifications.
|
||||
@param NotifyFunction Supplies the function to notify when the event is signaled.
|
||||
@param NotifyContext The context parameter to pass to NotifyFunction.
|
||||
@param Registration A pointer to a memory location to receive the registration value.
|
||||
|
||||
@retval EFI_SUCCESS A named event was created.
|
||||
@retval EFI_OUT_OF_RESOURCES There are not enough resource to create the named event.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiNamedEventListen (
|
||||
IN CONST EFI_GUID *Name,
|
||||
IN EFI_TPL NotifyTpl,
|
||||
IN EFI_EVENT_NOTIFY NotifyFunction,
|
||||
IN CONST VOID *NotifyContext, OPTIONAL
|
||||
OUT VOID *Registration OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_EVENT Event;
|
||||
VOID *RegistrationLocal;
|
||||
|
||||
//
|
||||
// Create event
|
||||
//
|
||||
Status = gBS->CreateEvent (
|
||||
EFI_EVENT_NOTIFY_SIGNAL,
|
||||
NotifyTpl,
|
||||
NotifyFunction,
|
||||
(VOID *) NotifyContext,
|
||||
&Event
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// The Registration is not optional to RegisterProtocolNotify().
|
||||
// To make it optional to EfiNamedEventListen(), may need to substitute with a local.
|
||||
//
|
||||
if (Registration != NULL) {
|
||||
RegistrationLocal = Registration;
|
||||
} else {
|
||||
RegistrationLocal = &RegistrationLocal;
|
||||
}
|
||||
|
||||
//
|
||||
// Register for an installation of protocol interface
|
||||
//
|
||||
|
||||
Status = gBS->RegisterProtocolNotify (
|
||||
(EFI_GUID *) Name,
|
||||
Event,
|
||||
RegistrationLocal
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
This function signals the named event specified by Name. The named event must
|
||||
have been created with EfiNamedEventListen().
|
||||
|
||||
@param Name Supplies GUID name of the event.
|
||||
|
||||
@retval EFI_SUCCESS A named event was signaled.
|
||||
@retval EFI_OUT_OF_RESOURCES There are not enough resource to signal the named event.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiNamedEventSignal (
|
||||
IN CONST EFI_GUID *Name
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
Handle = NULL;
|
||||
Status = gBS->InstallProtocolInterface (
|
||||
&Handle,
|
||||
(EFI_GUID *) Name,
|
||||
EFI_NATIVE_INTERFACE,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = gBS->UninstallProtocolInterface (
|
||||
Handle,
|
||||
(EFI_GUID *) Name,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function initializes a basic mutual exclusion lock to the released state
|
||||
and returns the lock. Each lock provides mutual exclusion access at its task
|
||||
priority level. Since there is no preemption or multiprocessor support in EFI,
|
||||
acquiring the lock only consists of raising to the locks TPL.
|
||||
|
||||
@param Lock A pointer to the lock data structure to initialize.
|
||||
@param Priority EFI TPL associated with the lock.
|
||||
|
||||
@return The lock.
|
||||
|
||||
**/
|
||||
EFI_LOCK *
|
||||
EFIAPI
|
||||
EfiInitializeLock (
|
||||
IN OUT EFI_LOCK *Lock,
|
||||
IN EFI_TPL Priority
|
||||
)
|
||||
{
|
||||
ASSERT (Lock != NULL);
|
||||
ASSERT (Priority <= EFI_TPL_HIGH_LEVEL);
|
||||
|
||||
Lock->Tpl = Priority;
|
||||
Lock->OwnerTpl = EFI_TPL_APPLICATION;
|
||||
Lock->Lock = EfiLockReleased ;
|
||||
return Lock;
|
||||
}
|
||||
|
||||
/**
|
||||
This function raises the system<65><6D>s current task priority level to the task
|
||||
priority level of the mutual exclusion lock. Then, it places the lock in the
|
||||
acquired state.
|
||||
|
||||
@param Priority The task priority level of the lock.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
EfiAcquireLock (
|
||||
IN EFI_LOCK *Lock
|
||||
)
|
||||
{
|
||||
ASSERT (Lock != NULL);
|
||||
ASSERT (Lock->Lock == EfiLockReleased);
|
||||
|
||||
Lock->OwnerTpl = gBS->RaiseTPL (Lock->Tpl);
|
||||
Lock->Lock = EfiLockAcquired;
|
||||
}
|
||||
|
||||
/**
|
||||
This function raises the system<65><6D>s current task priority level to the task
|
||||
priority level of the mutual exclusion lock. Then, it attempts to place the
|
||||
lock in the acquired state.
|
||||
|
||||
@param Lock A pointer to the lock to acquire.
|
||||
|
||||
@retval EFI_SUCCESS The lock was acquired.
|
||||
@retval EFI_ACCESS_DENIED The lock could not be acquired because it is already owned.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiAcquireLockOrFail (
|
||||
IN EFI_LOCK *Lock
|
||||
)
|
||||
{
|
||||
|
||||
ASSERT (Lock != NULL);
|
||||
ASSERT (Lock->Lock != EfiLockUninitialized);
|
||||
|
||||
if (Lock->Lock == EfiLockAcquired) {
|
||||
//
|
||||
// Lock is already owned, so bail out
|
||||
//
|
||||
return EFI_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
Lock->OwnerTpl = gBS->RaiseTPL (Lock->Tpl);
|
||||
|
||||
Lock->Lock = EfiLockAcquired;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
This function transitions a mutual exclusion lock from the acquired state to
|
||||
the released state, and restores the system<65><6D>s task priority level to its
|
||||
previous level.
|
||||
|
||||
@param Lock A pointer to the lock to release.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
EfiReleaseLock (
|
||||
IN EFI_LOCK *Lock
|
||||
)
|
||||
{
|
||||
EFI_TPL Tpl;
|
||||
|
||||
ASSERT (Lock != NULL);
|
||||
ASSERT (Lock->Lock == EfiLockAcquired);
|
||||
|
||||
Tpl = Lock->OwnerTpl;
|
||||
|
||||
Lock->Lock = EfiLockReleased;
|
||||
|
||||
gBS->RestoreTPL (Tpl);
|
||||
}
|
||||
|
||||
/**
|
||||
This function looks up a Unicode string in UnicodeStringTable. If Language is
|
||||
a member of SupportedLanguages and a Unicode string is found in UnicodeStringTable
|
||||
that matches the language code specified by Language, then it is returned in
|
||||
UnicodeString.
|
||||
|
||||
@param Language A pointer to the ISO 639-2 language code for the
|
||||
Unicode string to look up and return.
|
||||
@param SupportedLanguages A pointer to the set of ISO 639-2 language codes
|
||||
that the Unicode string table supports. Language
|
||||
must be a member of this set.
|
||||
@param UnicodeStringTable A pointer to the table of Unicode strings.
|
||||
@param UnicodeString A pointer to the Unicode string from UnicodeStringTable
|
||||
that matches the language specified by Language.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string that matches the language
|
||||
specified by Language was found
|
||||
in the table of Unicoide strings UnicodeStringTable,
|
||||
and it was returned in UnicodeString.
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER UnicodeString is NULL.
|
||||
@retval EFI_UNSUPPORTED SupportedLanguages is NULL.
|
||||
@retval EFI_UNSUPPORTED UnicodeStringTable is NULL.
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not a
|
||||
member of SupportedLanguages.
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not
|
||||
supported by UnicodeStringTable.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
LookupUnicodeString (
|
||||
IN CONST CHAR8 *Language,
|
||||
IN CONST CHAR8 *SupportedLanguages,
|
||||
IN CONST EFI_UNICODE_STRING_TABLE *UnicodeStringTable,
|
||||
OUT CHAR16 **UnicodeString
|
||||
)
|
||||
{
|
||||
//
|
||||
// Make sure the parameters are valid
|
||||
//
|
||||
if (Language == NULL || UnicodeString == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// If there are no supported languages, or the Unicode String Table is empty, then the
|
||||
// Unicode String specified by Language is not supported by this Unicode String Table
|
||||
//
|
||||
if (SupportedLanguages == NULL || UnicodeStringTable == NULL) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Make sure Language is in the set of Supported Languages
|
||||
//
|
||||
while (*SupportedLanguages != 0) {
|
||||
if (CompareIso639LanguageCode (Language, SupportedLanguages)) {
|
||||
|
||||
//
|
||||
// Search the Unicode String Table for the matching Language specifier
|
||||
//
|
||||
while (UnicodeStringTable->Language != NULL) {
|
||||
if (CompareIso639LanguageCode (Language, UnicodeStringTable->Language)) {
|
||||
|
||||
//
|
||||
// A matching string was found, so return it
|
||||
//
|
||||
*UnicodeString = UnicodeStringTable->UnicodeString;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
UnicodeStringTable++;
|
||||
}
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
SupportedLanguages += 3;
|
||||
}
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/**
|
||||
This function adds a Unicode string to UnicodeStringTable.
|
||||
If Language is a member of SupportedLanguages then UnicodeString is added to
|
||||
UnicodeStringTable. New buffers are allocated for both Language and
|
||||
UnicodeString. The contents of Language and UnicodeString are copied into
|
||||
these new buffers. These buffers are automatically freed when
|
||||
FreeUnicodeStringTable() is called.
|
||||
|
||||
@param Language A pointer to the ISO 639-2 language code for the Unicode
|
||||
string to add.
|
||||
@param SupportedLanguages A pointer to the set of ISO 639-2 language codes
|
||||
that the Unicode string table supports.
|
||||
Language must be a member of this set.
|
||||
@param UnicodeStringTable A pointer to the table of Unicode strings.
|
||||
@param UnicodeString A pointer to the Unicode string to add.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string that matches the language
|
||||
specified by Language was found in the table of
|
||||
Unicode strings UnicodeStringTable, and it was
|
||||
returned in UnicodeString.
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER UnicodeString is NULL.
|
||||
@retval EFI_INVALID_PARAMETER UnicodeString is an empty string.
|
||||
@retval EFI_UNSUPPORTED SupportedLanguages is NULL.
|
||||
@retval EFI_ALREADY_STARTED A Unicode string with language Language is
|
||||
already present in UnicodeStringTable.
|
||||
@retval EFI_OUT_OF_RESOURCES There is not enough memory to add another
|
||||
Unicode string to UnicodeStringTable.
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not a
|
||||
member of SupportedLanguages.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AddUnicodeString (
|
||||
IN CONST CHAR8 *Language,
|
||||
IN CONST CHAR8 *SupportedLanguages,
|
||||
IN EFI_UNICODE_STRING_TABLE **UnicodeStringTable,
|
||||
IN CONST CHAR16 *UnicodeString
|
||||
)
|
||||
{
|
||||
UINTN NumberOfEntries;
|
||||
EFI_UNICODE_STRING_TABLE *OldUnicodeStringTable;
|
||||
EFI_UNICODE_STRING_TABLE *NewUnicodeStringTable;
|
||||
UINTN UnicodeStringLength;
|
||||
|
||||
//
|
||||
// Make sure the parameter are valid
|
||||
//
|
||||
if (Language == NULL || UnicodeString == NULL || UnicodeStringTable == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// If there are no supported languages, then a Unicode String can not be added
|
||||
//
|
||||
if (SupportedLanguages == NULL) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// If the Unicode String is empty, then a Unicode String can not be added
|
||||
//
|
||||
if (UnicodeString[0] == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// Make sure Language is a member of SupportedLanguages
|
||||
//
|
||||
while (*SupportedLanguages != 0) {
|
||||
if (CompareIso639LanguageCode (Language, SupportedLanguages)) {
|
||||
|
||||
//
|
||||
// Determine the size of the Unicode String Table by looking for a NULL Language entry
|
||||
//
|
||||
NumberOfEntries = 0;
|
||||
if (*UnicodeStringTable != NULL) {
|
||||
OldUnicodeStringTable = *UnicodeStringTable;
|
||||
while (OldUnicodeStringTable->Language != NULL) {
|
||||
if (CompareIso639LanguageCode (Language, OldUnicodeStringTable->Language)) {
|
||||
return EFI_ALREADY_STARTED;
|
||||
}
|
||||
|
||||
OldUnicodeStringTable++;
|
||||
NumberOfEntries++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate space for a new Unicode String Table. It must hold the current number of
|
||||
// entries, plus 1 entry for the new Unicode String, plus 1 entry for the end of table
|
||||
// marker
|
||||
//
|
||||
NewUnicodeStringTable = AllocatePool ((NumberOfEntries + 2) * sizeof (EFI_UNICODE_STRING_TABLE));
|
||||
if (NewUnicodeStringTable == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
//
|
||||
// If the current Unicode String Table contains any entries, then copy them to the
|
||||
// newly allocated Unicode String Table.
|
||||
//
|
||||
if (*UnicodeStringTable != NULL) {
|
||||
CopyMem (
|
||||
NewUnicodeStringTable,
|
||||
*UnicodeStringTable,
|
||||
NumberOfEntries * sizeof (EFI_UNICODE_STRING_TABLE)
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate space for a copy of the Language specifier
|
||||
//
|
||||
NewUnicodeStringTable[NumberOfEntries].Language = AllocateCopyPool (3, Language);
|
||||
if (NewUnicodeStringTable[NumberOfEntries].Language == NULL) {
|
||||
gBS->FreePool (NewUnicodeStringTable);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
//
|
||||
// Compute the length of the Unicode String
|
||||
//
|
||||
for (UnicodeStringLength = 0; UnicodeString[UnicodeStringLength] != 0; UnicodeStringLength++)
|
||||
;
|
||||
|
||||
//
|
||||
// Allocate space for a copy of the Unicode String
|
||||
//
|
||||
NewUnicodeStringTable[NumberOfEntries].UnicodeString = AllocateCopyPool (
|
||||
(UnicodeStringLength + 1) * sizeof (CHAR16),
|
||||
UnicodeString
|
||||
);
|
||||
if (NewUnicodeStringTable[NumberOfEntries].UnicodeString == NULL) {
|
||||
gBS->FreePool (NewUnicodeStringTable[NumberOfEntries].Language);
|
||||
gBS->FreePool (NewUnicodeStringTable);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
//
|
||||
// Mark the end of the Unicode String Table
|
||||
//
|
||||
NewUnicodeStringTable[NumberOfEntries + 1].Language = NULL;
|
||||
NewUnicodeStringTable[NumberOfEntries + 1].UnicodeString = NULL;
|
||||
|
||||
//
|
||||
// Free the old Unicode String Table
|
||||
//
|
||||
if (*UnicodeStringTable != NULL) {
|
||||
gBS->FreePool (*UnicodeStringTable);
|
||||
}
|
||||
|
||||
//
|
||||
// Point UnicodeStringTable at the newly allocated Unicode String Table
|
||||
//
|
||||
*UnicodeStringTable = NewUnicodeStringTable;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
SupportedLanguages += 3;
|
||||
}
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/**
|
||||
This function frees the table of Unicode strings in UnicodeStringTable.
|
||||
If UnicodeStringTable is NULL, then EFI_SUCCESS is returned.
|
||||
Otherwise, each language code, and each Unicode string in the Unicode string
|
||||
table are freed, and EFI_SUCCESS is returned.
|
||||
|
||||
@param UnicodeStringTable A pointer to the table of Unicode strings.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string table was freed.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FreeUnicodeStringTable (
|
||||
IN EFI_UNICODE_STRING_TABLE *UnicodeStringTable
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
//
|
||||
// If the Unicode String Table is NULL, then it is already freed
|
||||
//
|
||||
if (UnicodeStringTable == NULL) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop through the Unicode String Table until we reach the end of table marker
|
||||
//
|
||||
for (Index = 0; UnicodeStringTable[Index].Language != NULL; Index++) {
|
||||
|
||||
//
|
||||
// Free the Language string from the Unicode String Table
|
||||
//
|
||||
gBS->FreePool (UnicodeStringTable[Index].Language);
|
||||
|
||||
//
|
||||
// Free the Unicode String from the Unicode String Table
|
||||
//
|
||||
if (UnicodeStringTable[Index].UnicodeString != NULL) {
|
||||
gBS->FreePool (UnicodeStringTable[Index].UnicodeString);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Free the Unicode String Table itself
|
||||
//
|
||||
gBS->FreePool (UnicodeStringTable);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
30
MdePkg/Library/UefiLib/UefiLib.mbd
Normal file
30
MdePkg/Library/UefiLib/UefiLib.mbd
Normal file
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (c) 2006, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
-->
|
||||
<LibraryModuleBuildDescription xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
|
||||
<MbdLibHeader>
|
||||
<BaseName>UefiLib</BaseName>
|
||||
<Guid>3a004ba5-efe0-4a61-9f1a-267a46ae5ba9</Guid>
|
||||
<Version>0</Version>
|
||||
<Description>Library to abstract Framework extensions that conflict with UEFI 2.0 Specification</Description>
|
||||
<Copyright>Copyright (c) 2004-2006, Intel Corporation</Copyright>
|
||||
<License>
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
</License>
|
||||
<Created>2006-03-09 23:12</Created>
|
||||
<Modified>2006-03-19 15:17</Modified>
|
||||
</MbdLibHeader>
|
||||
</LibraryModuleBuildDescription>
|
61
MdePkg/Library/UefiLib/UefiLib.msa
Normal file
61
MdePkg/Library/UefiLib/UefiLib.msa
Normal file
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (c) 2006, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
-->
|
||||
<LibraryModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
|
||||
<MsaLibHeader>
|
||||
<BaseName>UefiLib</BaseName>
|
||||
<ModuleType>UEFI_DRIVER</ModuleType>
|
||||
<ComponentType>LIBRARY</ComponentType>
|
||||
<Guid>3a004ba5-efe0-4a61-9f1a-267a46ae5ba9</Guid>
|
||||
<Version>0</Version>
|
||||
<Abstract>Component description file for the entry point to a EFIDXE Drivers</Abstract>
|
||||
<Description>Library to abstract Framework extensions that conflict with UEFI 2.0 Specification</Description>
|
||||
<Copyright>Copyright (c) 2004-2006, Intel Corporation</Copyright>
|
||||
<License>
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
</License>
|
||||
<Specification>0</Specification>
|
||||
<Created>2006-03-09 23:12</Created>
|
||||
<Updated>2006-03-19 15:17</Updated>
|
||||
</MsaLibHeader>
|
||||
<LibraryClassDefinitions>
|
||||
<LibraryClass Usage="ALWAYS_PRODUCED">UefiLib</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">UefiBootServicesTableLib</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">BaseLib</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">BaseMemoryLib</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">DebugLib</LibraryClass>
|
||||
<LibraryClass Usage="ALWAYS_CONSUMED">MemoryAllocationLib</LibraryClass>
|
||||
</LibraryClassDefinitions>
|
||||
<SourceFiles>
|
||||
<Filename>UefiLib.c</Filename>
|
||||
<Filename>Console.c</Filename>
|
||||
<Filename>UefiNotTiano.c</Filename>
|
||||
</SourceFiles>
|
||||
<Includes>
|
||||
<PackageName>MdePkg</PackageName>
|
||||
</Includes>
|
||||
<Guids>
|
||||
<GuidEntry Usage="ALWAYS_CONSUMED">
|
||||
<C_Name>EventLegacyBoot</C_Name>
|
||||
</GuidEntry>
|
||||
<GuidEntry Usage="ALWAYS_CONSUMED">
|
||||
<C_Name>EventReadyToBoot</C_Name>
|
||||
</GuidEntry>
|
||||
<GuidEntry Usage="ALWAYS_CONSUMED">
|
||||
<C_Name>FrameworkDevicePath</C_Name>
|
||||
</GuidEntry>
|
||||
</Guids>
|
||||
</LibraryModuleSurfaceArea>
|
285
MdePkg/Library/UefiLib/UefiNotTiano.c
Normal file
285
MdePkg/Library/UefiLib/UefiNotTiano.c
Normal file
@@ -0,0 +1,285 @@
|
||||
/** @file
|
||||
Library functions that abstract areas of conflict between Tiano an UEFI 2.0.
|
||||
|
||||
Help Port Framework/Tinao code that has conflicts with UEFI 2.0 by hiding the
|
||||
oldconflicts with library functions and supporting implementations of the old
|
||||
(R8.5/EFI 1.10) and new (R9/UEFI 2.0) way.
|
||||
|
||||
Copyright (c) 2006, Intel Corporation<BR>
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Create a Legacy Boot Event.
|
||||
|
||||
Tiano extended the CreateEvent Type enum to add a legacy boot event type.
|
||||
This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was
|
||||
added and now it's possible to not voilate the UEFI specification by
|
||||
declaring a GUID for the legacy boot event class. This library supports
|
||||
the R8.5/EFI 1.10 form and R9/UEFI 2.0 form and allows common code to
|
||||
work both ways.
|
||||
|
||||
@param LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex).
|
||||
|
||||
@retval EFI_SUCCESS Event was created.
|
||||
@retval Other Event was not created.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiCreateEventLegacyBoot (
|
||||
OUT EFI_EVENT *LegacyBootEvent
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
ASSERT (LegacyBootEvent != NULL);
|
||||
|
||||
#if (EFI_SPECIFICATION_VERSION < 0x00020000)
|
||||
//
|
||||
// prior to UEFI 2.0 use Tiano extension to EFI
|
||||
//
|
||||
Status = gBS->CreateEvent (
|
||||
EFI_EVENT_SIGNAL_LEGACY_BOOT | EFI_EVENT_NOTIFY_SIGNAL_ALL,
|
||||
EFI_TPL_CALLBACK,
|
||||
NULL,
|
||||
NULL,
|
||||
LegacyBootEvent
|
||||
);
|
||||
#else
|
||||
//
|
||||
// For UEFI 2.0 and the future use an Event Group
|
||||
//
|
||||
Status = gBS->CreateEventEx (
|
||||
EVENT_NOTIFY_SIGNAL,
|
||||
EFI_TPL_CALLBACK,
|
||||
NULL,
|
||||
NULL,
|
||||
&gEfiEventLegacyBootGuid,
|
||||
LegacyBootEvent
|
||||
);
|
||||
#endif
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Create a Read to Boot Event.
|
||||
|
||||
Tiano extended the CreateEvent Type enum to add a ready to boot event type.
|
||||
This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was
|
||||
added and now it's possible to not voilate the UEFI specification and use
|
||||
the ready to boot event class defined in UEFI 2.0. This library supports
|
||||
the R8.5/EFI 1.10 form and R9/UEFI 2.0 form and allows common code to
|
||||
work both ways.
|
||||
|
||||
@param LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex).
|
||||
|
||||
@retval EFI_SUCCESS Event was created.
|
||||
@retval Other Event was not created.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EfiCreateEventReadyToBoot (
|
||||
IN EFI_EVENT *ReadyToBootEvent
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
ASSERT (ReadyToBootEvent != NULL);
|
||||
|
||||
#if (EFI_SPECIFICATION_VERSION < 0x00020000)
|
||||
//
|
||||
// prior to UEFI 2.0 use Tiano extension to EFI
|
||||
//
|
||||
Status = gBS->CreateEvent (
|
||||
EFI_EVENT_SIGNAL_READY_TO_BOOT | EFI_EVENT_NOTIFY_SIGNAL_ALL,
|
||||
EFI_TPL_CALLBACK,
|
||||
NULL,
|
||||
NULL,
|
||||
ReadyToBootEvent
|
||||
);
|
||||
#else
|
||||
//
|
||||
// For UEFI 2.0 and the future use an Event Group
|
||||
//
|
||||
Status = gBS->CreateEventEx (
|
||||
EVENT_NOTIFY_SIGNAL,
|
||||
EFI_TPL_CALLBACK,
|
||||
NULL,
|
||||
NULL,
|
||||
&gEfiEventReadyToBootGuid,
|
||||
ReadyToBootEvent
|
||||
);
|
||||
#endif
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Signal a Ready to Boot Event.
|
||||
|
||||
Create a Ready to Boot Event. Signal it and close it. This causes other
|
||||
events of the same event group to be signaled in other modules.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
EfiSignalEventReadyToBoot (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_EVENT ReadyToBootEvent;
|
||||
|
||||
Status = EfiCreateEventReadyToBoot (&ReadyToBootEvent);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->SignalEvent (ReadyToBootEvent);
|
||||
gBS->CloseEvent (ReadyToBootEvent);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Signal a Legacy Boot Event.
|
||||
|
||||
Create a legacy Boot Event. Signal it and close it. This causes other
|
||||
events of the same event group to be signaled in other modules.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
EfiSignalEventLegacyBoot (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_EVENT LegacyBootEvent;
|
||||
|
||||
Status = EfiCreateEventLegacyBoot (&LegacyBootEvent);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->SignalEvent (LegacyBootEvent);
|
||||
gBS->CloseEvent (LegacyBootEvent);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check to see if the Firmware Volume (FV) Media Device Path is valid
|
||||
|
||||
Tiano extended the EFI 1.10 device path nodes. Tiano does not own this enum
|
||||
so as we move to UEFI 2.0 support we must use a mechanism that conforms with
|
||||
the UEFI 2.0 specification to define the FV device path. An UEFI GUIDed
|
||||
device path is defined for PIWG extensions of device path. If the code
|
||||
is compiled to conform with the UEFI 2.0 specification use the new device path
|
||||
else use the old form for backwards compatability. The return value to this
|
||||
function points to a location in FvDevicePathNode and it does not allocate
|
||||
new memory for the GUID pointer that is returned.
|
||||
|
||||
@param FvDevicePathNode Pointer to FV device path to check.
|
||||
|
||||
@retval NULL FvDevicePathNode is not valid.
|
||||
@retval Other FvDevicePathNode is valid and pointer to NameGuid was returned.
|
||||
|
||||
**/
|
||||
EFI_GUID *
|
||||
EFIAPI
|
||||
EfiGetNameGuidFromFwVolDevicePathNode (
|
||||
IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode
|
||||
)
|
||||
{
|
||||
ASSERT (FvDevicePathNode != NULL);
|
||||
|
||||
#if (EFI_SPECIFICATION_VERSION < 0x00020000)
|
||||
//
|
||||
// Use old Device Path that conflicts with UEFI
|
||||
//
|
||||
if (DevicePathType (&FvDevicePathNode->Header) == MEDIA_DEVICE_PATH ||
|
||||
DevicePathSubType (&FvDevicePathNode->Header) == MEDIA_FV_FILEPATH_DP) {
|
||||
return &FvDevicePathNode->NameGuid;
|
||||
}
|
||||
|
||||
#else
|
||||
//
|
||||
// Use the new Device path that does not conflict with the UEFI
|
||||
//
|
||||
if (FvDevicePathNode->Piwg.Header.Type == MEDIA_DEVICE_PATH ||
|
||||
FvDevicePathNode->Piwg.Header.SubType == MEDIA_VENDOR_DP) {
|
||||
if (CompareGuid (&gEfiFrameworkDevicePathGuid, &FvDevicePathNode->Piwg.PiwgSpecificDevicePath)) {
|
||||
if (FvDevicePathNode->Piwg.Type == PIWG_MEDIA_FW_VOL_FILEPATH_DEVICE_PATH_TYPE) {
|
||||
return &FvDevicePathNode->NameGuid;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Initialize a Firmware Volume (FV) Media Device Path node.
|
||||
|
||||
Tiano extended the EFI 1.10 device path nodes. Tiano does not own this enum
|
||||
so as we move to UEFI 2.0 support we must use a mechanism that conforms with
|
||||
the UEFI 2.0 specification to define the FV device path. An UEFI GUIDed
|
||||
device path is defined for PIWG extensions of device path. If the code
|
||||
is compiled to conform with the UEFI 2.0 specification use the new device path
|
||||
else use the old form for backwards compatability.
|
||||
|
||||
@param FvDevicePathNode Pointer to a FV device path node to initialize
|
||||
@param NameGuid FV file name to use in FvDevicePathNode
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
EfiInitializeFwVolDevicepathNode (
|
||||
IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode,
|
||||
IN EFI_GUID *NameGuid
|
||||
)
|
||||
{
|
||||
ASSERT (FvDevicePathNode != NULL);
|
||||
ASSERT (NameGuid != NULL);
|
||||
|
||||
#if (EFI_SPECIFICATION_VERSION < 0x00020000)
|
||||
//
|
||||
// Use old Device Path that conflicts with UEFI
|
||||
//
|
||||
FvDevicePathNode->Header.Type = MEDIA_DEVICE_PATH;
|
||||
FvDevicePathNode->Header.SubType = MEDIA_FV_FILEPATH_DP;
|
||||
SetDevicePathNodeLength (&FvDevicePathNode->Header, sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH));
|
||||
|
||||
#else
|
||||
//
|
||||
// Use the new Device path that does not conflict with the UEFI
|
||||
//
|
||||
FvDevicePathNode->Piwg.Header.Type = MEDIA_DEVICE_PATH;
|
||||
FvDevicePathNode->Piwg.Header.SubType = MEDIA_VENDOR_DP;
|
||||
SetDevicePathNodeLength (&FvDevicePathNode->Piwg.Header, sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH));
|
||||
|
||||
//
|
||||
// Add the GUID for generic PIWG device paths
|
||||
//
|
||||
CopyGuid (&FvDevicePathNode->Piwg.PiwgSpecificDevicePath, &gEfiFrameworkDevicePathGuid);
|
||||
|
||||
//
|
||||
// Add in the FW Vol File Path PIWG defined inforation
|
||||
//
|
||||
FvDevicePathNode->Piwg.Type = PIWG_MEDIA_FW_VOL_FILEPATH_DEVICE_PATH_TYPE;
|
||||
|
||||
#endif
|
||||
|
||||
CopyGuid (&FvDevicePathNode->NameGuid, NameGuid);
|
||||
|
||||
}
|
||||
|
47
MdePkg/Library/UefiLib/build.xml
Normal file
47
MdePkg/Library/UefiLib/build.xml
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><!-- Copyright (c) 2006, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.-->
|
||||
<project basedir="." default="UefiLib"><!--Apply external ANT tasks-->
|
||||
<taskdef resource="GenBuild.tasks"/>
|
||||
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
|
||||
<property environment="env"/>
|
||||
<property name="WORKSPACE_DIR" value="${env.WORKSPACE}"/>
|
||||
<import file="${WORKSPACE_DIR}\Tools\Conf\BuildMacro.xml"/><!--MODULE_RELATIVE PATH is relative to PACKAGE_DIR-->
|
||||
<property name="MODULE_RELATIVE_PATH" value="Library\UefiLib"/>
|
||||
<property name="MODULE_DIR" value="${PACKAGE_DIR}\${MODULE_RELATIVE_PATH}"/>
|
||||
<property name="COMMON_FILE" value="${WORKSPACE_DIR}\Tools\Conf\Common.xml"/>
|
||||
<target name="UefiLib">
|
||||
<GenBuild baseName="UefiLib" mbdFilename="${MODULE_DIR}\UefiLib.mbd" msaFilename="${MODULE_DIR}\UefiLib.msa"/>
|
||||
</target>
|
||||
<target depends="UefiLib_clean" name="clean"/>
|
||||
<target depends="UefiLib_cleanall" name="cleanall"/>
|
||||
<target name="UefiLib_clean">
|
||||
<OutputDirSetup baseName="UefiLib" mbdFilename="${MODULE_DIR}\UefiLib.mbd" msaFilename="${MODULE_DIR}\UefiLib.msa"/>
|
||||
<if>
|
||||
<available file="${DEST_DIR_OUTPUT}\UefiLib_build.xml"/>
|
||||
<then>
|
||||
<ant antfile="${DEST_DIR_OUTPUT}\UefiLib_build.xml" target="clean"/>
|
||||
</then>
|
||||
</if>
|
||||
<delete dir="${DEST_DIR_OUTPUT}" excludes="*.xml"/>
|
||||
</target>
|
||||
<target name="UefiLib_cleanall">
|
||||
<OutputDirSetup baseName="UefiLib" mbdFilename="${MODULE_DIR}\UefiLib.mbd" msaFilename="${MODULE_DIR}\UefiLib.msa"/>
|
||||
<if>
|
||||
<available file="${DEST_DIR_OUTPUT}\UefiLib_build.xml"/>
|
||||
<then>
|
||||
<ant antfile="${DEST_DIR_OUTPUT}\UefiLib_build.xml" target="cleanall"/>
|
||||
</then>
|
||||
</if>
|
||||
<delete dir="${DEST_DIR_OUTPUT}"/>
|
||||
<delete dir="${DEST_DIR_DEBUG}"/>
|
||||
<delete>
|
||||
<fileset dir="${BIN_DIR}" includes="**UefiLib*"/>
|
||||
</delete>
|
||||
</target>
|
||||
</project>
|
Reference in New Issue
Block a user