From b7c51c9cf4864df6aabb99a1ae843becd577237c Mon Sep 17 00:00:00 2001 From: raywu Date: Fri, 15 Jun 2018 00:00:50 +0800 Subject: init. 1AQQW051 --- Include/AmiLib.h | 1097 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1097 insertions(+) create mode 100644 Include/AmiLib.h (limited to 'Include/AmiLib.h') diff --git a/Include/AmiLib.h b/Include/AmiLib.h new file mode 100644 index 0000000..82ce597 --- /dev/null +++ b/Include/AmiLib.h @@ -0,0 +1,1097 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + +//********************************************************************** +// $Header: /Alaska/BIN/Core/Include/AmiLib.h 45 6/12/12 3:22p Oleksiyy $ +// +// $Revision: 45 $ +// +// $Date: 6/12/12 3:22p $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/BIN/Core/Include/AmiLib.h $ +// +// 45 6/12/12 3:22p Oleksiyy +// TAG] EIP90322 +// [Category] Improvement +// [Description] Extern declaradion of gAmiGlobalVariableGuid moved to +// AmiLib.h. +// [Files] AmiLib.h, Misc.c, EfiLib.c, AcpiCore.c and S3Resume.c +// +// 44 5/22/12 4:13p Oleksiyy +// [TAG] EIP90322 +// [Category] Improvement +// [Description] Defenition of AMI Global Variable Guid is added. +// [Files] AmiLib.h +// +// 43 10/17/11 2:37p Yakovlevs +// [TAG] EIP71694 +// [Category] Bug Fix +// [Symptom] Option ROM is corrupted when copied from device on Rosecity +// Core 4.6.5.1. +// [RootCause] MemCopy routine was updated to use 64 bit access but PCI +// BAR +// Copy cannot handle this. +// +// [Solution] Introduced MemCpy32 routine to handle fast copy 4 byte at +// a time. +// +// +// [Files] MemCpy32.asm; AmiLib.h +// +// 42 3/09/11 5:37p Artems +// PI 1.1 clean-up, removed duplicated and unused definitions +// +// 41 2/05/11 1:55p Artems +// Added Intel's style LinkedList support +// +// 40 11/10/10 5:07p Felixp +// Enhancement: MMIO_ORX, MMIO_ANDX, MMIO_ANDORX macros are added(EIP +// 46932). +// +// 39 8/20/10 12:39p Felixp +// LZMA compression support +// +// 38 11/05/09 3:51p Oleksiyy +// EIP 27821: Support for 64 bit operations in IoRead and IoWrite added. +// To use this functions AmiLib.h, IA32CLib.c, x64AsmLib.asm files should +// be updated also. +// +// 37 7/30/09 4:43p Vyacheslava +// Fixed comments. +// +// 36 7/28/09 4:54p Vyacheslava +// Minor bug fix. EIP#24453: Synopsis: CPU exception when printing long +// debug messages. +// +// 35 5/21/09 6:06p Felixp +// Bit definitions (BITXX macros) are enclosed in #ifdef's to avoid +// potential double definitions. +// +// 34 11/20/08 3:00p Felixp +// ReallocatePeImage function is upadted to properly handle virtual +// address fixups of the runtime images. +// +// 33 5/07/08 12:21p Felixp +// Performance API added +// +// 32 4/17/08 3:17p Markw +// Added Read/Write Cr3 and Identity map x64 page tables. +// +// 31 3/19/08 2:24p Markw +// Add declaration GetPowerOfTwo64. +// +// 30 9/05/07 12:21p Felixp +// GetDebugDirectory routine declarations removed (it's a private routine +// used only by PELoader). +// +// 29 8/02/07 1:29a Felixp +// Always define GetName (used to be only when EFI_DEBUG is defined). This +// is needed to support selective debugging. +// +// 28 7/17/07 4:57p Yakovlevs +// +// 27 3/08/07 2:55a Felixp +// AMI specific status code definitions moved to AmiStatusCodes.h +// +// 26 10/27/06 10:17a Felixp +// Status codes for exit boot services and set virtual address map added +// +// 25 10/13/06 2:53p Felixp +// AMI_STATUS_CODE_BEEP_CLASS added +// +// 24 10/12/06 9:36a Felixp +// SectionSize parameter of FindPeSection changed from UINT32 to UINTN +// +// 23 8/24/06 9:09a Felixp +// - x64 support +// - memory mapped I/O macros added +// +// 22 6/28/06 1:01p Felixp +// +// 21 5/21/06 11:15p Felixp +// PEI_RECOVERY_FAILED error code added +// +// 20 5/19/06 6:19p Felixp +// Strcpy, Wcscpy changed to return pointer to the end of the string +// +// 19 4/30/06 9:40p Felixp +// +// 18 4/03/06 5:04p Felixp +// Headers updated in accordance with new PCI and Super I/O infrastructure +// +// 17 3/13/06 1:15a Felixp +// +// 16 6/07/05 7:21p Felixp +// additional macroses to work with AMI Status Code +// +// 15 5/31/05 10:23a Felixp +// +// 14 5/27/05 5:28p Felixp +// +// 12 4/02/05 2:23p Felixp +// Swprintf function added +// +// 11 4/01/05 5:51p Felixp +// CONVERT_TO_WSTRING macros added +// +// 10 4/01/05 3:50p Felixp +// CONVERT_TO_STRING macros added +// +// 9 3/25/05 5:25p Felixp +// Wcstol funciton added +// +// 8 3/23/05 4:27p Markw +// +// 7 3/23/05 4:13p Felixp +// +// 6 3/23/05 4:12p Felixp +// +// 5 3/21/05 11:46a Felixp +// Bit definitions moved from AmiDxeLib.h to AmiLib.h +// +// 4 3/07/05 6:10p Felixp +// FindPeSection added +// +// 3 2/01/05 2:27a Felixp +// +// 2 2/01/05 2:00a Felixp +// I/O routine declarations moved from AmiDxeLib.h to AmiLib.h +// +// 1 1/28/05 12:44p Felixp +// +// 5 1/18/05 3:21p Felixp +// PrintDebugMessage renamed to Trace +// +// 2 1/14/05 1:14p Felixp +// FindNextHobByGuid added +// +// 1 12/23/04 9:41a Felixp +// +// 27 12/15/04 9:06p Felixp +// LegacyBoot application added +// Minor build process improvements +// +// 26 12/15/04 3:51p Markw +// Added Strstr. +// +// 25 11/24/04 9:36a Felixp +// int64 suppot added to Itoa and Itow +// +// 24 11/19/04 1:33a Felixp +// GetName debug routine added +// +// 23 11/18/04 11:55a Markw +// +// 22 11/18/04 11:51a Felixp +// FindNextHobByType declaration added +// +// 21 11/10/04 5:17p Felixp +// 1. Definitions for StdC functions added +// 2. Definition for NameAndEntryStr added +// +// 20 10/22/04 7:35p Felixp +// +// 19 10/14/04 12:04p Felixp +// +// 18 8/22/04 11:57p Felixp +// +// 17 8/18/04 3:16p Felixp +// +// 16 7/13/04 10:42a Felixp +// +// 15 4/11/04 2:49p Felixp +// +// 14 4/10/04 1:07p Felixp +// +// 13 4/08/04 6:54p Yakovlevs +// +// 12 4/04/04 2:58p Felixp +// +// 11 3/30/04 11:16a Felixp +// +// 10 3/30/04 2:48a Felixp +// +// 9 3/29/04 6:06p Felixp +// +// 7 3/29/04 5:05p Felixp +// +// 6 3/29/04 4:36p Felixp +// +// 5 3/28/04 2:11p Felixp +// 1. PE Loader and some other commonly used code moved to the Library +// 2. Warnings fixed (from now on warning will be treated as error) +// +// 4 3/26/04 6:04p Markw +// Replaced printf with sprintf. +// +// 3 3/26/04 3:47p Markw +// Added headers for stdlib.c. +// +// 2 3/25/04 2:12p Markw +// Added Shr64. +// +// 1 3/23/04 5:52p Felixp +// +// 11 3/20/04 10:46a Felixp +// +// 10 3/19/04 10:30a Markw +// Added GetEfiConfigurationTable. +// +// 9 3/17/04 12:01p Markw +// Changed size_t UINTN. +// +// 8 3/08/04 5:44p Markw +// +// +// 7 3/05/04 12:46p Markw +// Added Div64 +// +// 6 3/01/04 2:00p Markw +// removed FILE typedef +// +// 5 2/26/04 3:23p Felixp +// +// 4 2/10/04 12:54p Markw +// Fixed return type on IoWrite16 and added definition memcmp and guidcmp +// +// 3 2/05/04 3:45p Markw +// Fixed parameter type error on IoWrite16. +// +// 2 1/28/04 12:11p Robert +// +// 1 1/22/04 3:15p Markw +// +//********************************************************************** +#ifndef __AMI_LIBRARY__H__ +#define __AMI_LIBRARY__H__ +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +//****************************************************************************/ +// TYPE DECLARATIONS +//****************************************************************************/ +typedef CHAR8 *va_list; + +// PE Loader */ +#pragma pack(push) +#pragma pack(2) + +typedef struct _FILE_HEADER { // File Header + UINT16 Machine; + UINT16 NumberOfSections; + UINT32 Dummy[3]; + UINT16 OptionalHeaderSize; + UINT16 Characteristics; +} FILE_HEADER; + +typedef struct _DIRECTORY_ENTRY{ // Directory entry + UINT32 VirtualAddress; + UINT32 Size; +} DIRECTORY_ENTRY; + +typedef struct _OPTIONAL_HEADER { // Optional header + UINT16 Magic; + UINT8 MajorLinkerVersion; + UINT8 MinorLinkerVersion; + UINT32 SizeOfCode; + UINT32 SizeOfInitializedData; + UINT32 SizeOfUninitializedData; + UINT32 AddressOfEntryPoint; + UINT32 BaseOfCode; +#if !defined(EFI64) && !defined(EFIx64) + UINT32 BaseOfData; +#endif + UINTN ImageBase; + UINT32 SectionAlignment; + UINT32 FileAlignment; + UINT16 MajorOperatingSystemVersion; + UINT16 MinorOperatingSystemVersion; + UINT16 MajorImageVersion; + UINT16 MinorImageVersion; + UINT16 MajorSubsystemVersion; + UINT16 MinorSubsystemVersion; + UINT32 Reserved; + UINT32 SizeOfImage; + UINT32 SizeOfHeaders; + UINT32 CheckSum; + UINT16 Subsystem; + UINT16 Characteristics; + UINTN SizeOfStackReserve; + UINTN SizeOfStackCommit; + UINTN SizeOfHeapReserve; + UINTN SizeOfHeapCommit; + UINT32 LoaderFlags; + UINT32 NumberOfRvaAndSizes; + DIRECTORY_ENTRY Export, Import, Resource, Exception, + Certificate, Reallocations, Debug; +} OPTIONAL_HEADER; + +typedef struct _DEBUG_DIRECTORY{ + UINT32 Characteristics; //A reserved field intended to be used for flags, set to zero for now. + UINT32 TimeDateStamp; //Time and date the debug data was created. + UINT16 MajorVersion; //Major version number of the debug data format. + UINT16 MinorVersion; //Minor version number of the debug data format. + UINT32 Type; //Format of debugging information: this field enables support of multiple debuggers. See Section 6.1.2, Debug Type, for more information. + UINT32 SizeOfData; //Size of the debug data (not including the debug directory itself). + //TODO: Is it UINT32 for IPF ????? + UINT32 AddressOfRawData; //Address of the debug data when loaded, relative to the image base. + UINT32 PointerToRawData; //File pointer to the debug data. +} DEBUG_DIRECTORY; +#pragma pack(pop) + +typedef enum { + CpuIoWidthUint8, + CpuIoWidthUint16, + CpuIoWidthUint32, + CpuIoWidthUint64, + CpuIoWidthFifoUint8, + CpuIoWidthFifoUint16, + CpuIoWidthFifoUint32, + CpuIoWidthFifoUint64, + CpuIoWidthFillUint8, + CpuIoWidthFillUint16, + CpuIoWidthFillUint32, + CpuIoWidthFillUint64 +} CPU_IO_WIDTH; + +//Decompression routine types +typedef EFI_STATUS (*GET_INFO) ( + IN VOID *Source, IN UINT32 SourceSize, + OUT UINT32 *DestinationSize, OUT UINT32 *ScratchSize +); + +typedef EFI_STATUS (*DECOMPRESS) ( + IN VOID* Source, IN UINT32 SourceSize, + IN OUT VOID* Destination, IN UINT32 DestinationSize, + IN OUT VOID* Scratch, IN UINT32 ScratchSize +); +// Variable Services +#define AMI_GLOBAL_VARIABLE_GUID \ + {0x1368881,0xc4ad,0x4b1d,0xb6,0x31,0xd5,0x7a,0x8e,0xc8,0xdb,0x6b} + +extern EFI_GUID gAmiGlobalVariableGuid; +//****************************************************************************/ +// MACOROS DECLARATIONS +//****************************************************************************/ +//Some BIT values definition for the sake of convenience +#ifndef BIT0 +#define BIT0 0x01 +#endif +#ifndef BIT1 +#define BIT1 0x02 +#endif +#ifndef BIT2 +#define BIT2 0x04 +#endif +#ifndef BIT3 +#define BIT3 0x08 +#endif +#ifndef BIT4 +#define BIT4 0x10 +#endif +#ifndef BIT5 +#define BIT5 0x20 +#endif +#ifndef BIT6 +#define BIT6 0x40 +#endif +#ifndef BIT7 +#define BIT7 0x80 +#endif +#ifndef BIT8 +#define BIT8 0x100 +#endif +#ifndef BIT9 +#define BIT9 0x200 +#endif +#ifndef BIT00 +#define BIT00 0x00000001 +#endif +#ifndef BIT01 +#define BIT01 0x00000002 +#endif +#ifndef BIT02 +#define BIT02 0x00000004 +#endif +#ifndef BIT03 +#define BIT03 0x00000008 +#endif +#ifndef BIT04 +#define BIT04 0x00000010 +#endif +#ifndef BIT05 +#define BIT05 0x00000020 +#endif +#ifndef BIT06 +#define BIT06 0x00000040 +#endif +#ifndef BIT07 +#define BIT07 0x00000080 +#endif +#ifndef BIT08 +#define BIT08 0x00000100 +#endif +#ifndef BIT09 +#define BIT09 0x00000200 +#endif +#ifndef BIT10 +#define BIT10 0x00000400 +#endif +#ifndef BIT11 +#define BIT11 0x00000800 +#endif +#ifndef BIT12 +#define BIT12 0x00001000 +#endif +#ifndef BIT13 +#define BIT13 0x00002000 +#endif +#ifndef BIT14 +#define BIT14 0x00004000 +#endif +#ifndef BIT15 +#define BIT15 0x00008000 +#endif +#ifndef BIT16 +#define BIT16 0x00010000 +#endif +#ifndef BIT17 +#define BIT17 0x00020000 +#endif +#ifndef BIT18 +#define BIT18 0x00040000 +#endif +#ifndef BIT19 +#define BIT19 0x00080000 +#endif +#ifndef BIT20 +#define BIT20 0x00100000 +#endif +#ifndef BIT21 +#define BIT21 0x00200000 +#endif +#ifndef BIT22 +#define BIT22 0x00400000 +#endif +#ifndef BIT23 +#define BIT23 0x00800000 +#endif +#ifndef BIT24 +#define BIT24 0x01000000 +#endif +#ifndef BIT25 +#define BIT25 0x02000000 +#endif +#ifndef BIT26 +#define BIT26 0x04000000 +#endif +#ifndef BIT27 +#define BIT27 0x08000000 +#endif +#ifndef BIT28 +#define BIT28 0x10000000 +#endif +#ifndef BIT29 +#define BIT29 0x20000000 +#endif +#ifndef BIT30 +#define BIT30 0x40000000 +#endif +#ifndef BIT31 +#define BIT31 0x80000000 +#endif +//============================================================================= +// This is all ANSI Standard macros pulled from stdarg.h +// Support for Variable arguments in strings +#ifndef _INTSIZEOF +#define _INTSIZEOF(n)( (sizeof(n) + sizeof(UINTN) - 1) & ~(sizeof(UINTN) - 1) ) +#endif +// Also support coding convention rules for var arg macros +#ifndef va_start +#define va_start(ap,v) ( ap = (va_list)&(v) + _INTSIZEOF(v) ) +#endif +#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) +#define va_end(ap) ( ap = (va_list)0 ) +// end variable argument support +//============================================================================= +#define ___INTERNAL_CONVERT_TO_STRING___(a) #a +#define CONVERT_TO_STRING(a) ___INTERNAL_CONVERT_TO_STRING___(a) +#define ___INTERNAL_CONVERT_TO_WSTRING___(a) L#a +#define CONVERT_TO_WSTRING(a) ___INTERNAL_CONVERT_TO_WSTRING___(a) + +#define guidcmp(g1,g2) MemCmp(g1,g2,sizeof(EFI_GUID)) + +// The EFI memory allocation functions work in units of EFI_PAGEs that are +// 4K. This should in no way be confused with the page size of the processor. +// An EFI_PAGE is just the quanta of memory in EFI. +#define EFI_PAGE_MASK (EFI_PAGE_SIZE - 1) +#define EFI_PAGE_SHIFT 12 + +#define EFI_SIZE_TO_PAGES(s) \ + ( (((UINTN)(s)) >> EFI_PAGE_SHIFT) + ((((UINTN)(s)) & EFI_PAGE_MASK) ? 1 : 0) ) + +#define EFI_PAGES_TO_SIZE(p) ( ((UINTN)(p)) << EFI_PAGE_SHIFT) +//FIELD_OFFSET - returns the byte offset to a field within a structure +#define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(&(((TYPE *) 0)->Field))) + +//returns the field size within a structure +#define EFI_FIELD_SIZE(TYPE,Field) (sizeof((((TYPE *) 0)->Field))) +#define OUTTER(pField, Field, OutterType) ((OutterType*)((UINT8*)(pField)-EFI_FIELD_OFFSET(OutterType,Field))) + +#define Itoa(value,string,radix) ItoaEx((INT32)value,string,radix,FALSE) +#define Itow(value,string,radix) ItowEx((INT32)value,string,radix,FALSE) +#define I64toa(value,string,radix) ItoaEx(value,string,radix,TRUE) +#define I64tow(value,string,radix) ItowEx(value,string,radix,TRUE) + +#define Strtol(nptr,endptr,base) StrtolEx(nptr,endptr,base,1) +#define Wcstol(nptr,endptr,base) StrtolEx((char*)nptr,(char**)endptr,base,2) + +//Debug Message Categories +#define TRACE_NEVER 0 // never displayed +#define TRACE_ALWAYS -1 // always displayed +#define TRACE_PEICORE 1 +#define TRACE_DXEIPL 2 +#define TRACE_PEI_CHIPSET 4 +#define TRACE_PEI_PLATFORM 8 +#define TRACE_PEI_CPU 0x10 +#define TRACE_DXE_CORE 0x20 +#define TRACE_DXE_CHIPSET 0x40 +#define TRACE_DXE_PLATFORM 0x80 +#define TRACE_DXE_CPU 0x100 +#define TRACE_CSM 0x200 +#define TRACE_USB 0x400 + +#define EFI_DEADLOOP() { volatile UINTN __DeadLoopVar__ = 1; while (__DeadLoopVar__); } + +#define MMIO_READ8(Address) (*(volatile UINT8*)(Address)) +#define MMIO_WRITE8(Address,Value) (*(volatile UINT8*)(Address)=(Value)) +#define MMIO_READ16(Address) (*(volatile UINT16*)(Address)) +#define MMIO_WRITE16(Address,Value) (*(volatile UINT16*)(Address)=(Value)) +#define MMIO_READ32(Address) (*(volatile UINT32*)(Address)) +#define MMIO_WRITE32(Address,Value) (*(volatile UINT32*)(Address)=(Value)) +#define MMIO_READ64(Address) (*(volatile UINT64*)(Address)) +#define MMIO_WRITE64(Address,Value) (*(volatile UINT64*)(Address)=(Value)) + +#define MMIO_OR8(Address, Value) (*(volatile UINT8*)(Address) |= (Value)) +#define MMIO_OR16(Address, Value) (*(volatile UINT16*)(Address) |= (Value)) +#define MMIO_OR32(Address, Value) (*(volatile UINT32*)(Address) |= (Value)) +#define MMIO_OR64(Address, Value) (*(volatile UINT64*)(Address) |= (Value)) + +#define MMIO_AND8(Address, Value) (*(volatile UINT8*)(Address) &= (Value)) +#define MMIO_AND16(Address, Value) (*(volatile UINT16*)(Address) &= (Value)) +#define MMIO_AND32(Address, Value) (*(volatile UINT32*)(Address) &= (Value)) +#define MMIO_AND64(Address, Value) (*(volatile UINT64*)(Address) &= (Value)) + +#define MMIO_ANDOR8(Address, AndData, OrData) (*(volatile UINT8*)(Address)) = (*(volatile UINT8*)(Address) & (AndData) | (OrData)) +#define MMIO_ANDOR16(Address, AndData, OrData) (*(volatile UINT16*)(Address)) = (*(volatile UINT16*)(Address) & (AndData) | (OrData)) +#define MMIO_ANDOR32(Address, AndData, OrData) (*(volatile UINT32*)(Address)) = (*(volatile UINT32*)(Address) & (AndData) | (OrData)) +#define MMIO_ANDOR64(Address, AndData, OrData) (*(volatile UINT64*)(Address)) = (*(volatile UINT32*)(Address) & (AndData) | (OrData)) + +#define DXE_TOK L"DXE" +#define SHELL_TOK L"SHELL" +#define PEI_TOK L"PEI" +#define BDS_TOK L"BDS" +#define DRIVERBINDING_START_TOK L"DriverBinding:Start" +#define DRIVERBINDING_SUPPORT_TOK L"DriverBinding:Support" +#define START_IMAGE_TOK L"StartImage" +#define LOAD_IMAGE_TOK L"LoadImage" +#define DXEIPL_TOK L"DXEIPL" +#define PCI_TOK L"PCI" +#define CSM_TOK L"CSM" +#define NVRAM_TOK L"NVRAM" +#define S3RESUME_TOK L"S3RESUME" + +//****************************************************************************/ +// VARIABLE DECLARATIONS +//****************************************************************************/ + +//****************************************************************************/ +// FUNCTION DECLARATIONS +//****************************************************************************/ +UINTN Sprintf_va_list( char *buffer, char *format, va_list arg ); +UINTN Sprintf(char *Buffer, char *Format, ...); +UINTN Sprintf_s(char *Buffer, UINTN BufferSize, char *Format, ...); +UINTN Sprintf_s_va_list(char *Buffer, UINTN BufferSize, char *Format, va_list Marker); +UINTN Swprintf_va_list(CHAR16 *buffer, CHAR16 *format, va_list arg); +UINTN Swprintf(CHAR16 *Buffer, CHAR16 *Format, ...); +UINTN Swprintf_s(CHAR16 *Buffer, UINTN BufferSize, CHAR16 *Format, ...); +UINTN Swprintf_s_va_list(CHAR16 *Buffer, UINTN BufferSize, CHAR16 *Format, va_list Marker); +int Atoi( char *string ); +char * ItoaEx(INT64 value, char *string,int radix, BOOLEAN is_int64); +CHAR16 * ItowEx(INT64 value, CHAR16 *string,int radix, BOOLEAN is_int64); +long StrtolEx(char *nptr,char **endptr,int base, int increment); +int Strcmp(char *string1, char *string2); +int Wcscmp(CHAR16 *string1, CHAR16 *string2); +UINTN Strlen(char *); +UINTN Wcslen(CHAR16 *); +char* Strcpy(char *,char *); +CHAR16* Wcscpy(CHAR16 *,CHAR16 *); +char *Strstr(const char *,const char *); +char * Strupr(char *str); +CHAR16 * Wcsupr(CHAR16 *str); + +/* +int tolower(int); +int toupper(int); +char * strupr(char *str); +char *strcpy(char *,char *); +char *strcat(char *,char *); +CHAR16 *wcscat(CHAR16 *,CHAR16 *); +*/ + +VOID MemCpy(VOID* pDestination, VOID* pSource, UINTN Length); +VOID MemCpy32(VOID* pDestination, VOID* pSource, UINTN Length); +void MemSet(VOID* pBuffer, UINTN Size, UINT8 Value); +INTN MemCmp(VOID* pDestination, VOID* pSource, UINTN Length); + +UINT64 Shr64( IN UINT64 Value, IN UINT8 Shift ); +UINT64 Shl64( IN UINT64 Value, IN UINT8 Shift ); + +UINT64 Div64 ( + IN UINT64 Dividend, + IN UINTN Divisor, //Can only be 31 bits for IA-32 + OUT UINTN *Remainder OPTIONAL +); + +UINT64 Mul64( + IN UINT64 Value64, + IN UINTN Value32 +); + +UINT64 GetPowerOfTwo64( + IN UINT64 Input +); + + +// PE Loader +BOOLEAN ReallocatePeImage(UINT8 *pcurrent, UINT8 *pnew, UINT8 *prealloc); +BOOLEAN IsPeImageValid(UINT8* pstart); +UINT32 GetImageSize(VOID *p); +OPTIONAL_HEADER* GetPeOptionalHeader(VOID *p); +VOID* LoadPeImage(UINT8* pold, UINT8* pnew); +VOID* LoadPeImageEx(UINT8* pold, UINT8* pnew, UINT8 *prealloc); +VOID* FindPeSection(UINT8* pstart, UINT64 name, UINTN* pSize); +BOOLEAN GetName(UINT8 *p, CHAR8 *sName); + +//Decompression +// Standard UEFI Decompression +EFI_STATUS GetInfo ( + IN VOID *Source, IN UINT32 SourceSize, + OUT UINT32 *DestinationSize, OUT UINT32 *ScratchSize +); + +EFI_STATUS Decompress ( + IN VOID* Source, IN UINT32 SourceSize, + IN OUT VOID* Destination, IN UINT32 DestinationSize, + IN OUT VOID* Scratch, IN UINT32 ScratchSize +); + +// LZMA Decompression +EFI_STATUS LzmaGetInfo ( + IN VOID *Source, IN UINT32 SourceSize, + OUT UINT32 *DestinationSize, OUT UINT32 *ScratchSize +); + +EFI_STATUS LzmaDecompress ( + IN VOID* Source, IN UINT32 SourceSize, + IN OUT VOID* Destination, IN UINT32 DestinationSize, + IN OUT VOID* Scratch, IN UINT32 ScratchSize +); + +//Defined in Tokens.c +BOOLEAN GetDecompressInterface( + UINT8 CompressionType, GET_INFO *GetInfoPtr, DECOMPRESS *DecompressPtr +); + +// DEBUG +VOID checkpoint(UINT8 c); +UINT64 GetCpuTimer(); +VOID PrepareStatusCodeString(VOID* pBuffer, UINTN Size, CHAR8 *sFormat, va_list ArgList); + +//HOB +EFI_STATUS FindNextHobByType(IN UINT16 Type,IN OUT VOID **Hob); +EFI_STATUS FindNextHobByGuid(IN EFI_GUID *Guid, IN OUT VOID **Hob); + +UINT8 IoRead8(UINT16 Port); +VOID IoWrite8(UINT16 Port, UINT8 Value); +UINT16 IoRead16(UINT16 Port); +VOID IoWrite16(UINT16 Port, UINT16 Value); +UINT32 IoRead32(UINT16 Port); +VOID IoWrite32(UINT16 Port, UINT32 Value); +UINT64 IoRead64(UINT16 Port); +VOID IoWrite64(UINT16 Port, UINT64 Value); + +EFI_STATUS IoRead( + IN CPU_IO_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN VOID *Buffer +); + +EFI_STATUS IoWrite( + IN CPU_IO_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + OUT VOID *Buffer +); + +EFI_STATUS IoReadWrite( + IN CPU_IO_WIDTH Width, + IN UINT64 Address, + IN VOID *DataValue, + IN VOID *DataMask +); + +EFI_STATUS MemRead( + IN CPU_IO_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN VOID *Buffer +); + +EFI_STATUS MemWrite( + IN CPU_IO_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + OUT VOID *Buffer +); + +EFI_STATUS MemReadWrite( + IN CPU_IO_WIDTH Width, + IN UINT64 Address, + IN VOID *DataValue, + IN VOID *DataMask +); + +typedef struct _IO_DATA{ + UINT16 Addr; + CPU_IO_WIDTH Width; + UINT32 Data; +} IO_DATA; + +//IO Init table execution function +EFI_STATUS ExecScript(IO_DATA *ScriptData, UINTN EntryCount); + + +UINTN ReadCr3(VOID); +VOID WriteCr3(UINTN Value); + +UINT32 GetPageTableNumPages( + IN UINT8 NumberMemoryBits +); + +VOID FillPageTable( + IN UINT8 NumberMemoryBits, + IN VOID *PageTable +); + +//Linked List + +// +// Prevent multiple includes in the same source file +// + +#ifndef EFI_LIST_ENTRY_DEFINED +#define EFI_LIST_ENTRY_DEFINED +typedef struct _EFI_LIST_ENTRY { + struct _EFI_LIST_ENTRY *ForwardLink; + struct _EFI_LIST_ENTRY *BackLink; +} EFI_LIST_ENTRY; +//*** AMI PORTING BEGIN ***// +#endif +//*** AMI PORTING END *****// + +typedef EFI_LIST_ENTRY EFI_LIST; +typedef EFI_LIST_ENTRY EFI_LIST_NODE; + +#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead) {&ListHead, &ListHead} + +VOID +InitializeListHead ( + EFI_LIST_ENTRY *List + ) +/*++ + +Routine Description: + + Initialize the head of the List. The caller must allocate the memory + for the EFI_LIST. This function must be called before the other linked + list macros can be used. + +Arguments: + + List - Pointer to list head to initialize + +Returns: + + None. + +--*/ +; + +BOOLEAN +IsListEmpty ( + EFI_LIST_ENTRY *List + ) +/*++ + +Routine Description: + + Return TRUE is the list contains zero nodes. Otherzise return FALSE. + The list must have been initialized with InitializeListHead () before using + this function. + +Arguments: + + List - Pointer to list head to test + + +Returns: + + Return TRUE is the list contains zero nodes. Otherzise return FALSE. + +--*/ +; + +VOID +RemoveEntryList ( + EFI_LIST_ENTRY *Entry + ) +/*++ + +Routine Description: + + Remove Node from the doubly linked list. It is the caller's responsibility + to free any memory used by the entry if needed. The list must have been + initialized with InitializeListHead () before using this function. + +Arguments: + + Entry - Element to remove from the list. + +Returns: + + None + +--*/ +; + +VOID +InsertTailList ( + EFI_LIST_ENTRY *ListHead, + EFI_LIST_ENTRY *Entry + ) +/*++ + +Routine Description: + + Insert a Node into the end of a doubly linked list. The list must have + been initialized with InitializeListHead () before using this function. + +Arguments: + + ListHead - Head of doubly linked list + + Entry - Element to insert at the end of the list. + +Returns: + + None + +--*/ +; + +VOID +InsertHeadList ( + EFI_LIST_ENTRY *ListHead, + EFI_LIST_ENTRY *Entry + ) +/*++ + +Routine Description: + + Insert a Node into the start of a doubly linked list. The list must have + been initialized with InitializeListHead () before using this function. + +Arguments: + + ListHead - Head of doubly linked list + + Entry - Element to insert to beginning of list + +Returns: + + None + +--*/ +; + +VOID +SwapListEntries ( + EFI_LIST_ENTRY *Entry1, + EFI_LIST_ENTRY *Entry2 + ) +/*++ + +Routine Description: + + Swap the location of the two elements of a doubly linked list. Node2 + is placed in front of Node1. The list must have been initialized with + InitializeListHead () before using this function. + +Arguments: + + Entry1 - Element in the doubly linked list in front of Node2. + + Entry2 - Element in the doubly linked list behind Node1. + +Returns: + + None + +--*/ +; + +EFI_LIST_ENTRY * +GetFirstNode ( + EFI_LIST_ENTRY *List + ) +/*++ + +Routine Description: + + Return the first node pointed to by the list head. The list must + have been initialized with InitializeListHead () before using this + function and must contain data. + +Arguments: + + List - The head of the doubly linked list. + +Returns: + + Pointer to the first node, if the list contains nodes. The list will + return a null value--that is, the value of List--when the list is empty. + See the description of IsNull for more information. + + +--*/ +; + +EFI_LIST_ENTRY * +GetNextNode ( + EFI_LIST_ENTRY *List, + EFI_LIST_ENTRY *Node + ) +/*++ + +Routine Description: + + Returns the node following Node in the list. The list must + have been initialized with InitializeListHead () before using this + function and must contain data. + +Arguments: + + List - The head of the list. MUST NOT be the literal value NULL. + Node - The node in the list. This value MUST NOT be the literal value NULL. + See the description of IsNull for more information. + +Returns: + + Pointer to the next node, if one exists. Otherwise, returns a null value, + which is actually a pointer to List. + See the description of IsNull for more information. + +--*/ +; + +BOOLEAN +IsNull ( + EFI_LIST_ENTRY *List, + EFI_LIST_ENTRY *Node + ) +/*++ + +Routine Description: + + Determines whether the given node is null. Note that Node is null + when its value is equal to the value of List. It is an error for + Node to be the literal value NULL [(VOID*)0x0]. + +Arguments: + + List - The head of the list. MUST NOT be the literal value NULL. + Node - The node to test. MUST NOT be the literal value NULL. See + the description above. + +Returns: + + Returns true if the node is null. + +--*/ +; + +BOOLEAN +IsNodeAtEnd ( + EFI_LIST_ENTRY *List, + EFI_LIST_ENTRY *Node + ) +/*++ + +Routine Description: + + Determines whether the given node is at the end of the list. Used + to walk the list. The list must have been initialized with + InitializeListHead () before using this function and must contain + data. + +Arguments: + + List - The head of the list. MUST NOT be the literal value NULL. + Node - The node to test. MUST NOT be the literal value NULL. + See the description of IsNull for more information. + +Returns: + + Returns true if the list is the tail. + +--*/ +; + +/****** DO NOT WRITE BELOW THIS LINE *******/ +#ifdef __cplusplus +} +#endif +#endif + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** -- cgit v1.2.3