mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-11 14:28:08 +01:00
87 lines
2.2 KiB
C
87 lines
2.2 KiB
C
|
/** @file
|
||
|
|
||
|
Log to memory buffer.
|
||
|
|
||
|
By dmazar, 26/09/2012
|
||
|
|
||
|
**/
|
||
|
|
||
|
|
||
|
#include <Library/UefiLib.h>
|
||
|
#include <Library/MemoryAllocationLib.h>
|
||
|
#include <Library/UefiBootServicesTableLib.h>
|
||
|
#include <Library/PrintLib.h>
|
||
|
|
||
|
#include "Common.h"
|
||
|
#include "MemLog.h"
|
||
|
|
||
|
//
|
||
|
// Mem log sizes
|
||
|
//
|
||
|
#define MEM_LOG_INITIAL_SIZE (32 * 1024)
|
||
|
#define MEM_LOG_MAX_SIZE (16 * 1024 * 1024)
|
||
|
#define MEM_LOG_MAX_LINE_SIZE 1024
|
||
|
|
||
|
/** Prints log messages to memory buffer. */
|
||
|
EFI_STATUS EFIAPI
|
||
|
MemLogPrint(IN MEM_LOG *MemLog, IN CHAR8 *Format, ...)
|
||
|
{
|
||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||
|
VA_LIST Marker;
|
||
|
UINTN DataWritten;
|
||
|
|
||
|
if (MemLog->Buffer == NULL) {
|
||
|
// init log buffer
|
||
|
MemLog->BufferSize = MEM_LOG_INITIAL_SIZE;
|
||
|
MemLog->Buffer = AllocateZeroPool(MemLog->BufferSize);
|
||
|
MemLog->Size = 0;
|
||
|
}
|
||
|
|
||
|
if (MemLog->Size + MEM_LOG_MAX_LINE_SIZE > MemLog->BufferSize) {
|
||
|
// not enough place for max line - make buffer bigger
|
||
|
// but not too big (if something gets out of controll)
|
||
|
if (MemLog->BufferSize * 2 > MEM_LOG_MAX_SIZE) {
|
||
|
return EFI_OUT_OF_RESOURCES;
|
||
|
}
|
||
|
MemLog->Buffer = ReallocatePool(MemLog->BufferSize, MemLog->BufferSize * 2, MemLog->Buffer);
|
||
|
MemLog->BufferSize *= 2;
|
||
|
}
|
||
|
|
||
|
// add log to buffer
|
||
|
VA_START (Marker, Format);
|
||
|
DataWritten = AsciiVSPrint(
|
||
|
MemLog->Buffer + MemLog->Size,
|
||
|
MemLog->BufferSize - MemLog->Size,
|
||
|
Format,
|
||
|
Marker);
|
||
|
VA_END (Marker);
|
||
|
MemLog->Size += DataWritten;
|
||
|
|
||
|
#if LOG_TO_FILE >= 3
|
||
|
// append to file while logging (at end of line)
|
||
|
if (DataWritten >= 1 && *(MemLog->Buffer + MemLog->Size - 1) == '\n') {
|
||
|
Status = FsAppendMemToFileToDefaultDir(LOG_TO_FILE_PATH, (VOID*)MemLog->Buffer, MemLog->Size);
|
||
|
MemLog->Size = 0;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
|
||
|
/** Saves log to Log.txt in the same dir as driver. */
|
||
|
EFI_STATUS
|
||
|
MemLogSave(IN MEM_LOG *MemLog)
|
||
|
{
|
||
|
# if (LOG_TO_FILE == 1) || (LOG_TO_FILE == 2)
|
||
|
return FsSaveMemToFileToDefaultDir(LOG_TO_FILE_PATH, (VOID*)MemLog->Buffer, MemLog->Size);
|
||
|
# elif LOG_TO_FILE >= 3
|
||
|
if (MemLog->Size > 0) {
|
||
|
FsAppendMemToFileToDefaultDir(LOG_TO_FILE_PATH, (VOID*)MemLog->Buffer, MemLog->Size);
|
||
|
}
|
||
|
return FsAppendMemClose(TRUE);
|
||
|
# else
|
||
|
return EFI_SUCCESS;
|
||
|
# endif
|
||
|
}
|