VOID EFIAPI PrintString ( IN CONST CHAR8 *FormatString, ... ) { #if (DEBUG_PRINT_LEVEL & 0x7FFFFFFF) UINTN Index; CHAR8 PrintBuffer[1000]; VA_LIST Marker; VA_START (Marker, FormatString); AsciiVSPrint (PrintBuffer, sizeof (PrintBuffer), FormatString, Marker); VA_END (Marker); for (Index = 0; PrintBuffer[Index] != 0; Index++) { if (PrintBuffer[Index] == '\n') { mCursor = (UINT8 *) (UINTN) (0xb8000 + (((((UINTN)mCursor - 0xb8000) + 160) / 160) * 160)); } else if (PrintBuffer[Index] != '\r') { // skip non-displayable character *mCursor = (UINT8) PrintBuffer[Index]; mCursor += 2; } } // // All information also output to serial port. // SerialPortWrite ((UINT8 *) PrintBuffer, Index); #endif }
VOID EFIAPI DebugPrint(IN UINTN ErrorLevel, IN CONST CHAR8 *Format, ...) { CHAR8 szBuf[256]; VA_LIST va; UINTN cch; RTCCUINTREG SavedFlags; /* No pool noise, please. */ if (ErrorLevel == DEBUG_POOL) return; VA_START(va, Format); cch = AsciiVSPrint(szBuf, sizeof(szBuf), Format, va); VA_END(va); /* make sure it's terminated and doesn't end with a newline */ if (cch >= sizeof(szBuf)) cch = sizeof(szBuf) - 1; while (cch > 0 && (szBuf[cch - 1] == '\n' || szBuf[cch - 1] == '\r')) cch--; szBuf[cch] = '\0'; SavedFlags = ASMIntDisableFlags(); VBoxPrintString("dbg/"); VBoxPrintHex(ErrorLevel, sizeof(ErrorLevel)); VBoxPrintChar(' '); VBoxPrintString(szBuf); VBoxPrintChar('\n'); ASMSetFlags(SavedFlags); }
/** Prints a debug message to the debug output device if the specified error level is enabled. If any bit in ErrorLevel is also set in PcdDebugPrintErrorLevel, then print the message specified by Format and the associated variable argument list to the debug output device. If Format is NULL, then ASSERT(). @param ErrorLevel The error level of the debug message. @param Format Format string for the debug message to print. **/ VOID EFIAPI DebugPrint ( IN UINTN ErrorLevel, IN CONST CHAR8 *Format, ... ) { CHAR8 AsciiBuffer[MAX_DEBUG_MESSAGE_LENGTH]; VA_LIST Marker; // // If Format is NULL, then ASSERT(). // ASSERT (Format != NULL); // // Check driver debug mask value and global mask // if ((ErrorLevel & PcdGet32(PcdDebugPrintErrorLevel)) == 0) { return; } // // Convert the DEBUG() message to a Unicode String // VA_START (Marker, Format); AsciiVSPrint (AsciiBuffer, sizeof (AsciiBuffer), Format, Marker); VA_END (Marker); SemihostWriteString (AsciiBuffer); }
/** Prints a debug message to the debug output device if the specified error level is enabled. If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function GetDebugPrintErrorLevel (), then print the message specified by Format and the associated variable argument list to the debug output device. If Format is NULL, then ASSERT(). @param ErrorLevel The error level of the debug message. @param Format Format string for the debug message to print. @param ... A variable argument list whose contents are accessed based on the format string specified by Format. **/ VOID EFIAPI DebugPrint ( IN UINTN ErrorLevel, IN CONST CHAR8 *Format, ... ) { CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH]; VA_LIST Marker; // // If Format is NULL, then ASSERT(). // ASSERT (Format != NULL); // // Check driver debug mask value and global mask // if ((ErrorLevel & GetDebugPrintErrorLevel ()) == 0) { return; } // // Convert the DEBUG() message to an ASCII String // VA_START (Marker, Format); AsciiVSPrint (Buffer, sizeof (Buffer), Format, Marker); VA_END (Marker); // // Send the print string to EFI_DEBUGPORT_PROTOCOL.Write. // UefiDebugLibDebugPortProtocolWrite (Buffer, AsciiStrLen (Buffer)); }
VOID EFIAPI PrintString ( IN CONST CHAR8 *FormatString, ... ) { UINTN Index; CHAR8 PrintBuffer[256]; VA_LIST Marker; VA_START (Marker, FormatString); AsciiVSPrint (PrintBuffer, sizeof (PrintBuffer), FormatString, Marker); VA_END (Marker); for (Index = 0; PrintBuffer[Index] != 0; Index++) { if (PrintBuffer[Index] == '\n') { mCursor = (UINT8 *) (UINTN) (0xb8000 + (((((UINTN)mCursor - 0xb8000) + 160) / 160) * 160)); } else { *mCursor = (UINT8) PrintBuffer[Index]; mCursor += 2; } } // // All information also output to serial port. // SerialPortWrite ((UINT8 *) PrintBuffer, Index); }
int sprintf_s(char *str, size_t sizeOfBuffer, char const *fmt, ...) { VA_LIST Marker; int NumberOfPrinted; VA_START (Marker, fmt); NumberOfPrinted = (int)AsciiVSPrint (str, sizeOfBuffer, fmt, Marker); VA_END (Marker); return NumberOfPrinted; }
/** Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated ASCII format string and variable argument list. Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer and BufferSize. The ASCII string is produced by parsing the format string specified by FormatString. Arguments are pulled from the variable argument list based on the contents of the format string. The number of ASCII characters in the produced output buffer is returned not including the Null-terminator. If BufferSize is 0, then no output buffer is produced and 0 is returned. If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT(). If BufferSize > 0 and FormatString is NULL, then ASSERT(). If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then ASSERT(). If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string contains more than PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then ASSERT(). @param StartOfBuffer A pointer to the output buffer for the produced Null-terminated ASCII string. @param BufferSize The size, in bytes, of the output buffer specified by StartOfBuffer. @param FormatString A Null-terminated ASCII format string. @param ... Variable argument list whose contents are accessed based on the format string specified by FormatString. @return The number of ASCII characters in the produced output buffer not including the Null-terminator. **/ UINTN EFIAPI AsciiSPrint ( OUT CHAR8 *StartOfBuffer, IN UINTN BufferSize, IN CONST CHAR8 *FormatString, ... ) { VA_LIST Marker; UINTN NumberOfPrinted; VA_START (Marker, FormatString); NumberOfPrinted = AsciiVSPrint (StartOfBuffer, BufferSize, FormatString, Marker); VA_END (Marker); return NumberOfPrinted; }
/** * Our own log worker function, avoid the dbg/00000xxx prefix and makes it clear * which log statements we added.. * * @param pszFormat Format string. EFI style! * @param ... Argument referneced in the format string. */ VOID EFIAPI VBoxLogWorker(const char *pszFormat, ...) { CHAR8 szBuf[384]; VA_LIST va; RTCCUINTREG SavedFlags; /* Format it. */ VA_START(va, pszFormat); AsciiVSPrint(szBuf, sizeof(szBuf), pszFormat, va); VA_END(va); szBuf[sizeof(szBuf) - 1] = '\0'; /* Output the log string. */ SavedFlags = ASMIntDisableFlags(); VBoxPrintString(szBuf); VBoxPrintChar('\n'); ASMSetFlags(SavedFlags); }
/** Prints a message to the serial port. @param Format Format string for the message to print. @param ... Variable argument list whose contents are accessed based on the format string specified by Format. **/ VOID EFIAPI InternalPrintMessage ( IN CONST CHAR8 *Format, ... ) { CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH]; VA_LIST Marker; // // Convert the message to an ASCII String // VA_START (Marker, Format); AsciiVSPrint (Buffer, sizeof (Buffer), Format, Marker); VA_END (Marker); // // Send the print string to a Serial Port // SerialPortWrite ((UINT8 *)Buffer, AsciiStrLen (Buffer)); }
/** Prints a debug message to the debug output device if the specified error level is enabled. If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function GetDebugPrintErrorLevel (), then print the message specified by Format and the associated variable argument list to the debug output device. If Format is NULL, then ASSERT(). @param ErrorLevel The error level of the debug message. @param Format Format string for the debug message to print. @param ... Variable argument list whose contents are accessed based on the format string specified by Format. **/ VOID EFIAPI DebugPrint ( IN UINTN ErrorLevel, IN CONST CHAR8 *Format, ... ) { CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH]; VA_LIST Marker; UINT8 *Ptr; // // If Format is NULL, then ASSERT(). // ASSERT (Format != NULL); // // Check driver debug mask value and global mask // if ((ErrorLevel & GetDebugPrintErrorLevel ()) == 0) { return; } // // Convert the DEBUG() message to an ASCII String // VA_START (Marker, Format); AsciiVSPrint (Buffer, sizeof (Buffer), Format, Marker); VA_END (Marker); // // Send the print string to the debug I/O port // for (Ptr = (UINT8 *) Buffer; *Ptr; Ptr++) { IoWrite8 (PcdGet16(PcdDebugIoPort), *Ptr); } }
/** Prints a debug message to the debug output device if the specified error level is enabled. If any bit in ErrorLevel is also set in PcdDebugPrintErrorLevel, then print the message specified by Format and the associated variable argument list to the debug output device. If Format is NULL, then ASSERT(). @param ErrorLevel The error level of the debug message. @param Format Format string for the debug message to print. @param ... Variable argument list whose contents are accessed based on the format string specified by Format. **/ VOID EFIAPI DebugPrint ( IN UINTN ErrorLevel, IN CONST CHAR8 *Format, ... ) { CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH]; VA_LIST Marker; // // If Format is NULL, then ASSERT(). // ASSERT (Format != NULL); // // Check driver debug mask value and global mask // if ((ErrorLevel & GetDebugPrintErrorLevel ()) == 0) { return; } // // Convert the DEBUG() message to an ASCII String // VA_START (Marker, Format); AsciiVSPrint (Buffer, sizeof (Buffer), Format, Marker); VA_END (Marker); // // Send the print string to a Serial Port // AcquireSpinLock (&mInternalDebugLock); SerialPortWrite ((UINT8 *) Buffer, AsciiStrLen(Buffer)); ReleaseSpinLock (&mInternalDebugLock); }
/** Prints a log message to memory buffer. @param Timing TRUE to prepend timing to log. @param DebugMode DebugMode will be passed to Callback function if it is set. @param Format The format string for the debug message to print. @param Marker VA_LIST with variable arguments for Format. **/ VOID EFIAPI MemLogVA ( IN CONST BOOLEAN Timing, IN CONST INTN DebugMode, IN CONST CHAR8 *Format, IN VA_LIST Marker ) { EFI_STATUS Status; UINTN DataWritten; CHAR8 *LastMessage; if (Format == NULL) { return; } if (mMemLog == NULL) { Status = MemLogInit (); if (EFI_ERROR (Status)) { return; } } // // Check if buffer can accept MEM_LOG_MAX_LINE_SIZE chars. // Increase buffer if not. // if ((UINTN)(mMemLog->Cursor - mMemLog->Buffer) + MEM_LOG_MAX_LINE_SIZE > mMemLog->BufferSize) { UINTN Offset; // not enough place for max line - make buffer bigger // but not too big (if something gets out of controll) if (mMemLog->BufferSize + MEM_LOG_INITIAL_SIZE > MEM_LOG_MAX_SIZE) { // Out of resources! return; } Offset = mMemLog->Cursor - mMemLog->Buffer; mMemLog->Buffer = ReallocatePool(mMemLog->BufferSize, mMemLog->BufferSize + MEM_LOG_INITIAL_SIZE, mMemLog->Buffer); mMemLog->BufferSize += MEM_LOG_INITIAL_SIZE; mMemLog->Cursor = mMemLog->Buffer + Offset; } // // Add log to buffer // LastMessage = mMemLog->Cursor; if (Timing) { // // Write timing only at the beginnign of a new line // if ((mMemLog->Buffer[0] == '\0') || (mMemLog->Cursor[-1] == '\n')) { DataWritten = AsciiSPrint( mMemLog->Cursor, mMemLog->BufferSize - (mMemLog->Cursor - mMemLog->Buffer), "%a ", GetTiming ()); mMemLog->Cursor += DataWritten; } } DataWritten = AsciiVSPrint( mMemLog->Cursor, mMemLog->BufferSize - (mMemLog->Cursor - mMemLog->Buffer), Format, Marker); mMemLog->Cursor += DataWritten; // // Pass this last message to callback if defined // if (mMemLog->Callback != NULL) { mMemLog->Callback(DebugMode, LastMessage); } }