fix bootlog crash at legacy boot
Signed-off-by: SergeySlice <sergey.slice@gmail.com>
This commit is contained in:
parent
45801ef2da
commit
235f13a3db
|
@ -73,7 +73,7 @@ extern MESSAGE_LOG_PROTOCOL *Msg;
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MsgLogEntrypoint (
|
MsgLogEntrypoint (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
|
@ -15,9 +15,14 @@
|
||||||
#include "Self.h"
|
#include "Self.h"
|
||||||
#include "guid.h"
|
#include "guid.h"
|
||||||
|
|
||||||
|
//Slice - if I set NEW_LOG to 0 then I will work with debug.log as in 5103
|
||||||
|
// but it is not working somehow.
|
||||||
|
// my purpose is to make debug.log open and close every second to see crashes.
|
||||||
|
// currently it is not happen. debug.log is not created at crash.
|
||||||
|
#define NEW_LOG 1
|
||||||
|
|
||||||
#ifndef DEBUG_ALL
|
#ifndef DEBUG_ALL
|
||||||
#define DEBUG_BOOTLOG 1
|
#define DEBUG_BOOTLOG 0
|
||||||
#else
|
#else
|
||||||
#define DEBUG_BOOTLOG DEBUG_ALL
|
#define DEBUG_BOOTLOG DEBUG_ALL
|
||||||
#endif
|
#endif
|
||||||
|
@ -94,6 +99,7 @@ public:
|
||||||
#if DEBUG_BOOTLOG == 0
|
#if DEBUG_BOOTLOG == 0
|
||||||
#define DGB_nbCallback(...)
|
#define DGB_nbCallback(...)
|
||||||
#else
|
#else
|
||||||
|
//Slice - it crashes at legacy boot
|
||||||
#define DGB_nbCallback(...) do { SuspendMemLogCallback smc; DBG(__VA_ARGS__); } while (0)
|
#define DGB_nbCallback(...) do { SuspendMemLogCallback smc; DBG(__VA_ARGS__); } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -110,7 +116,7 @@ void closeDebugLog()
|
||||||
//DGB_nbCallback("closeDebugLog() -> %s\n", efiStrError(Status));
|
//DGB_nbCallback("closeDebugLog() -> %s\n", efiStrError(Status));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if NEW_LOG
|
||||||
static UINTN GetDebugLogFile()
|
static UINTN GetDebugLogFile()
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
@ -142,12 +148,12 @@ static UINTN GetDebugLogFile()
|
||||||
|
|
||||||
if ( debugLogFileName.isEmpty() )
|
if ( debugLogFileName.isEmpty() )
|
||||||
{
|
{
|
||||||
debugLogFileName = S8Printf("misc\\%d-%d-%d_%d-%d-%d_%ls.log", Now.Year, Now.Month, Now.Day, Now.Hour, Now.Minute, Now.Second, self.getCloverEfiFileName().wc_str());
|
debugLogFileName = S8Printf("misc\\%d-%d-%d_%d-%d_%ls.log", Now.Year, Now.Month, Now.Day, Now.Hour, Now.Minute, self.getCloverEfiFileName().wc_str());
|
||||||
Status = self.getCloverDir().Open(&self.getCloverDir(), &LogFile, debugLogFileName.wc_str(), EFI_FILE_MODE_READ, 0);
|
Status = self.getCloverDir().Open(&self.getCloverDir(), &LogFile, debugLogFileName.wc_str(), EFI_FILE_MODE_READ, 0);
|
||||||
if ( !EFI_ERROR(Status) ) LogFile->Close(LogFile); // DO NOT modify Status here.
|
if ( !EFI_ERROR(Status) ) LogFile->Close(LogFile); // DO NOT modify Status here.
|
||||||
INTN i=1;
|
INTN i=1;
|
||||||
while ( Status != EFI_NOT_FOUND && (i < MAX_INTN) ) {
|
while ( Status != EFI_NOT_FOUND && (i < MAX_INTN) ) {
|
||||||
debugLogFileName = S8Printf("misc\\%d-%d-%d_%d-%d-%d_%ls(%lld).log", Now.Year, Now.Month, Now.Day, Now.Hour, Now.Minute, Now.Second, self.getCloverEfiFileName().wc_str(), i);
|
debugLogFileName = S8Printf("misc\\%d-%d-%d_%d-%d_%ls(%lld).log", Now.Year, Now.Month, Now.Day, Now.Hour, Now.Minute, self.getCloverEfiFileName().wc_str(), i);
|
||||||
Status = self.getCloverDir().Open(&self.getCloverDir(), &LogFile, debugLogFileName.wc_str(), EFI_FILE_MODE_READ, 0);
|
Status = self.getCloverDir().Open(&self.getCloverDir(), &LogFile, debugLogFileName.wc_str(), EFI_FILE_MODE_READ, 0);
|
||||||
if ( !EFI_ERROR(Status) ) LogFile->Close(LogFile); // DO NOT modify Status here.
|
if ( !EFI_ERROR(Status) ) LogFile->Close(LogFile); // DO NOT modify Status here.
|
||||||
}
|
}
|
||||||
|
@ -193,7 +199,65 @@ static UINTN GetDebugLogFile()
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
EFI_FILE_PROTOCOL* GetDebugLogFile()
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_LOADED_IMAGE *LoadedImage;
|
||||||
|
EFI_FILE_PROTOCOL *RootDir;
|
||||||
|
EFI_FILE_PROTOCOL *LogFile;
|
||||||
|
|
||||||
|
EFI_TIME Now;
|
||||||
|
Status = gRT->GetTime(&Now, NULL);
|
||||||
|
if ( debugLogFileName.isEmpty() ) {
|
||||||
|
debugLogFileName = S8Printf("misc\\%d-%d-%d_%d-%d_%ls.log", Now.Year, Now.Month, Now.Day, Now.Hour, Now.Minute, self.getCloverEfiFileName().wc_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// get RootDir from device we are loaded from
|
||||||
|
Status = gBS->HandleProtocol(gImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &LoadedImage);
|
||||||
|
if (EFI_ERROR(Status)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
RootDir = EfiLibOpenRoot(LoadedImage->DeviceHandle);
|
||||||
|
if (RootDir == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open log file from current root
|
||||||
|
Status = RootDir->Open(RootDir, &LogFile, debugLogFileName.wc_str(),
|
||||||
|
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0);
|
||||||
|
|
||||||
|
// If the log file is not found try to create it
|
||||||
|
if (Status == EFI_NOT_FOUND) {
|
||||||
|
Status = RootDir->Open(RootDir, &LogFile, debugLogFileName.wc_str(),
|
||||||
|
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, 0);
|
||||||
|
}
|
||||||
|
RootDir->Close(RootDir);
|
||||||
|
RootDir = NULL;
|
||||||
|
|
||||||
|
if (EFI_ERROR(Status)) {
|
||||||
|
// try on first EFI partition
|
||||||
|
Status = egFindESP(&RootDir);
|
||||||
|
if (!EFI_ERROR(Status)) {
|
||||||
|
Status = RootDir->Open(RootDir, &LogFile, debugLogFileName.wc_str(),
|
||||||
|
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0);
|
||||||
|
// If the log file is not found try to create it
|
||||||
|
if (Status == EFI_NOT_FOUND) {
|
||||||
|
Status = RootDir->Open(RootDir, &LogFile, debugLogFileName.wc_str(),
|
||||||
|
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, 0);
|
||||||
|
}
|
||||||
|
RootDir->Close(RootDir);
|
||||||
|
RootDir = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EFI_ERROR(Status)) {
|
||||||
|
LogFile = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return LogFile;
|
||||||
|
}
|
||||||
|
|
||||||
// Jief : do we need that ?
|
// Jief : do we need that ?
|
||||||
// if (EFI_ERROR(Status)) {
|
// if (EFI_ERROR(Status)) {
|
||||||
|
@ -211,8 +275,10 @@ static UINTN GetDebugLogFile()
|
||||||
// RootDir = NULL;
|
// RootDir = NULL;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if NEW_LOG
|
||||||
VOID SaveMessageToDebugLogFile(IN CHAR8 *LastMessage)
|
VOID SaveMessageToDebugLogFile(IN CHAR8 *LastMessage)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
@ -248,6 +314,45 @@ VOID SaveMessageToDebugLogFile(IN CHAR8 *LastMessage)
|
||||||
// Not all Firmware implements Flush. So we have to close every time to force flush.
|
// Not all Firmware implements Flush. So we have to close every time to force flush.
|
||||||
closeDebugLog();
|
closeDebugLog();
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
VOID SaveMessageToDebugLogFile(IN CHAR8 *LastMessage)
|
||||||
|
{
|
||||||
|
STATIC BOOLEAN FirstTimeSave = TRUE;
|
||||||
|
// STATIC UINTN Position = 0;
|
||||||
|
CHAR8 *MemLogBuffer;
|
||||||
|
UINTN MemLogLen;
|
||||||
|
CHAR8 *Text;
|
||||||
|
UINTN TextLen;
|
||||||
|
EFI_FILE_HANDLE LogFile;
|
||||||
|
|
||||||
|
MemLogBuffer = GetMemLogBuffer();
|
||||||
|
MemLogLen = GetMemLogLen();
|
||||||
|
Text = LastMessage;
|
||||||
|
TextLen = AsciiStrLen(LastMessage);
|
||||||
|
|
||||||
|
/*UINTN lastWrittenOffset = GetDebugLogFile();*/
|
||||||
|
LogFile = GetDebugLogFile();
|
||||||
|
|
||||||
|
// Write to the log file
|
||||||
|
if (LogFile != NULL) {
|
||||||
|
// Advance to the EOF so we append
|
||||||
|
EFI_FILE_INFO *Info = EfiLibFileInfo(LogFile);
|
||||||
|
if (Info) {
|
||||||
|
LogFile->SetPosition(LogFile, Info->FileSize);
|
||||||
|
// If we haven't had root before this write out whole log
|
||||||
|
if (FirstTimeSave) {
|
||||||
|
Text = MemLogBuffer;
|
||||||
|
TextLen = MemLogLen;
|
||||||
|
FirstTimeSave = FALSE;
|
||||||
|
}
|
||||||
|
// Write out this message
|
||||||
|
LogFile->Write(LogFile, &TextLen, Text);
|
||||||
|
}
|
||||||
|
LogFile->Close(LogFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void EFIAPI MemLogCallback(IN INTN DebugMode, IN CHAR8 *LastMessage)
|
void EFIAPI MemLogCallback(IN INTN DebugMode, IN CHAR8 *LastMessage)
|
||||||
{
|
{
|
||||||
|
|
|
@ -576,13 +576,15 @@ static EFI_STATUS GopSetModeAndReconnectTextOut(IN UINT32 ModeNumber)
|
||||||
// UINTN Index;
|
// UINTN Index;
|
||||||
EFI_HANDLE *HandleBuffer = NULL;
|
EFI_HANDLE *HandleBuffer = NULL;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
// return EFI_UNSUPPORTED;
|
||||||
if (GraphicsOutput == NULL) {
|
if (GraphicsOutput == NULL) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
// MsgLog("test 1\n");
|
||||||
Status = GraphicsOutput->SetMode(GraphicsOutput, ModeNumber);
|
Status = GraphicsOutput->SetMode(GraphicsOutput, ModeNumber);
|
||||||
MsgLog("Video mode change to mode #%d: %s\n", ModeNumber, efiStrError(Status));
|
// MsgLog("test 2\n");
|
||||||
|
const char* strStatus = efiStrError(Status);
|
||||||
|
MsgLog("Video mode change to mode #%d: %s\n", ModeNumber, strStatus);
|
||||||
|
|
||||||
if (gFirmwareClover && !EFI_ERROR(Status)) {
|
if (gFirmwareClover && !EFI_ERROR(Status)) {
|
||||||
// When we change mode on GOP, we need to reconnect the drivers which produce simple text out
|
// When we change mode on GOP, we need to reconnect the drivers which produce simple text out
|
||||||
|
|
Loading…
Reference in New Issue