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); }
VOID EFIAPI DebugAssert(IN CONST CHAR8 *FileName, IN UINTN LineNumber, IN CONST CHAR8 *Description) { RTCCUINTREG SavedFlags = ASMIntDisableFlags(); VBoxPrintString("EFI Assertion failed! File="); VBoxPrintString(FileName ? FileName : "<NULL>"); VBoxPrintString(" line=0x"); VBoxPrintHex(LineNumber, sizeof(LineNumber)); VBoxPrintString("\nDescription: "); VBoxPrintString(Description ? Description : "<NULL>"); ASMOutU8(EFI_PANIC_PORT, 2); /** @todo fix this. */ ASMSetFlags(SavedFlags); }
/** * Prints a hex dump the specified memory block. * * @returns Number of bytes printed. * * @param pv The memory to dump. * @param cb Number of bytes to dump. */ size_t VBoxPrintHexDump(const void *pv, size_t cb) { size_t cchPrinted = 0; uint8_t const *pb = (uint8_t const *)pv; while (cb > 0) { unsigned i; /* the offset */ cchPrinted += VBoxPrintHex((uintptr_t)pb, sizeof(pb)); cchPrinted += VBoxPrintString(" "); /* the hex bytes value. */ for (i = 0; i < 16; i++) { cchPrinted += vboxPrintHexDumpChar(i == 7 ? '-' : ' '); if (i < cb) cchPrinted += VBoxPrintHex(pb[i], 1); else cchPrinted += VBoxPrintString(" "); } /* the printable chars */ cchPrinted += VBoxPrintString(" "); for (i = 0; i < 16 && i < cb; i++) cchPrinted += vboxPrintHexDumpChar(isprint(pb[i]) ? pb[i] : '.'); /* finally, the new line. */ cchPrinted += vboxPrintHexDumpChar('\n'); /* * Advance. */ if (cb <= 16) break; cb -= 16; pb += 16; } return cchPrinted; }
/** * 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); }