@@ -21,6 +21,20 @@ Module Name:
2121//
2222
2323#pragma pack (push, 1)
24+ typedef struct {
25+ UINT16 Year;
26+ UINT8 Month;
27+ UINT8 Day;
28+ UINT8 Hour;
29+ UINT8 Minute;
30+ UINT8 Second;
31+ UINT8 Pad1;
32+ UINT32 Nanosecond;
33+ INT16 TimeZone;
34+ UINT8 Daylight;
35+ UINT8 Pad2;
36+ } EFI_TIME;
37+
2438typedef struct {
2539 UINT32 Signature; // Signature
2640 UINT8 MajorVersion; // Major version of advanced logger message structure
@@ -33,6 +47,29 @@ typedef struct {
3347 // used to calculate the address of the Message
3448 // CHAR MessageText[]; // Message Text
3549} ADVANCED_LOGGER_MESSAGE_ENTRY_V2;
50+
51+ typedef volatile struct {
52+ UINT32 Signature; // Signature 'ALOG'
53+ UINT16 Version; // Current Version
54+ UINT16 Reserved[3 ]; // Reserved for future
55+ UINT32 LogBufferOffset; // Offset from LoggerInfo to start of log, expected to be the size of this structure 8 byte aligned
56+ UINT32 Reserved4;
57+ UINT32 LogCurrentOffset; // Offset from LoggerInfo to where to store next log entry.
58+ UINT32 DiscardedSize; // Number of bytes of messages missed
59+ UINT32 LogBufferSize; // Size of allocated buffer
60+ BOOLEAN InPermanentRAM; // Log in permanent RAM
61+ BOOLEAN AtRuntime; // After ExitBootServices
62+ BOOLEAN GoneVirtual; // After VirtualAddressChange
63+ BOOLEAN HdwPortInitialized; // HdwPort initialized
64+ BOOLEAN HdwPortDisabled; // HdwPort is Disabled
65+ BOOLEAN Reserved2[3 ]; //
66+ UINT64 TimerFrequency; // Ticks per second for log timing
67+ UINT64 TicksAtTime; // Ticks when Time Acquired
68+ EFI_TIME Time; // Uefi Time Field
69+ UINT32 HwPrintLevel; // Logging level to be printed at hw port
70+ UINT32 Reserved3; //
71+ } ADVANCED_LOGGER_INFO;
72+
3673#pragma pack (pop)
3774
3875PCSTR MemoryTypeString[] = {
@@ -262,6 +299,7 @@ advlog (
262299 ULONG Offset;
263300 ULONG End;
264301 ADVANCED_LOGGER_MESSAGE_ENTRY_V2 *Entry;
302+ ADVANCED_LOGGER_INFO Info = { 0 };
265303
266304 // NOTE: This implementation is a crude first past, The following should be done
267305 // in the future.
@@ -296,8 +334,9 @@ advlog (
296334 goto Exit;
297335 }
298336
299- GetFieldValue (InfoAddress, " ADVANCED_LOGGER_INFO" , " Version" , Version);
300- GetFieldValue (InfoAddress, " ADVANCED_LOGGER_INFO" , " LogBufferSize" , LogBufferSize);
337+ ReadMemory (InfoAddress, (PVOID)&Info, sizeof (Info), &BytesRead);
338+ Version = Info.Version ;
339+ LogBufferSize = Info.LogBufferSize ;
301340
302341 g_ExtControl->ControlledOutput (
303342 DEBUG_OUTCTL_AMBIENT_DML,
@@ -307,7 +346,7 @@ advlog (
307346 InfoAddress
308347 );
309348
310- dprintf (" Version: %d\n " , Version);
349+ dprintf (" Version: %d\n " , Info. Version );
311350 dprintf (" Size: 0x%x bytes\n " , LogBufferSize);
312351
313352 if (LogBufferSize == 0 ) {
@@ -319,63 +358,70 @@ advlog (
319358 if (Version == 4 ) {
320359 GetFieldValue (InfoAddress, " ADVANCED_LOGGER_INFO" , " LogBuffer" , EntryAddress);
321360 GetFieldValue (InfoAddress, " ADVANCED_LOGGER_INFO" , " LogCurrent" , EndAddress);
322- if (EndAddress < EntryAddress) {
323- dprintf (" Looped logs not yet implemented in extension!\n " );
324- Result = ERROR_NOT_SUPPORTED;
325- goto Exit;
326- } else {
327- // non-loop optimization, only download through the last message.
328- LogBufferSize = min (LogBufferSize, (ULONG)(EndAddress - InfoAddress));
329- }
330-
331- LogBuffer = (CHAR *)malloc (LogBufferSize);
361+ } else if (Version == 5 ) {
362+ EntryAddress = InfoAddress + Info.LogBufferOffset ;
363+ EndAddress = InfoAddress + Info.LogCurrentOffset ;
364+ } else {
365+ dprintf (" \n Version not implemented in debug extension!\n " );
366+ Result = ERROR_NOT_SUPPORTED;
367+ goto Exit;
368+ }
332369
333- // Output() forces IO flush to inform user.
334- g_ExtControl-> Output (DEBUG_OUTPUT_NORMAL, " Reading log (0x%x bytes) ... \n " , LogBufferSize );
335- ReadMemory (InfoAddress, LogBuffer, LogBufferSize, &BytesRead) ;
336- if (BytesRead != LogBufferSize) {
337- dprintf ( " Failed to read log memory! \n " );
338- Result = ERROR_BAD_LENGTH;
339- goto Exit ;
340- }
370+ if (EndAddress < EntryAddress) {
371+ dprintf ( " Looped logs not yet implemented in extension! \n " );
372+ Result = ERROR_NOT_SUPPORTED ;
373+ goto Exit;
374+ } else {
375+ // non-loop optimization, only download through the last message.
376+ LogBufferSize = min (LogBufferSize, (ULONG)(EndAddress - InfoAddress)) ;
377+ }
341378
342- Offset = (ULONG)(EntryAddress - InfoAddress);
343- End = (ULONG)(EndAddress - InfoAddress);
379+ LogBuffer = (CHAR *)malloc (LogBufferSize);
344380
345- dprintf ( " \n ------------------------------------------------------------------------------ \n " );
346- BOOLEAN PrevNL = TRUE ;
347- while (Offset < End) {
348- Entry = (ADVANCED_LOGGER_MESSAGE_ENTRY_V2 *)(LogBuffer + Offset);
349- if (Entry-> Signature != 0x324d4c41 ) {
350- dprintf ( " \n Bad message signature!! \n " ) ;
351- break ;
352- }
381+ // Output() forces IO flush to inform user.
382+ g_ExtControl-> Output (DEBUG_OUTPUT_NORMAL, " Reading log (0x%x bytes) ... \n " , LogBufferSize) ;
383+ ReadMemory (InfoAddress, LogBuffer, LogBufferSize, &BytesRead);
384+ if (BytesRead != LogBufferSize) {
385+ dprintf ( " Failed to read log memory! \n " );
386+ Result = ERROR_BAD_LENGTH ;
387+ goto Exit ;
388+ }
353389
354- ULONG StringEnd = Offset + Entry->MessageOffset + Entry->MessageLen ;
355- CHAR Temp = LogBuffer[StringEnd];
356- LogBuffer[StringEnd] = 0 ;
390+ Offset = (ULONG)(EntryAddress - InfoAddress);
391+ End = (ULONG)(EndAddress - InfoAddress);
357392
358- if (PrevNL) {
359- dprintf (
360- " %-8s| %-8s| " ,
361- (Entry->Phase < PHASE_COUNT ? PhaseStrings[Entry->Phase ] : " UNK" ),
362- ErrorLevelToString (Entry->DebugLevel )
363- );
364- }
393+ dprintf (" \n ------------------------------------------------------------------------------\n " );
394+ BOOLEAN PrevNL = TRUE ;
365395
366- dprintf (" %s" , LogBuffer + Offset + Entry->MessageOffset );
367- PrevNL = (LogBuffer[StringEnd - 1 ] == ' \n ' );
396+ while (Offset + sizeof (ADVANCED_LOGGER_MESSAGE_ENTRY_V2) <= End) {
397+ Entry = (ADVANCED_LOGGER_MESSAGE_ENTRY_V2 *)(LogBuffer + Offset);
398+ if (Entry->Signature != 0x324d4c41 ) {
399+ dprintf (" \n Bad message signature!! Entry Offset: 0x%x\n " , Offset);
400+ break ;
401+ }
368402
369- LogBuffer[StringEnd] = Temp;
403+ ULONG StringEnd = Offset + Entry->MessageOffset + Entry->MessageLen ;
404+ CHAR Temp = LogBuffer[StringEnd];
405+ LogBuffer[StringEnd] = 0 ;
370406
371- Offset = ALIGN_UP (Offset + Entry->MessageOffset + Entry->MessageLen , 8 );
407+ if (PrevNL) {
408+ dprintf (
409+ " %-8s| %-8s| " ,
410+ (Entry->Phase < PHASE_COUNT ? PhaseStrings[Entry->Phase ] : " UNK" ),
411+ ErrorLevelToString (Entry->DebugLevel )
412+ );
372413 }
373414
374- dprintf (" \n ------------------------------------------------------------------------------\n " );
375- } else {
376- dprintf (" \n Version not implemented in debug extension!\n " );
415+ dprintf (" %s" , LogBuffer + Offset + Entry->MessageOffset );
416+ PrevNL = (LogBuffer[StringEnd - 1 ] == ' \n ' );
417+
418+ LogBuffer[StringEnd] = Temp;
419+
420+ Offset = ALIGN_UP (Offset + Entry->MessageOffset + Entry->MessageLen , 8 );
377421 }
378422
423+ dprintf (" \n ------------------------------------------------------------------------------\n " );
424+
379425 Result = S_OK;
380426
381427Exit:
0 commit comments