/*++ 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. Module Name: DebugAssert.c Abstract: Produce EfiDebugAssertProtocol to enable EfiUtilityLib to function. The EfiUtilityLib is used by the EFI shell! --*/ #include "StatusCode.h" EFI_STATUS EFIAPI StatusCodeDebugAssert ( IN EFI_DEBUG_ASSERT_PROTOCOL *This, IN CHAR8 *FileName, IN INTN LineNumber, IN CHAR8 *Description ); EFI_STATUS EFIAPI StatusCodeDebugPrint ( IN EFI_DEBUG_ASSERT_PROTOCOL *This, IN UINTN ErrorLevel, IN CHAR8 *Format, IN VA_LIST Marker ); EFI_STATUS EFIAPI StatusCodePostCode ( IN EFI_DEBUG_ASSERT_PROTOCOL * This, IN UINT16 PostCode, IN CHAR8 *PostCodeString OPTIONAL ); EFI_STATUS EFIAPI StatusCodeGetErrorLevel ( IN EFI_DEBUG_ASSERT_PROTOCOL *This, IN UINTN *ErrorLevel ); EFI_STATUS EFIAPI StatusCodeSetErrorLevel ( IN EFI_DEBUG_ASSERT_PROTOCOL *This, IN UINTN ErrorLevel ); // // Protocol instance, there can be only one. // EFI_HANDLE mHandle = NULL; EFI_DEBUG_ASSERT_PROTOCOL mDebugAssertProtocol = { StatusCodeDebugAssert, StatusCodeDebugPrint, StatusCodePostCode, StatusCodeGetErrorLevel, StatusCodeSetErrorLevel }; // // Function implementations // EFI_STATUS EFIAPI StatusCodeDebugAssert ( IN EFI_DEBUG_ASSERT_PROTOCOL *This, IN CHAR8 *FileName, IN INTN LineNumber, IN CHAR8 *Description ) /*++ Routine Description: Worker function for ASSERT (). If Error Logging hub is loaded log ASSERT information. If Error Logging hub is not loaded CpuBreakpoint (). Arguments: This - Protocol instance. FileName - File name of failing routine. LineNumber - Line number of failing ASSERT(). Description - Description, usually the assertion, Returns: EFI_SUCCESS The function always completes successfully. --*/ { DebugAssert (FileName, LineNumber, Description); return EFI_SUCCESS; } EFI_STATUS EFIAPI StatusCodeDebugPrint ( IN EFI_DEBUG_ASSERT_PROTOCOL *This, IN UINTN ErrorLevel, IN CHAR8 *Format, IN VA_LIST Marker ) /*++ Routine Description: Worker function for DEBUG (). If Error Logging hub is loaded log ASSERT information. If Error Logging hub is not loaded do nothing. Arguments: This - Protocol Instance. ErrorLevel - If error level is set do the debug print. Format - String to use for the print, followed by Print arguments. Returns: EFI_SUCCESS The function always completes successfully. --*/ { CHAR8 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE]; AsciiVSPrint (Buffer, EFI_STATUS_CODE_DATA_MAX_SIZE, Format, Marker); DebugPrint (ErrorLevel, Buffer); return EFI_SUCCESS; } EFI_STATUS EFIAPI StatusCodeGetErrorLevel ( IN EFI_DEBUG_ASSERT_PROTOCOL *This, IN UINTN *ErrorLevel ) { *ErrorLevel = PcdGet32(PcdDebugPrintErrorLevel); return EFI_SUCCESS; } EFI_STATUS EFIAPI StatusCodeSetErrorLevel ( IN EFI_DEBUG_ASSERT_PROTOCOL *This, IN UINTN ErrorLevel ) { return EFI_UNSUPPORTED; } EFI_STATUS EFIAPI StatusCodePostCode ( IN EFI_DEBUG_ASSERT_PROTOCOL * This, IN UINT16 PostCode, IN CHAR8 *PostCodeString OPTIONAL ) /*++ Routine Description: Write the code to IO ports 80 and 81. Arguments: This - Protocol Instance. PostCode - Code to write PostCodeString - String, currently ignored. Returns: EFI_SUCCESS The function always completes successfully. --*/ { IoWrite8 (0x80, (UINT8) (PostCode & 0xff)); IoWrite8 (0x81, (UINT8) (PostCode >> 8)); return EFI_SUCCESS; } EFI_STATUS InstallStatusCodeDebugAssert ( VOID ) /*++ Routine Description: Install the status code debug assert protocol Arguments: None Returns: Results of call to InstallProtocolInterface. --*/ { DEBUG_CODE ( gBS->InstallProtocolInterface ( &mHandle, &gEfiDebugAssertProtocolGuid, EFI_NATIVE_INTERFACE, &mDebugAssertProtocol ); ); return EFI_SUCCESS; }