#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 "efistdarg.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 PciIoProtocol; extern EFI_GUID DriverBindingProtocol; extern EFI_GUID ComponentNameProtocol; extern EFI_GUID ComponentName2Protocol; extern EFI_GUID LoadedImageProtocol; extern EFI_GUID HashProtocol; 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; extern EFI_GUID SimplePointerProtocol; extern EFI_GUID AbsolutePointerProtocol; // // 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 ); INTN GetShellArgcArgv( EFI_HANDLE ImageHandle, CHAR16 **Argv[] /* Statically allocated */ ); 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 CONST VOID *Src, IN UINTN len ); INTN CompareMem ( IN CONST VOID *Dest, IN CONST VOID *Src, IN UINTN len ); INTN StrCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2 ); INTN StrnCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2, IN UINTN len ); INTN StriCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2 ); VOID StrLwr ( IN CHAR16 *Str ); VOID StrUpr ( IN CHAR16 *Str ); VOID StrCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ); VOID StrCat ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ); UINTN StrLen ( IN CONST CHAR16 *s1 ); UINTN StrSize ( IN CONST CHAR16 *s1 ); CHAR16 * StrDuplicate ( IN CONST CHAR16 *Src ); UINTN strlena ( IN CONST CHAR8 *s1 ); UINTN strcmpa ( IN CONST CHAR8 *s1, IN CONST CHAR8 *s2 ); UINTN strncmpa ( IN CONST CHAR8 *s1, IN CONST CHAR8 *s2, IN UINTN len ); UINTN xtoi ( CONST CHAR16 *str ); UINTN Atoi ( CONST 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 VPrint ( IN CHAR16 *fmt, va_list args ); UINTN SPrint ( OUT CHAR16 *Str, IN UINTN StrSize, IN CHAR16 *fmt, ... ); UINTN VSPrint ( OUT CHAR16 *Str, IN UINTN StrSize, IN CHAR16 *fmt, va_list args ); CHAR16 * VPoolPrint ( IN CHAR16 *fmt, va_list args ); 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 LibSetNVVariable ( IN CHAR16 *VarName, IN EFI_GUID *VarGuid, IN UINTN DataSize, IN VOID *Data ); EFI_STATUS LibSetVariable ( IN CHAR16 *VarName, IN EFI_GUID *VarGuid, IN UINTN DataSize, IN VOID *Data ); 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