mirror of https://github.com/acidanthera/audk.git
Add SMRAM range check to fault tolerant write SMM SMI handler.
Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13518 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
d4d58cbe9f
commit
c219324cc5
|
@ -40,7 +40,10 @@
|
||||||
If one of them is not satisfied, FtwWrite may fail.
|
If one of them is not satisfied, FtwWrite may fail.
|
||||||
Usually, Spare area only takes one block. That's SpareAreaLength = BlockSize, NumberOfSpareBlock = 1.
|
Usually, Spare area only takes one block. That's SpareAreaLength = BlockSize, NumberOfSpareBlock = 1.
|
||||||
|
|
||||||
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
|
Caution: This module requires additional review when modified.
|
||||||
|
This driver need to make sure the CommBuffer is not in the SMRAM range.
|
||||||
|
|
||||||
|
Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -56,9 +59,41 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
#include <Protocol/SmmSwapAddressRange.h>
|
#include <Protocol/SmmSwapAddressRange.h>
|
||||||
#include "FaultTolerantWrite.h"
|
#include "FaultTolerantWrite.h"
|
||||||
#include "FaultTolerantWriteSmmCommon.h"
|
#include "FaultTolerantWriteSmmCommon.h"
|
||||||
|
#include <Protocol/SmmAccess2.h>
|
||||||
|
|
||||||
EFI_EVENT mFvbRegistration = NULL;
|
EFI_EVENT mFvbRegistration = NULL;
|
||||||
EFI_FTW_DEVICE *mFtwDevice = NULL;
|
EFI_FTW_DEVICE *mFtwDevice = NULL;
|
||||||
|
EFI_SMRAM_DESCRIPTOR *mSmramRanges;
|
||||||
|
UINTN mSmramRangeCount;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function check if the address is in SMRAM.
|
||||||
|
|
||||||
|
@param Buffer the buffer address to be checked.
|
||||||
|
@param Length the buffer length to be checked.
|
||||||
|
|
||||||
|
@retval TRUE this address is in SMRAM.
|
||||||
|
@retval FALSE this address is NOT in SMRAM.
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
InternalIsAddressInSmram (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Buffer,
|
||||||
|
IN UINT64 Length
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN Index;
|
||||||
|
|
||||||
|
for (Index = 0; Index < mSmramRangeCount; Index ++) {
|
||||||
|
if (((Buffer >= mSmramRanges[Index].CpuStart) && (Buffer < mSmramRanges[Index].CpuStart + mSmramRanges[Index].PhysicalSize)) ||
|
||||||
|
((mSmramRanges[Index].CpuStart >= Buffer) && (mSmramRanges[Index].CpuStart < Buffer + Length))) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrive the SMM FVB protocol interface by HANDLE.
|
Retrive the SMM FVB protocol interface by HANDLE.
|
||||||
|
@ -261,6 +296,11 @@ GetFvbByAddressAndAttribute (
|
||||||
|
|
||||||
This SMI handler provides services for the fault tolerant write wrapper driver.
|
This SMI handler provides services for the fault tolerant write wrapper driver.
|
||||||
|
|
||||||
|
Caution: This function requires additional review when modified.
|
||||||
|
This driver need to make sure the CommBuffer is not in the SMRAM range.
|
||||||
|
Also in FTW_FUNCTION_GET_LAST_WRITE case, check SmmFtwGetLastWriteHeader->Data +
|
||||||
|
SmmFtwGetLastWriteHeader->PrivateDataSize within communication buffer.
|
||||||
|
|
||||||
@param[in] DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister().
|
@param[in] DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister().
|
||||||
@param[in] RegisterContext Points to an optional handler context which was specified when the
|
@param[in] RegisterContext Points to an optional handler context which was specified when the
|
||||||
handler was registered.
|
handler was registered.
|
||||||
|
@ -299,6 +339,11 @@ SmmFaultTolerantWriteHandler (
|
||||||
ASSERT (CommBuffer != NULL);
|
ASSERT (CommBuffer != NULL);
|
||||||
ASSERT (CommBufferSize != NULL);
|
ASSERT (CommBufferSize != NULL);
|
||||||
|
|
||||||
|
if (InternalIsAddressInSmram ((EFI_PHYSICAL_ADDRESS)(UINTN)CommBuffer, *CommBufferSize)) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "SMM communication buffer size is in SMRAM!\n"));
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
SmmFtwFunctionHeader = (SMM_FTW_COMMUNICATE_FUNCTION_HEADER *)CommBuffer;
|
SmmFtwFunctionHeader = (SMM_FTW_COMMUNICATE_FUNCTION_HEADER *)CommBuffer;
|
||||||
switch (SmmFtwFunctionHeader->Function) {
|
switch (SmmFtwFunctionHeader->Function) {
|
||||||
case FTW_FUNCTION_GET_MAX_BLOCK_SIZE:
|
case FTW_FUNCTION_GET_MAX_BLOCK_SIZE:
|
||||||
|
@ -362,20 +407,24 @@ SmmFaultTolerantWriteHandler (
|
||||||
|
|
||||||
case FTW_FUNCTION_GET_LAST_WRITE:
|
case FTW_FUNCTION_GET_LAST_WRITE:
|
||||||
SmmFtwGetLastWriteHeader = (SMM_FTW_GET_LAST_WRITE_HEADER *) SmmFtwFunctionHeader->Data;
|
SmmFtwGetLastWriteHeader = (SMM_FTW_GET_LAST_WRITE_HEADER *) SmmFtwFunctionHeader->Data;
|
||||||
Status = FtwGetLastWrite (
|
if (((UINT8*)SmmFtwGetLastWriteHeader->Data > (UINT8*)CommBuffer) &&
|
||||||
&mFtwDevice->FtwInstance,
|
((UINT8*)SmmFtwGetLastWriteHeader->Data + SmmFtwGetLastWriteHeader->PrivateDataSize <= (UINT8*)CommBuffer + (*CommBufferSize))) {
|
||||||
&SmmFtwGetLastWriteHeader->CallerId,
|
Status = FtwGetLastWrite (
|
||||||
&SmmFtwGetLastWriteHeader->Lba,
|
&mFtwDevice->FtwInstance,
|
||||||
&SmmFtwGetLastWriteHeader->Offset,
|
&SmmFtwGetLastWriteHeader->CallerId,
|
||||||
&SmmFtwGetLastWriteHeader->Length,
|
&SmmFtwGetLastWriteHeader->Lba,
|
||||||
&SmmFtwGetLastWriteHeader->PrivateDataSize,
|
&SmmFtwGetLastWriteHeader->Offset,
|
||||||
(VOID *)SmmFtwGetLastWriteHeader->Data,
|
&SmmFtwGetLastWriteHeader->Length,
|
||||||
&SmmFtwGetLastWriteHeader->Complete
|
&SmmFtwGetLastWriteHeader->PrivateDataSize,
|
||||||
);
|
(VOID *)SmmFtwGetLastWriteHeader->Data,
|
||||||
|
&SmmFtwGetLastWriteHeader->Complete
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ASSERT (FALSE);
|
|
||||||
Status = EFI_UNSUPPORTED;
|
Status = EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -475,6 +524,8 @@ SmmFaultTolerantWriteInitialize (
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE FtwHandle;
|
EFI_HANDLE FtwHandle;
|
||||||
|
EFI_SMM_ACCESS2_PROTOCOL *SmmAccess;
|
||||||
|
UINTN Size;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Allocate private data structure for SMM FTW protocol and do some initialization
|
// Allocate private data structure for SMM FTW protocol and do some initialization
|
||||||
|
@ -483,7 +534,29 @@ SmmFaultTolerantWriteInitialize (
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get SMRAM information
|
||||||
|
//
|
||||||
|
Status = gBS->LocateProtocol (&gEfiSmmAccess2ProtocolGuid, NULL, (VOID **)&SmmAccess);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
Size = 0;
|
||||||
|
Status = SmmAccess->GetCapabilities (SmmAccess, &Size, NULL);
|
||||||
|
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
|
||||||
|
|
||||||
|
Status = gSmst->SmmAllocatePool (
|
||||||
|
EfiRuntimeServicesData,
|
||||||
|
Size,
|
||||||
|
(VOID **)&mSmramRanges
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
Status = SmmAccess->GetCapabilities (SmmAccess, &Size, mSmramRanges);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
mSmramRangeCount = Size / sizeof (EFI_SMRAM_DESCRIPTOR);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Register FvbNotificationEvent () notify function.
|
// Register FvbNotificationEvent () notify function.
|
||||||
//
|
//
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
# depends on the full functionality SMM FVB protocol that support read, write/erase
|
# depends on the full functionality SMM FVB protocol that support read, write/erase
|
||||||
# flash access.
|
# flash access.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
#
|
#
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
@ -57,6 +57,7 @@
|
||||||
gEfiSmmSwapAddressRangeProtocolGuid | gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable ## CONSUMES
|
gEfiSmmSwapAddressRangeProtocolGuid | gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable ## CONSUMES
|
||||||
gEfiSmmFirmwareVolumeBlockProtocolGuid ## CONSUMES
|
gEfiSmmFirmwareVolumeBlockProtocolGuid ## CONSUMES
|
||||||
gEfiSmmFaultTolerantWriteProtocolGuid ## PRODUCES
|
gEfiSmmFaultTolerantWriteProtocolGuid ## PRODUCES
|
||||||
|
gEfiSmmAccess2ProtocolGuid ## CONSUMES
|
||||||
|
|
||||||
[FeaturePcd]
|
[FeaturePcd]
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable
|
||||||
|
|
Loading…
Reference in New Issue