\r
**/\r
\r
-\r
#include <PiSmm.h>\r
\r
#include <Library/BaseLib.h>\r
#define EFI_MEMORY_INITIALIZED 0x0200000000000000ULL\r
#define EFI_MEMORY_TESTED 0x0400000000000000ULL\r
\r
-EFI_SMRAM_DESCRIPTOR *mSmmMemLibInternalSmramRanges;\r
-UINTN mSmmMemLibInternalSmramCount;\r
+EFI_SMRAM_DESCRIPTOR *mSmmMemLibInternalSmramRanges;\r
+UINTN mSmmMemLibInternalSmramCount;\r
\r
//\r
// Maximum support address used to check input buffer\r
//\r
EFI_PHYSICAL_ADDRESS mSmmMemLibInternalMaximumSupportAddress = 0;\r
\r
-UINTN mMemoryMapEntryCount;\r
-EFI_MEMORY_DESCRIPTOR *mMemoryMap;\r
-UINTN mDescriptorSize;\r
+UINTN mMemoryMapEntryCount;\r
+EFI_MEMORY_DESCRIPTOR *mMemoryMap;\r
+UINTN mDescriptorSize;\r
\r
-EFI_GCD_MEMORY_SPACE_DESCRIPTOR *mSmmMemLibGcdMemSpace = NULL;\r
-UINTN mSmmMemLibGcdMemNumberOfDesc = 0;\r
+EFI_GCD_MEMORY_SPACE_DESCRIPTOR *mSmmMemLibGcdMemSpace = NULL;\r
+UINTN mSmmMemLibGcdMemNumberOfDesc = 0;\r
\r
EFI_MEMORY_ATTRIBUTES_TABLE *mSmmMemLibMemoryAttributesTable = NULL;\r
\r
-VOID *mRegistrationEndOfDxe;\r
-VOID *mRegistrationReadyToLock;\r
+VOID *mRegistrationEndOfDxe;\r
+VOID *mRegistrationReadyToLock;\r
\r
-BOOLEAN mSmmMemLibSmmReadyToLock = FALSE;\r
+BOOLEAN mSmmMemLibSmmReadyToLock = FALSE;\r
\r
/**\r
Calculate and save the maximum support address.\r
VOID\r
)\r
{\r
- VOID *Hob;\r
- UINT32 RegEax;\r
- UINT8 PhysicalAddressBits;\r
+ VOID *Hob;\r
+ UINT32 RegEax;\r
+ UINT8 PhysicalAddressBits;\r
\r
//\r
// Get physical address bits supported.\r
//\r
Hob = GetFirstHob (EFI_HOB_TYPE_CPU);\r
if (Hob != NULL) {\r
- PhysicalAddressBits = ((EFI_HOB_CPU *) Hob)->SizeOfMemorySpace;\r
+ PhysicalAddressBits = ((EFI_HOB_CPU *)Hob)->SizeOfMemorySpace;\r
} else {\r
AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
if (RegEax >= 0x80000008) {\r
AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);\r
- PhysicalAddressBits = (UINT8) RegEax;\r
+ PhysicalAddressBits = (UINT8)RegEax;\r
} else {\r
PhysicalAddressBits = 36;\r
}\r
}\r
+\r
//\r
// IA-32e paging translates 48-bit linear addresses to 52-bit physical addresses.\r
//\r
//\r
if ((Length > mSmmMemLibInternalMaximumSupportAddress) ||\r
(Buffer > mSmmMemLibInternalMaximumSupportAddress) ||\r
- ((Length != 0) && (Buffer > (mSmmMemLibInternalMaximumSupportAddress - (Length - 1)))) ) {\r
+ ((Length != 0) && (Buffer > (mSmmMemLibInternalMaximumSupportAddress - (Length - 1)))))\r
+ {\r
//\r
// Overflow happen\r
//\r
return FALSE;\r
}\r
\r
- for (Index = 0; Index < mSmmMemLibInternalSmramCount; Index ++) {\r
+ for (Index = 0; Index < mSmmMemLibInternalSmramCount; Index++) {\r
if (((Buffer >= mSmmMemLibInternalSmramRanges[Index].CpuStart) && (Buffer < mSmmMemLibInternalSmramRanges[Index].CpuStart + mSmmMemLibInternalSmramRanges[Index].PhysicalSize)) ||\r
- ((mSmmMemLibInternalSmramRanges[Index].CpuStart >= Buffer) && (mSmmMemLibInternalSmramRanges[Index].CpuStart < Buffer + Length))) {\r
+ ((mSmmMemLibInternalSmramRanges[Index].CpuStart >= Buffer) && (mSmmMemLibInternalSmramRanges[Index].CpuStart < Buffer + Length)))\r
+ {\r
DEBUG ((\r
DEBUG_ERROR,\r
"SmmIsBufferOutsideSmmValid: Overlap: Buffer (0x%lx) - Length (0x%lx), ",\r
// Check override for Valid Communication Region\r
//\r
if (mSmmMemLibSmmReadyToLock) {\r
- EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
- BOOLEAN InValidCommunicationRegion;\r
+ EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
+ BOOLEAN InValidCommunicationRegion;\r
\r
InValidCommunicationRegion = FALSE;\r
- MemoryMap = mMemoryMap;\r
+ MemoryMap = mMemoryMap;\r
for (Index = 0; Index < mMemoryMapEntryCount; Index++) {\r
if ((Buffer >= MemoryMap->PhysicalStart) &&\r
- (Buffer + Length <= MemoryMap->PhysicalStart + LShiftU64 (MemoryMap->NumberOfPages, EFI_PAGE_SHIFT))) {\r
+ (Buffer + Length <= MemoryMap->PhysicalStart + LShiftU64 (MemoryMap->NumberOfPages, EFI_PAGE_SHIFT)))\r
+ {\r
InValidCommunicationRegion = TRUE;\r
}\r
- MemoryMap = NEXT_MEMORY_DESCRIPTOR(MemoryMap, mDescriptorSize);\r
+\r
+ MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, mDescriptorSize);\r
}\r
\r
if (!InValidCommunicationRegion) {\r
//\r
for (Index = 0; Index < mSmmMemLibGcdMemNumberOfDesc; Index++) {\r
if (((Buffer >= mSmmMemLibGcdMemSpace[Index].BaseAddress) && (Buffer < mSmmMemLibGcdMemSpace[Index].BaseAddress + mSmmMemLibGcdMemSpace[Index].Length)) ||\r
- ((mSmmMemLibGcdMemSpace[Index].BaseAddress >= Buffer) && (mSmmMemLibGcdMemSpace[Index].BaseAddress < Buffer + Length))) {\r
+ ((mSmmMemLibGcdMemSpace[Index].BaseAddress >= Buffer) && (mSmmMemLibGcdMemSpace[Index].BaseAddress < Buffer + Length)))\r
+ {\r
DEBUG ((\r
DEBUG_ERROR,\r
"SmmIsBufferOutsideSmmValid: In Untested Memory Region: Buffer (0x%lx) - Length (0x%lx)\n",\r
// Check UEFI runtime memory with EFI_MEMORY_RO as invalid communication buffer.\r
//\r
if (mSmmMemLibMemoryAttributesTable != NULL) {\r
- EFI_MEMORY_DESCRIPTOR *Entry;\r
+ EFI_MEMORY_DESCRIPTOR *Entry;\r
\r
Entry = (EFI_MEMORY_DESCRIPTOR *)(mSmmMemLibMemoryAttributesTable + 1);\r
for (Index = 0; Index < mSmmMemLibMemoryAttributesTable->NumberOfEntries; Index++) {\r
- if (Entry->Type == EfiRuntimeServicesCode || Entry->Type == EfiRuntimeServicesData) {\r
+ if ((Entry->Type == EfiRuntimeServicesCode) || (Entry->Type == EfiRuntimeServicesData)) {\r
if ((Entry->Attribute & EFI_MEMORY_RO) != 0) {\r
if (((Buffer >= Entry->PhysicalStart) && (Buffer < Entry->PhysicalStart + LShiftU64 (Entry->NumberOfPages, EFI_PAGE_SHIFT))) ||\r
- ((Entry->PhysicalStart >= Buffer) && (Entry->PhysicalStart < Buffer + Length))) {\r
+ ((Entry->PhysicalStart >= Buffer) && (Entry->PhysicalStart < Buffer + Length)))\r
+ {\r
DEBUG ((\r
DEBUG_ERROR,\r
"SmmIsBufferOutsideSmmValid: In RuntimeCode Region: Buffer (0x%lx) - Length (0x%lx)\n",\r
}\r
}\r
}\r
+\r
Entry = NEXT_MEMORY_DESCRIPTOR (Entry, mSmmMemLibMemoryAttributesTable->DescriptorSize);\r
}\r
}\r
}\r
+\r
return TRUE;\r
}\r
\r
DEBUG ((DEBUG_ERROR, "SmmCopyMemToSmram: Security Violation: Source (0x%x), Length (0x%x)\n", SourceBuffer, Length));\r
return EFI_SECURITY_VIOLATION;\r
}\r
+\r
CopyMem (DestinationBuffer, SourceBuffer, Length);\r
return EFI_SUCCESS;\r
}\r
DEBUG ((DEBUG_ERROR, "SmmCopyMemFromSmram: Security Violation: Destination (0x%x), Length (0x%x)\n", DestinationBuffer, Length));\r
return EFI_SECURITY_VIOLATION;\r
}\r
+\r
CopyMem (DestinationBuffer, SourceBuffer, Length);\r
return EFI_SUCCESS;\r
}\r
DEBUG ((DEBUG_ERROR, "SmmCopyMem: Security Violation: Destination (0x%x), Length (0x%x)\n", DestinationBuffer, Length));\r
return EFI_SECURITY_VIOLATION;\r
}\r
+\r
if (!SmmIsBufferOutsideSmmValid ((EFI_PHYSICAL_ADDRESS)(UINTN)SourceBuffer, Length)) {\r
DEBUG ((DEBUG_ERROR, "SmmCopyMem: Security Violation: Source (0x%x), Length (0x%x)\n", SourceBuffer, Length));\r
return EFI_SECURITY_VIOLATION;\r
}\r
+\r
CopyMem (DestinationBuffer, SourceBuffer, Length);\r
return EFI_SUCCESS;\r
}\r
DEBUG ((DEBUG_ERROR, "SmmSetMem: Security Violation: Source (0x%x), Length (0x%x)\n", Buffer, Length));\r
return EFI_SECURITY_VIOLATION;\r
}\r
+\r
SetMem (Buffer, Length, Value);\r
return EFI_SUCCESS;\r
}\r
\r
Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemSpaceMap);\r
if (EFI_ERROR (Status)) {\r
- return ;\r
+ return;\r
}\r
\r
mSmmMemLibGcdMemNumberOfDesc = 0;\r
for (Index = 0; Index < NumberOfDescriptors; Index++) {\r
- if (MemSpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeReserved &&\r
- (MemSpaceMap[Index].Capabilities & (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED)) ==\r
- (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED)\r
- ) {\r
+ if ((MemSpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeReserved) &&\r
+ ((MemSpaceMap[Index].Capabilities & (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED)) ==\r
+ (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED))\r
+ )\r
+ {\r
mSmmMemLibGcdMemNumberOfDesc++;\r
}\r
}\r
if (mSmmMemLibGcdMemSpace == NULL) {\r
mSmmMemLibGcdMemNumberOfDesc = 0;\r
gBS->FreePool (MemSpaceMap);\r
- return ;\r
+ return;\r
}\r
\r
mSmmMemLibGcdMemNumberOfDesc = 0;\r
for (Index = 0; Index < NumberOfDescriptors; Index++) {\r
- if (MemSpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeReserved &&\r
- (MemSpaceMap[Index].Capabilities & (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED)) ==\r
- (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED)\r
- ) {\r
+ if ((MemSpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeReserved) &&\r
+ ((MemSpaceMap[Index].Capabilities & (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED)) ==\r
+ (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED))\r
+ )\r
+ {\r
CopyMem (\r
&mSmmMemLibGcdMemSpace[mSmmMemLibGcdMemNumberOfDesc],\r
&MemSpaceMap[Index],\r
- sizeof(EFI_GCD_MEMORY_SPACE_DESCRIPTOR)\r
+ sizeof (EFI_GCD_MEMORY_SPACE_DESCRIPTOR)\r
);\r
mSmmMemLibGcdMemNumberOfDesc++;\r
}\r
\r
Status = EfiGetSystemConfigurationTable (&gEfiMemoryAttributesTableGuid, (VOID **)&MemoryAttributesTable);\r
if (!EFI_ERROR (Status) && (MemoryAttributesTable != NULL)) {\r
- MemoryAttributesTableSize = sizeof(EFI_MEMORY_ATTRIBUTES_TABLE) + MemoryAttributesTable->DescriptorSize * MemoryAttributesTable->NumberOfEntries;\r
+ MemoryAttributesTableSize = sizeof (EFI_MEMORY_ATTRIBUTES_TABLE) + MemoryAttributesTable->DescriptorSize * MemoryAttributesTable->NumberOfEntries;\r
mSmmMemLibMemoryAttributesTable = AllocateCopyPool (MemoryAttributesTableSize, MemoryAttributesTable);\r
ASSERT (mSmmMemLibMemoryAttributesTable != NULL);\r
}\r
IN EFI_HANDLE Handle\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN MapKey;\r
- UINTN MemoryMapSize;\r
- EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
- EFI_MEMORY_DESCRIPTOR *MemoryMapStart;\r
- EFI_MEMORY_DESCRIPTOR *SmmMemoryMapStart;\r
- UINTN MemoryMapEntryCount;\r
- UINTN DescriptorSize;\r
- UINT32 DescriptorVersion;\r
- UINTN Index;\r
+ EFI_STATUS Status;\r
+ UINTN MapKey;\r
+ UINTN MemoryMapSize;\r
+ EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
+ EFI_MEMORY_DESCRIPTOR *MemoryMapStart;\r
+ EFI_MEMORY_DESCRIPTOR *SmmMemoryMapStart;\r
+ UINTN MemoryMapEntryCount;\r
+ UINTN DescriptorSize;\r
+ UINT32 DescriptorVersion;\r
+ UINTN Index;\r
\r
MemoryMapSize = 0;\r
- MemoryMap = NULL;\r
- Status = gBS->GetMemoryMap (\r
- &MemoryMapSize,\r
- MemoryMap,\r
- &MapKey,\r
- &DescriptorSize,\r
- &DescriptorVersion\r
- );\r
+ MemoryMap = NULL;\r
+ Status = gBS->GetMemoryMap (\r
+ &MemoryMapSize,\r
+ MemoryMap,\r
+ &MapKey,\r
+ &DescriptorSize,\r
+ &DescriptorVersion\r
+ );\r
ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
\r
do {\r
ASSERT (MemoryMap != NULL);\r
\r
Status = gBS->GetMemoryMap (\r
- &MemoryMapSize,\r
- MemoryMap,\r
- &MapKey,\r
- &DescriptorSize,\r
- &DescriptorVersion\r
- );\r
+ &MemoryMapSize,\r
+ MemoryMap,\r
+ &MapKey,\r
+ &DescriptorSize,\r
+ &DescriptorVersion\r
+ );\r
if (EFI_ERROR (Status)) {\r
gBS->FreePool (MemoryMap);\r
}\r
//\r
// Get Count\r
//\r
- mDescriptorSize = DescriptorSize;\r
- MemoryMapEntryCount = MemoryMapSize/DescriptorSize;\r
- MemoryMapStart = MemoryMap;\r
+ mDescriptorSize = DescriptorSize;\r
+ MemoryMapEntryCount = MemoryMapSize/DescriptorSize;\r
+ MemoryMapStart = MemoryMap;\r
mMemoryMapEntryCount = 0;\r
for (Index = 0; Index < MemoryMapEntryCount; Index++) {\r
switch (MemoryMap->Type) {\r
- case EfiReservedMemoryType:\r
- case EfiRuntimeServicesCode:\r
- case EfiRuntimeServicesData:\r
- case EfiACPIMemoryNVS:\r
- mMemoryMapEntryCount++;\r
- break;\r
+ case EfiReservedMemoryType:\r
+ case EfiRuntimeServicesCode:\r
+ case EfiRuntimeServicesData:\r
+ case EfiACPIMemoryNVS:\r
+ mMemoryMapEntryCount++;\r
+ break;\r
}\r
- MemoryMap = NEXT_MEMORY_DESCRIPTOR(MemoryMap, DescriptorSize);\r
+\r
+ MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, DescriptorSize);\r
}\r
+\r
MemoryMap = MemoryMapStart;\r
\r
//\r
SmmMemoryMapStart = mMemoryMap;\r
for (Index = 0; Index < MemoryMapEntryCount; Index++) {\r
switch (MemoryMap->Type) {\r
- case EfiReservedMemoryType:\r
- case EfiRuntimeServicesCode:\r
- case EfiRuntimeServicesData:\r
- case EfiACPIMemoryNVS:\r
- CopyMem (mMemoryMap, MemoryMap, DescriptorSize);\r
- mMemoryMap = NEXT_MEMORY_DESCRIPTOR(mMemoryMap, DescriptorSize);\r
- break;\r
+ case EfiReservedMemoryType:\r
+ case EfiRuntimeServicesCode:\r
+ case EfiRuntimeServicesData:\r
+ case EfiACPIMemoryNVS:\r
+ CopyMem (mMemoryMap, MemoryMap, DescriptorSize);\r
+ mMemoryMap = NEXT_MEMORY_DESCRIPTOR (mMemoryMap, DescriptorSize);\r
+ break;\r
}\r
- MemoryMap = NEXT_MEMORY_DESCRIPTOR(MemoryMap, DescriptorSize);\r
+\r
+ MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, DescriptorSize);\r
}\r
+\r
mMemoryMap = SmmMemoryMapStart;\r
- MemoryMap = MemoryMapStart;\r
+ MemoryMap = MemoryMapStart;\r
\r
gBS->FreePool (MemoryMap);\r
\r
mSmmMemLibSmmReadyToLock = TRUE;\r
return EFI_SUCCESS;\r
}\r
+\r
/**\r
The constructor function initializes the Smm Mem library\r
\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SMM_ACCESS2_PROTOCOL *SmmAccess;\r
- UINTN Size;\r
+ EFI_STATUS Status;\r
+ EFI_SMM_ACCESS2_PROTOCOL *SmmAccess;\r
+ UINTN Size;\r
\r
//\r
// Get SMRAM information\r
Status = gBS->LocateProtocol (&gEfiSmmAccess2ProtocolGuid, NULL, (VOID **)&SmmAccess);\r
ASSERT_EFI_ERROR (Status);\r
\r
- Size = 0;\r
+ Size = 0;\r
Status = SmmAccess->GetCapabilities (SmmAccess, &Size, NULL);\r
ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
\r