Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 50 additions & 11 deletions AdvLoggerPkg/Library/AdvLoggerMmAccessLib/AdvLoggerMmAccessLib.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,23 @@
#include <AdvancedLoggerInternal.h>

#include <Protocol/AdvancedLogger.h>
#include <Protocol/MmReadyToLock.h>

#include <Library/AdvLoggerAccessLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/HobLib.h>
#include <Library/PcdLib.h>
#include <Library/MmServicesTableLib.h>
#include <Library/SafeIntLib.h>
#include <Library/UefiBootServicesTableLib.h>

STATIC ADVANCED_LOGGER_INFO *mLoggerInfo = NULL;
STATIC UINT32 mBufferSize = 0;
STATIC EFI_PHYSICAL_ADDRESS mMaxAddress = 0;
STATIC UINTN mLoggerTransferSize = 0;
STATIC BOOLEAN mReadyToLock = FALSE;
extern UINTN mVariableBufferPayloadSize;

/**
Expand Down Expand Up @@ -139,6 +142,38 @@ ValidateInfoBlock (
return TRUE;
}

/**
MM ReadyToLock notification handler.

Ensures any move needed to the new logger buffer is done before ReadyToLock completes.

@param[in] Protocol Protocol GUID pointer.
@param[in] Interface Protocol interface pointer.
@param[in] Handle The handle on which the interface was installed.

@retval EFI_SUCCESS The notification handler completed successfully.

**/
STATIC
EFI_STATUS
EFIAPI
OnMmReadyToLock (
IN CONST EFI_GUID *Protocol,
IN VOID *Interface,
IN EFI_HANDLE Handle
)
{
if ((mLoggerInfo != NULL) && !FeaturePcdGet (PcdAdvancedLoggerFixedInRAM)) {
if (AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
DEBUG ((DEBUG_INFO, "%a: Logger buffer migrated at ReadyToLock. LoggerInfo=%p\n", __FUNCTION__, mLoggerInfo));
}
}

mReadyToLock = TRUE;

return EFI_SUCCESS;
}

/**
AdvLoggerInit - Obtain the address of the logger info block.

Expand All @@ -152,6 +187,7 @@ AdvLoggerAccessInit (
)
{
EFI_HOB_GUID_TYPE *GuidHob;
VOID *Registration;
ADVANCED_LOGGER_PTR *LogPtr;
EFI_STATUS Status;
UINTN TempSize;
Expand All @@ -173,11 +209,11 @@ AdvLoggerAccessInit (

if (mLoggerInfo != NULL) {
mMaxAddress = LOG_MAX_ADDRESS (mLoggerInfo);
}

if ((mLoggerInfo != NULL) && !FeaturePcdGet (PcdAdvancedLoggerFixedInRAM)) {
if (AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
DEBUG ((DEBUG_INFO, "%a: Logger buffer migrated. LoggerInfo=%p\n", __FUNCTION__, mLoggerInfo));
if (!FeaturePcdGet (PcdAdvancedLoggerFixedInRAM)) {
if (AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
DEBUG ((DEBUG_INFO, "%a: Logger buffer migrated. LoggerInfo=%p\n", __FUNCTION__, mLoggerInfo));
}
}
}

Expand Down Expand Up @@ -208,6 +244,15 @@ AdvLoggerAccessInit (
//

DEBUG ((DEBUG_INFO, "%a: LoggerInfo=%p, code=%r\n", __FUNCTION__, mLoggerInfo, Status));

Status = gMmst->MmRegisterProtocolNotify (
&gEfiMmReadyToLockProtocolGuid,
OnMmReadyToLock,
&Registration
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: Failed to register ReadyToLock notify - %r\n", __func__, Status));
}
}

/**
Expand Down Expand Up @@ -263,7 +308,7 @@ AdvLoggerAccessGetVariable (
UINT8 *LogBufferEnd;
UINTN LogBufferSize;

if ((mLoggerInfo != NULL) && !mLoggerInfo->AtRuntime && !FeaturePcdGet (PcdAdvancedLoggerFixedInRAM)) {
if ((mLoggerInfo != NULL) && !mReadyToLock && !FeaturePcdGet (PcdAdvancedLoggerFixedInRAM)) {
if (AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
DEBUG ((DEBUG_INFO, "%a: Logger buffer migrated during access. LoggerInfo=%p\n", __FUNCTION__, mLoggerInfo));
}
Expand Down Expand Up @@ -335,12 +380,6 @@ AdvLoggerAccessAtRuntime (
VOID
)
{
if ((mLoggerInfo != NULL) && !FeaturePcdGet (PcdAdvancedLoggerFixedInRAM)) {
if (AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
DEBUG ((DEBUG_INFO, "%a: Logger buffer migrated at ExitBootServices. LoggerInfo=%p\n", __FUNCTION__, mLoggerInfo));
}
}

if (mLoggerInfo != NULL) {
mLoggerInfo->AtRuntime = TRUE;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,17 @@
BaseMemoryLib
DebugLib
HobLib
MmServicesTableLib
PcdLib
SafeIntLib

[Guids]
gAdvancedLoggerHobGuid
gAdvLoggerAccessGuid ## CONSUMES

[Protocols]
gEfiMmReadyToLockProtocolGuid ## NOTIFY

[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize
gAdvLoggerPkgTokenSpaceGuid.PcdAdvancedLoggerBase
Expand Down
59 changes: 51 additions & 8 deletions AdvLoggerPkg/Library/AdvLoggerSmmAccessLib/AdvLoggerSmmAccessLib.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <Guid/SmmVariableCommon.h>

#include <Protocol/AdvancedLogger.h>
#include <Protocol/SmmReadyToLock.h>
#include <AdvancedLoggerInternalProtocol.h>

#include <Library/AdvLoggerAccessLib.h>
Expand All @@ -21,12 +22,14 @@
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <Library/SafeIntLib.h>
#include <Library/SmmServicesTableLib.h>
#include <Library/UefiBootServicesTableLib.h>

STATIC ADVANCED_LOGGER_INFO *mLoggerInfo = NULL;
STATIC UINT32 mBufferSize = 0;
STATIC EFI_PHYSICAL_ADDRESS mMaxAddress = 0;
STATIC UINTN mLoggerTransferSize = 0;
STATIC BOOLEAN mReadyToLock = FALSE;
extern UINTN mVariableBufferPayloadSize;

/**
Expand Down Expand Up @@ -141,6 +144,38 @@ ValidateInfoBlock (
return TRUE;
}

/**
SMM ReadyToLock notification handler.

Ensures any move needed to the new logger buffer is done before ReadyToLock completes.

@param[in] Protocol Protocol GUID pointer.
@param[in] Interface Protocol interface pointer.
@param[in] Handle The handle on which the interface was installed.

@retval EFI_SUCCESS The notification handler completed successfully.

**/
STATIC
EFI_STATUS
EFIAPI
OnSmmReadyToLock (
IN CONST EFI_GUID *Protocol,
IN VOID *Interface,
IN EFI_HANDLE Handle
)
{
if (mLoggerInfo != NULL) {
if (AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
DEBUG ((DEBUG_INFO, "%a: Logger buffer migrated at ReadyToLock. LoggerInfo=%p\n", __func__, mLoggerInfo));
}
}

mReadyToLock = TRUE;

return EFI_SUCCESS;
}

/**
AdvLoggerInit - Obtain the address of the logger info block.

Expand All @@ -154,9 +189,12 @@ AdvLoggerAccessInit (
)
{
ADVANCED_LOGGER_PROTOCOL *LoggerProtocol;
VOID *Registration;
UINTN TempSize;
EFI_STATUS Status;

Registration = NULL;

if (gBS == NULL) {
return;
}
Expand Down Expand Up @@ -191,7 +229,7 @@ AdvLoggerAccessInit (
if (mLoggerInfo != NULL) {
mMaxAddress = LOG_MAX_ADDRESS (mLoggerInfo);

if (AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
if (!FeaturePcdGet (PcdAdvancedLoggerFixedInRAM) && AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
DEBUG ((DEBUG_INFO, "%a: Logger buffer migrated. LoggerInfo=%p\n", __FUNCTION__, mLoggerInfo));
}
}
Expand All @@ -206,6 +244,17 @@ AdvLoggerAccessInit (
//

DEBUG ((DEBUG_INFO, "%a: LoggerInfo=%p, code=%r\n", __FUNCTION__, mLoggerInfo, Status));

if (!FeaturePcdGet (PcdAdvancedLoggerFixedInRAM)) {
Status = gSmst->SmmRegisterProtocolNotify (
&gEfiSmmReadyToLockProtocolGuid,
OnSmmReadyToLock,
&Registration
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: Failed to register ReadyToLock notify - %r\n", __func__, Status));
}
}
}

/**
Expand Down Expand Up @@ -261,7 +310,7 @@ AdvLoggerAccessGetVariable (
UINT8 *LogBufferEnd;
UINTN LogBufferSize;

if ((mLoggerInfo != NULL) && !mLoggerInfo->AtRuntime) {
if ((mLoggerInfo != NULL) && !mReadyToLock && !FeaturePcdGet (PcdAdvancedLoggerFixedInRAM)) {
if (AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
DEBUG ((DEBUG_INFO, "%a: Logger buffer migrated during access. LoggerInfo=%p\n", __FUNCTION__, mLoggerInfo));
}
Expand Down Expand Up @@ -333,12 +382,6 @@ AdvLoggerAccessAtRuntime (
VOID
)
{
if (mLoggerInfo != NULL) {
if (AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
DEBUG ((DEBUG_INFO, "%a: Logger buffer migrated at ExitBootServices. LoggerInfo=%p\n", __FUNCTION__, mLoggerInfo));
}
}

if (mLoggerInfo != NULL) {
mLoggerInfo->AtRuntime = TRUE;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,15 @@
DebugLib
PcdLib
SafeIntLib
SmmServicesTableLib
UefiBootServicesTableLib

[Guids]
gAdvLoggerAccessGuid ## CONSUMES

[Protocols]
gAdvancedLoggerProtocolGuid ## CONSUMES
gEfiSmmReadyToLockProtocolGuid ## NOTIFY

[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <AdvancedLoggerInternal.h>

#include <Protocol/AdvancedLogger.h>
#include <Protocol/SmmReadyToLock.h>
#include <AdvancedLoggerInternalProtocol.h>

#include <Pi/PiSmmCis.h>
Expand All @@ -27,6 +28,7 @@ STATIC ADVANCED_LOGGER_INFO *mLoggerInfo;
STATIC UINT32 mBufferSize = 0;
STATIC EFI_PHYSICAL_ADDRESS mMaxAddress = 0;
STATIC BOOLEAN mInitialized = FALSE;
STATIC BOOLEAN mReadyToLock = FALSE;

VOID
EFIAPI
Expand Down Expand Up @@ -116,6 +118,38 @@ ValidateInfoBlock (
return TRUE;
}

/**
SMM ReadyToLock notification handler.

Ensures any move needed to the new logger buffer is done before ReadyToLock completes.

@param[in] Protocol Protocol GUID pointer.
@param[in] Interface Protocol interface pointer.
@param[in] Handle The handle on which the interface was installed.

@retval EFI_SUCCESS The notification handler completed successfully.

**/
STATIC
EFI_STATUS
EFIAPI
OnSmmReadyToLock (
IN CONST EFI_GUID *Protocol,
IN VOID *Interface,
IN EFI_HANDLE Handle
)
{
if (mLoggerInfo != NULL) {
if (AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
mAdvLoggerProtocol.LoggerInfo = mLoggerInfo;
}
}

mReadyToLock = TRUE;

return EFI_SUCCESS;
}

/**
Get the Logger Information Block published by DxeCore.
**/
Expand Down Expand Up @@ -176,7 +210,9 @@ AdvancedLoggerGetLoggerInfo (
{
SmmInitializeLoggerInfo ();

if ((mLoggerInfo != NULL) && AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize)) {
if ((mLoggerInfo != NULL) && !mReadyToLock && !FeaturePcdGet (PcdAdvancedLoggerFixedInRAM) &&
AdvancedLoggerCheckForNewerLogger (&mLoggerInfo, &mMaxAddress, &mBufferSize))
{
DEBUG ((DEBUG_INFO, "MmCore %a: Logger Update. LoggerInfo=%p\n", __func__, mLoggerInfo));
}

Expand Down Expand Up @@ -220,6 +256,9 @@ SmmCoreAdvancedLoggerLibConstructor (
{
EFI_HANDLE Handle;
EFI_STATUS Status;
VOID *Registration;

Registration = NULL;

ASSERT ((gBS != NULL) && (gSmst != NULL));

Expand All @@ -242,5 +281,16 @@ SmmCoreAdvancedLoggerLibConstructor (
DEBUG ((DEBUG_INFO, "%a: LoggerInfo=%p, Code=%r\n", __func__, mLoggerInfo, Status));
ASSERT_EFI_ERROR (Status);

if (!FeaturePcdGet (PcdAdvancedLoggerFixedInRAM)) {
Status = gSmst->SmmRegisterProtocolNotify (
&gEfiSmmReadyToLockProtocolGuid,
OnSmmReadyToLock,
&Registration
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: Failed to register ReadyToLock notify - %r\n", __func__, Status));
}
}

return EFI_SUCCESS;
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,11 @@

[Protocols]
gAdvancedLoggerProtocolGuid ## CONSUMES
gEfiSmmReadyToLockProtocolGuid ## NOTIFY

[Pcd]
gAdvLoggerPkgTokenSpaceGuid.PcdAdvancedLoggerHdwPortDebugPrintErrorLevel ## SOMETIMES_CONSUMES

[FeaturePcd]
gAdvLoggerPkgTokenSpaceGuid.PcdAdvancedLoggerAutoWrapEnable
gAdvLoggerPkgTokenSpaceGuid.PcdAdvancedLoggerFixedInRAM