#ifndef _EFILIB_INCLUDE_
#define _EFILIB_INCLUDE_
/*++
Copyright (c) 2000 Intel Corporation
Module Name:
efilib.h
Abstract:
EFI library functions
Revision History
--*/
#include "efidebug.h"
#include "efipart.h"
#include "efilibplat.h"
#include "efilink.h"
#include "efirtlib.h"
#include "pci22.h"
#include "libsmbios.h"
//
// Public read-only data in the EFI library
//
extern EFI_SYSTEM_TABLE *ST;
extern EFI_BOOT_SERVICES *BS;
extern EFI_RUNTIME_SERVICES *RT;
extern EFI_GUID DevicePathProtocol;
extern EFI_GUID LoadedImageProtocol;
extern EFI_GUID TextInProtocol;
extern EFI_GUID TextOutProtocol;
extern EFI_GUID BlockIoProtocol;
extern EFI_GUID DiskIoProtocol;
extern EFI_GUID FileSystemProtocol;
extern EFI_GUID LoadFileProtocol;
extern EFI_GUID DeviceIoProtocol;
extern EFI_GUID VariableStoreProtocol;
extern EFI_GUID LegacyBootProtocol;
extern EFI_GUID UnicodeCollationProtocol;
extern EFI_GUID SerialIoProtocol;
extern EFI_GUID VgaClassProtocol;
extern EFI_GUID TextOutSpliterProtocol;
extern EFI_GUID ErrorOutSpliterProtocol;
extern EFI_GUID TextInSpliterProtocol;
extern EFI_GUID SimpleNetworkProtocol;
extern EFI_GUID PxeBaseCodeProtocol;
extern EFI_GUID PxeCallbackProtocol;
extern EFI_GUID NetworkInterfaceIdentifierProtocol;
extern EFI_GUID UiProtocol;
extern EFI_GUID InternalShellProtocol;
extern EFI_GUID EfiGlobalVariable;
extern EFI_GUID GenericFileInfo;
extern EFI_GUID FileSystemInfo;
extern EFI_GUID FileSystemVolumeLabelInfo;
extern EFI_GUID PcAnsiProtocol;
extern EFI_GUID Vt100Protocol;
extern EFI_GUID NullGuid;
extern EFI_GUID UnknownDevice;
extern EFI_GUID EfiPartTypeSystemPartitionGuid;
extern EFI_GUID EfiPartTypeLegacyMbrGuid;
extern EFI_GUID MpsTableGuid;
extern EFI_GUID AcpiTableGuid;
extern EFI_GUID SMBIOSTableGuid;
extern EFI_GUID SalSystemTableGuid;
//
// EFI Variable strings
//
#define LOAD_OPTION_ACTIVE 0x00000001
#define VarLanguageCodes L"LangCodes"
#define VarLanguage L"Lang"
#define VarTimeout L"Timeout"
#define VarConsoleInp L"ConIn"
#define VarConsoleOut L"ConOut"
#define VarErrorOut L"ErrOut"
#define VarBootOption L"Boot%04x"
#define VarBootOrder L"BootOrder"
#define VarBootNext L"BootNext"
#define VarBootCurrent L"BootCurrent"
#define VarDriverOption L"Driver%04x"
#define VarDriverOrder L"DriverOrder"
#define VarConsoleInpDev L"ConInDev"
#define VarConsoleOutDev L"ConOutDev"
#define VarErrorOutDev L"ErrOutDev"
#define LanguageCodeEnglish "eng"
extern EFI_DEVICE_PATH RootDevicePath[];
extern EFI_DEVICE_PATH EndDevicePath[];
extern EFI_DEVICE_PATH EndInstanceDevicePath[];
//
// Other public data in the EFI library
//
extern EFI_MEMORY_TYPE PoolAllocationType;
//
// STATIC - Name is internal to the module
// INTERNAL - Name is internal to the component (i.e., directory)
// BOOTSERVCE - Name of a boot service function
//
#define STATIC
#define INTERNAL
#define BOOTSERVICE
//
// Prototypes
//
VOID
InitializeLib (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);
VOID
InitializeUnicodeSupport (
CHAR8 *LangCode
);
VOID
EFIDebugVariable (
VOID
);
VOID
SetCrc (
IN OUT EFI_TABLE_HEADER *Hdr
);
VOID
SetCrcAltSize (
IN UINTN Size,
IN OUT EFI_TABLE_HEADER *Hdr
);
BOOLEAN
CheckCrc (
IN UINTN MaxSize,
IN OUT EFI_TABLE_HEADER *Hdr
);
BOOLEAN
CheckCrcAltSize (
IN UINTN MaxSize,
IN UINTN Size,
IN OUT EFI_TABLE_HEADER *Hdr
);
UINT32
CalculateCrc (
UINT8 *pt,
UINTN Size
);
VOID
ZeroMem (
IN VOID *Buffer,
IN UINTN Size
);
VOID
SetMem (
IN VOID *Buffer,
IN UINTN Size,
IN UINT8 Value
);
VOID
CopyMem (
IN VOID *Dest,
IN VOID *Src,
IN UINTN len
);
INTN
CompareMem (
IN VOID *Dest,
IN VOID *Src,
IN UINTN len
);
INTN
StrCmp (
IN CHAR16 *s1,
IN CHAR16 *s2
);
INTN
StrnCmp (
IN CHAR16 *s1,
IN CHAR16 *s2,
IN UINTN len
);
INTN
StriCmp (
IN CHAR16 *s1,
IN CHAR16 *s2
);
VOID
StrLwr (
IN CHAR16 *Str
);
VOID
StrUpr (
IN CHAR16 *Str
);
VOID
StrCpy (
IN CHAR16 *Dest,
IN CHAR16 *Src
);
VOID
StrCat (
IN CHAR16 *Dest,
IN CHAR16 *Src
);
UINTN
StrLen (
IN CHAR16 *s1
);
UINTN
StrSize (
IN CHAR16 *s1
);
CHAR16 *
StrDuplicate (
IN CHAR16 *Src
);
UINTN
strlena (
IN CHAR8 *s1
);
UINTN
strcmpa (
IN CHAR8 *s1,
IN CHAR8 *s2
);
UINTN
strncmpa (
IN CHAR8 *s1,
IN CHAR8 *s2,
IN UINTN len
);
UINTN
xtoi (
CHAR16 *str
);
UINTN
Atoi (
CHAR16 *str
);
BOOLEAN
MetaMatch (
IN CHAR16 *String,
IN CHAR16 *Pattern
);
BOOLEAN
MetaiMatch (
IN CHAR16 *String,
IN CHAR16 *Pattern
);
UINT64
LShiftU64 (
IN UINT64 Operand,
IN UINTN Count
);
UINT64
RShiftU64 (
IN UINT64 Operand,
IN UINTN Count
);
UINT64
MultU64x32 (
IN UINT64 Multiplicand,
IN UINTN Multiplier
);
UINT64
DivU64x32 (
IN UINT64 Dividend,
IN UINTN Divisor,
OUT UINTN *Remainder OPTIONAL
);
VOID
InitializeLock (
IN OUT FLOCK *Lock,
IN EFI_TPL Priority
);
VOID
AcquireLock (
IN FLOCK *Lock
);
VOID
ReleaseLock (
IN FLOCK *Lock
);
INTN
CompareGuid(
IN EFI_GUID *Guid1,
IN EFI_GUID *Guid2
);
VOID *
AllocatePool (
IN UINTN Size
);
VOID *
AllocateZeroPool (
IN UINTN Size
);
VOID *
ReallocatePool (
IN VOID *OldPool,
IN UINTN OldSize,
IN UINTN NewSize
);
VOID
FreePool (
IN VOID *p
);
VOID
Output (
IN CHAR16 *Str
);
VOID
Input (
IN CHAR16 *Prompt OPTIONAL,
OUT CHAR16 *InStr,
IN UINTN StrLen
);
VOID
IInput (
IN SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut,
IN SIMPLE_INPUT_INTERFACE *ConIn,
IN CHAR16 *Prompt OPTIONAL,
OUT CHAR16 *InStr,
IN UINTN StrLen
);
UINTN
Print (
IN CHAR16 *fmt,
...
);
UINTN
SPrint (
OUT CHAR16 *Str,
IN UINTN StrSize,
IN CHAR16 *fmt,
...
);
CHAR16 *
PoolPrint (
IN CHAR16 *fmt,
...
);
typedef struct {
CHAR16 *str;
UINTN len;
UINTN maxlen;
} POOL_PRINT;
CHAR16 *
CatPrint (
IN OUT POOL_PRINT *Str,
IN CHAR16 *fmt,
...
);
UINTN
PrintAt (
IN UINTN Column,
IN UINTN Row,
IN CHAR16 *fmt,
...
);
UINTN
IPrint (
IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out,
IN CHAR16 *fmt,
...
);
UINTN
IPrintAt (
IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out,
IN UINTN Column,
IN UINTN Row,
IN CHAR16 *fmt,
...
);
UINTN
APrint (
IN CHAR8 *fmt,
...
);
VOID
ValueToHex (
IN CHAR16 *Buffer,
IN UINT64 v
);
VOID
ValueToString (
IN CHAR16 *Buffer,
IN BOOLEAN Comma,
IN INT64 v
);
VOID
TimeToString (
OUT CHAR16 *Buffer,
IN EFI_TIME *Time
);
VOID
GuidToString (
OUT CHAR16 *Buffer,
IN EFI_GUID *Guid
);
VOID
StatusToString (
OUT CHAR16 *Buffer,
EFI_STATUS Status
);
VOID
DumpHex (
IN UINTN Indent,
IN UINTN Offset,
IN UINTN DataSize,
IN VOID *UserData
);
BOOLEAN
GrowBuffer(
IN OUT EFI_STATUS *Status,
IN OUT VOID **Buffer,
IN UINTN BufferSize
);
EFI_MEMORY_DESCRIPTOR *
LibMemoryMap (
OUT UINTN *NoEntries,
OUT UINTN *MapKey,
OUT UINTN *DescriptorSize,
OUT UINT32 *DescriptorVersion
);
VOID *
LibGetVariable (
IN CHAR16 *Name,
IN EFI_GUID *VendorGuid
);
VOID *
LibGetVariableAndSize (
IN CHAR16 *Name,
IN EFI_GUID *VendorGuid,
OUT UINTN *VarSize
);
EFI_STATUS
LibDeleteVariable (
IN CHAR16 *VarName,
IN EFI_GUID *VarGuid
);
EFI_STATUS
LibInsertToTailOfBootOrder (
IN UINT16 BootOption,
IN BOOLEAN OnlyInsertIfEmpty
);
EFI_STATUS
LibLocateProtocol (
IN EFI_GUID *ProtocolGuid,
OUT VOID **Interface
);
EFI_STATUS
LibLocateHandle (
IN EFI_LOCATE_SEARCH_TYPE SearchType,
IN EFI_GUID *Protocol OPTIONAL,
IN VOID *SearchKey OPTIONAL,
IN OUT UINTN *NoHandles,
OUT EFI_HANDLE **Buffer
);
EFI_STATUS
LibLocateHandleByDiskSignature (
IN UINT8 MBRType,
IN UINT8 SignatureType,
IN VOID *Signature,
IN OUT UINTN *NoHandles,
OUT EFI_HANDLE **Buffer
);
EFI_STATUS
LibInstallProtocolInterfaces (
IN OUT EFI_HANDLE *Handle,
...
);
VOID
LibUninstallProtocolInterfaces (
IN EFI_HANDLE Handle,
...
);
EFI_STATUS
LibReinstallProtocolInterfaces (
IN OUT EFI_HANDLE *Handle,
...
);
EFI_EVENT
LibCreateProtocolNotifyEvent (
IN EFI_GUID *ProtocolGuid,
IN EFI_TPL NotifyTpl,
IN EFI_EVENT_NOTIFY NotifyFunction,
IN VOID *NotifyContext,
OUT VOID *Registration
);
EFI_STATUS
WaitForSingleEvent (
IN EFI_EVENT Event,
IN UINT64 Timeout OPTIONAL
);
VOID
WaitForEventWithTimeout (
IN EFI_EVENT Event,
IN UINTN Timeout,
IN UINTN Row,
IN UINTN Column,
IN CHAR16 *String,
IN EFI_INPUT_KEY TimeoutKey,
OUT EFI_INPUT_KEY *Key
);
EFI_FILE_HANDLE
LibOpenRoot (
IN EFI_HANDLE DeviceHandle
);
EFI_FILE_INFO *
LibFileInfo (
IN EFI_FILE_HANDLE FHand
);
EFI_FILE_SYSTEM_INFO *
LibFileSystemInfo (
IN EFI_FILE_HANDLE FHand
);
EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *
LibFileSystemVolumeLabelInfo (
IN EFI_FILE_HANDLE FHand
);
BOOLEAN
ValidMBR(
IN MASTER_BOOT_RECORD *Mbr,
IN EFI_BLOCK_IO *BlkIo
);
BOOLEAN
LibMatchDevicePaths (
IN EFI_DEVICE_PATH *Multi,
IN EFI_DEVICE_PATH *Single
);
EFI_DEVICE_PATH *
LibDuplicateDevicePathInstance (
IN EFI_DEVICE_PATH *DevPath
);
EFI_DEVICE_PATH *
DevicePathFromHandle (
IN EFI_HANDLE Handle
);
EFI_DEVICE_PATH *
DevicePathInstance (
IN OUT EFI_DEVICE_PATH **DevicePath,
OUT UINTN *Size
);
UINTN
DevicePathInstanceCount (
IN EFI_DEVICE_PATH *DevicePath
);
EFI_DEVICE_PATH *
AppendDevicePath (
IN EFI_DEVICE_PATH *Src1,
IN EFI_DEVICE_PATH *Src2
);
EFI_DEVICE_PATH *
AppendDevicePathNode (
IN EFI_DEVICE_PATH *Src1,
IN EFI_DEVICE_PATH *Src2
);
EFI_DEVICE_PATH*
AppendDevicePathInstance (
IN EFI_DEVICE_PATH *Src,
IN EFI_DEVICE_PATH *Instance
);
EFI_DEVICE_PATH *
FileDevicePath (
IN EFI_HANDLE Device OPTIONAL,
IN CHAR16 *FileName
);
UINTN
DevicePathSize (
IN EFI_DEVICE_PATH *DevPath
);
EFI_DEVICE_PATH *
DuplicateDevicePath (
IN EFI_DEVICE_PATH *DevPath
);
EFI_DEVICE_PATH *
UnpackDevicePath (
IN EFI_DEVICE_PATH *DevPath
);
EFI_STATUS
LibDevicePathToInterface (
IN EFI_GUID *Protocol,
IN EFI_DEVICE_PATH *FilePath,
OUT VOID **Interface
);
CHAR16 *
DevicePathToStr (
EFI_DEVICE_PATH *DevPath
);
//
// BugBug: I need my own include files
//
typedef struct {
UINT8 Register;
UINT8 Function;
UINT8 Device;
UINT8 Bus;
UINT32 Reserved;
} EFI_ADDRESS;
typedef union {
UINT64 Address;
EFI_ADDRESS EfiAddress;
} EFI_PCI_ADDRESS_UNION;
EFI_STATUS
PciFindDeviceClass (
IN OUT EFI_PCI_ADDRESS_UNION *Address,
IN UINT8 BaseClass,
IN UINT8 SubClass
);
EFI_STATUS
PciFindDevice (
IN OUT EFI_PCI_ADDRESS_UNION *DeviceAddress,
IN UINT16 VendorId,
IN UINT16 DeviceId,
IN OUT PCI_TYPE00 *Pci
);
//
// SIMPLE_READ_FILE object used to access files
//
typedef VOID *SIMPLE_READ_FILE;
EFI_STATUS
OpenSimpleReadFile (
IN BOOLEAN BootPolicy,
IN VOID *SourceBuffer OPTIONAL,
IN UINTN SourceSize,
IN OUT EFI_DEVICE_PATH **FilePath,
OUT EFI_HANDLE *DeviceHandle,
OUT SIMPLE_READ_FILE *SimpleReadHandle
);
EFI_STATUS
ReadSimpleReadFile (
IN SIMPLE_READ_FILE SimpleReadHandle,
IN UINTN Offset,
IN OUT UINTN *ReadSize,
OUT VOID *Buffer
);
VOID
CloseSimpleReadFile (
IN SIMPLE_READ_FILE SimpleReadHandle
);
VOID
InitializeGuid (
VOID
);
UINT8
DecimaltoBCD(
IN UINT8 DecValue
);
UINT8
BCDtoDecimal(
IN UINT8 BcdValue
);
EFI_STATUS
LibGetSystemConfigurationTable(
IN EFI_GUID *TableGuid,
IN OUT VOID **Table
);
BOOLEAN
LibIsValidTextGraphics (
IN CHAR16 Graphic,
OUT CHAR8 *PcAnsi, OPTIONAL
OUT CHAR8 *Ascii OPTIONAL
);
BOOLEAN
IsValidAscii (
IN CHAR16 Ascii
);
BOOLEAN
IsValidEfiCntlChar (
IN CHAR16 c
);
CHAR16 *
LibGetUiString (
IN EFI_HANDLE Handle,
IN UI_STRING_TYPE StringType,
IN ISO_639_2 *LangCode,
IN BOOLEAN ReturnDevicePathStrOnMismatch
);
CHAR8*
LibGetSmbiosString (
IN SMBIOS_STRUCTURE_POINTER *Smbios,
IN UINT16 StringNumber
);
EFI_STATUS
LibGetSmbiosSystemGuidAndSerialNumber (
IN EFI_GUID *SystemGuid,
OUT CHAR8 **SystemSerialNumber
);
EFI_STATUS
InitializeGlobalIoDevice (
IN EFI_DEVICE_PATH *DevicePath,
IN EFI_GUID *Protocol,
IN CHAR8 *ErrorStr,
OUT EFI_DEVICE_IO_INTERFACE **GlobalIoFncs
);
UINT32
ReadPort (
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs,
IN EFI_IO_WIDTH Width,
IN UINTN Port
);
UINT32
WritePort (
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs,
IN EFI_IO_WIDTH Width,
IN UINTN Port,
IN UINTN Data
);
UINT32
ReadPciConfig (
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs,
IN EFI_IO_WIDTH Width,
IN UINTN Port
);
UINT32
WritePciConfig (
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs,
IN EFI_IO_WIDTH Width,
IN UINTN Port,
IN UINTN Data
);
extern EFI_DEVICE_IO_INTERFACE *GlobalIoFncs;
#define outp(_Port, _DataByte) (UINT8)WritePort(GlobalIoFncs, IO_UINT8, (UINTN)_Port, (UINTN)_DataByte)
#define inp(_Port) (UINT8)ReadPort(GlobalIoFncs, IO_UINT8, (UINTN)_Port)
#define outpw(_Port, _DataByte) (UINT16)WritePort(GlobalIoFncs, IO_UINT16, (UINTN)_Port, (UINTN)_DataByte)
#define inpw(_Port) (UINT16)ReadPort(GlobalIoFncs, IO_UINT16, (UINTN)_Port)
#define outpd(_Port, _DataByte) (UINT32)WritePort(GlobalIoFncs, IO_UINT32, (UINTN)_Port, (UINTN)_DataByte)
#define inpd(_Port) (UINT32)ReadPort(GlobalIoFncs, IO_UINT32, (UINTN)_Port)
#define writepci8(_Addr, _DataByte) (UINT8)WritePciConfig(GlobalIoFncs, IO_UINT8, (UINTN)_Addr, (UINTN)_DataByte)
#define readpci8(_Addr) (UINT8)ReadPciConfig(GlobalIoFncs, IO_UINT8, (UINTN)_Addr)
#define writepci16(_Addr, _DataByte) (UINT16)WritePciConfig(GlobalIoFncs, IO_UINT16, (UINTN)_Addr, (UINTN)_DataByte)
#define readpci16(_Addr) (UINT16)ReadPciConfig(GlobalIoFncs, IO_UINT16, (UINTN)_Addr)
#define writepci32(_Addr, _DataByte) (UINT32)WritePciConfig(GlobalIoFncs, IO_UINT32, (UINTN)_Addr, (UINTN)_DataByte)
#define readpci32(_Addr) (UINT32)ReadPciConfig(GlobalIoFncs, IO_UINT32, (UINTN)_Addr)
#define Pause() WaitForSingleEvent (ST->ConIn->WaitForKey, 0)
#define Port80(_PostCode) GlobalIoFncs->Io.Write (GlobalIoFncs, IO_UINT16, (UINT64)0x80, 1, &(_PostCode))
#endif