| /*++ | |
| Copyright (c) 2004, 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. | |
| Module Name: | |
| EfiDebug.h | |
| Abstract: | |
| EFI Debug macros. The work needs tobe done in library. The Debug | |
| macros them selves are standard for all files, including the core. | |
| There needs to be code linked in that produces the following macros: | |
| EfiDebugAssert(file, linenumber, assertion string) - worker function for | |
| ASSERT. filename and line number of where this ASSERT() is located | |
| is passed in along with the stringized version of the assertion. | |
| EfiDebugPrint - Worker function for debug print | |
| _DEBUG_SET_MEM(address, length, value) - Set memory at address to value | |
| for legnth bytes. This macro is used to initialzed uninitialized memory | |
| or memory that is free'ed, so it will not be used by mistake. | |
| --*/ | |
| #ifndef _EFI_DEBUG_H_ | |
| #define _EFI_DEBUG_H_ | |
| #ifdef EFI_DEBUG | |
| VOID | |
| EfiDebugAssert ( | |
| IN CHAR8 *FileName, | |
| IN INTN LineNumber, | |
| IN CHAR8 *Description | |
| ); | |
| VOID | |
| EfiDebugPrint ( | |
| IN UINTN ErrorLevel, | |
| IN CHAR8 *Format, | |
| ... | |
| ); | |
| VOID | |
| EfiDebugVPrint ( | |
| IN UINTN ErrorLevel, | |
| IN CHAR8 *Format, | |
| IN VA_LIST Marker | |
| ); | |
| // | |
| // Define macros for the above functions so we can make them go away | |
| // in non-debug builds. | |
| // | |
| #define EFI_DEBUG_VPRINT(ErrorLevel, Format, Marker) \ | |
| EfiDebugVPrint(ErrorLevel, Format, Marker) | |
| #define EFI_DEBUG_ASSERT(FileName, LineNumber, Description) \ | |
| EfiDebugAssert (FileName, LineNumber, Description) | |
| #define _DEBUG_ASSERT(assertion) \ | |
| EfiDebugAssert (__FILE__, __LINE__, #assertion) | |
| #define _DEBUG(arg) DebugPrint arg | |
| // | |
| // Define ASSERT() macro, if assertion is FALSE trigger the ASSERT | |
| // | |
| #define ASSERT(assertion) if(!(assertion)) \ | |
| _DEBUG_ASSERT(assertion) | |
| #define ASSERT_LOCKED(l) if(!(l)->Lock) _DEBUG_ASSERT(l not locked) | |
| // | |
| // DEBUG((DebugLevel, "format string", ...)) - if DebugLevel is active do | |
| // the a debug print. | |
| // | |
| #define DEBUG(arg) EfiDebugPrint arg | |
| #define DEBUG_CODE(code) code | |
| #define CR(record, TYPE, field, signature) \ | |
| _CR(record, TYPE, field)->Signature != signature ? \ | |
| (TYPE *) (_DEBUG_ASSERT("CR has Bad Signature"), record) : \ | |
| _CR(record, TYPE, field) | |
| #define _DEBUG_SET_MEM(address, length, data) EfiCommonLibSetMem(address, length, data) | |
| // | |
| // Generate an ASSERT if the protocol specified by GUID is already installed on Handle. | |
| // If Handle is NULL, then an ASSERT is generated if the protocol specified by GUID | |
| // is present anywhere in the handle database | |
| // | |
| #define ASSERT_PROTOCOL_ALREADY_INSTALLED(Handle, Guid) \ | |
| DEBUG_CODE ( { \ | |
| VOID *Instance; \ | |
| if (Handle == NULL) { \ | |
| ASSERT(EFI_ERROR(gBS->LocateProtocol (Guid, NULL, &Instance))); \ | |
| } else { \ | |
| ASSERT(EFI_ERROR(gBS->HandleProtocol (Handle, Guid, &Instance))); \ | |
| } } ) | |
| #else | |
| #define ASSERT(a) | |
| #define ASSERT_LOCKED(l) | |
| #define DEBUG(arg) | |
| #define DEBUG_CODE(code) | |
| #define CR(Record, TYPE, Field, Signature) \ | |
| _CR(Record, TYPE, Field) | |
| #define _DEBUG_SET_MEM(address, length, data) | |
| #define EFI_DEBUG_VPRINT(ErrorLevel, Format, Marker) | |
| #define EFI_DEBUG_ASSERT(FileName, LineNumber, Description) | |
| #define ASSERT_PROTOCOL_ALREADY_INSTALLED(Handle, Guid) | |
| #endif | |
| // | |
| // Generate an ASSERT if Status is an error code | |
| // | |
| //#define ASSERT_EFI_ERROR(status) ASSERT(!EFI_ERROR(status)) | |
| #define ASSERT_EFI_ERROR(status) if (EFI_ERROR(status)) \ | |
| DEBUG_CODE ( { \ | |
| DEBUG((EFI_D_ERROR, "\nASSERT!Status = 0x%x Info :",status)); \ | |
| ASSERT(!EFI_ERROR(status)); \ | |
| } ) | |
| #ifdef EFI_DEBUG_CLEAR_MEMORY | |
| #define DEBUG_SET_MEMORY(address,length) \ | |
| _DEBUG_SET_MEM(address, length, EFI_BAD_POINTER_AS_BYTE) | |
| #else | |
| #define DEBUG_SET_MEMORY(address,length) | |
| #endif | |
| #define EFI_D_INIT 0x00000001 // Initialization style messages | |
| #define EFI_D_WARN 0x00000002 // Warnings | |
| #define EFI_D_LOAD 0x00000004 // Load events | |
| #define EFI_D_FS 0x00000008 // EFI File system | |
| #define EFI_D_POOL 0x00000010 // Alloc & Free's | |
| #define EFI_D_PAGE 0x00000020 // Alloc & Free's | |
| #define EFI_D_INFO 0x00000040 // Verbose | |
| #define EFI_D_VARIABLE 0x00000100 // Variable | |
| #define EFI_D_BM 0x00000400 // Boot Manager (BDS) | |
| #define EFI_D_BLKIO 0x00001000 // BlkIo Driver | |
| #define EFI_D_NET 0x00004000 // SNI Driver | |
| #define EFI_D_UNDI 0x00010000 // UNDI Driver | |
| #define EFI_D_LOADFILE 0x00020000 // UNDI Driver | |
| #define EFI_D_EVENT 0x00080000 // Event messages | |
| #define EFI_D_ERROR 0x80000000 // Error | |
| #define EFI_D_GENERIC (EFI_D_ERROR | EFI_D_INIT | EFI_D_WARN | EFI_D_INFO | \ | |
| EFI_D_BLKIO | EFI_D_NET | EFI_D_UNDI ) | |
| #define EFI_D_INTRINSIC ( EFI_D_EVENT | EFI_D_POOL | EFI_D_PAGE | \ | |
| EFI_D_BM | EFI_D_LOAD | EFI_D_VARIABLE ) | |
| #define EFI_D_RESERVED (EFI_D_GENERIC | EFI_D_INTRINSIC) | |
| #define EFI_DBUG_MASK (EFI_D_ERROR | EFI_D_INFO | EFI_D_WARN) | |
| #endif |