X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkCompatibilityPkg%2FCompatibility%2FAcpiVariableHobOnSmramReserveHobThunk%2FAcpiVariableHobOnSmramReserveHobThunk.c;fp=EdkCompatibilityPkg%2FCompatibility%2FAcpiVariableHobOnSmramReserveHobThunk%2FAcpiVariableHobOnSmramReserveHobThunk.c;h=0000000000000000000000000000000000000000;hp=2d342d841e5603988f28b43503f3ea3c56ef9d55;hb=c455bc8c8d78ad51c24426a500914ea32504bf06;hpb=5bca07268acabe7f31407358e875ccf89cb5e386 diff --git a/EdkCompatibilityPkg/Compatibility/AcpiVariableHobOnSmramReserveHobThunk/AcpiVariableHobOnSmramReserveHobThunk.c b/EdkCompatibilityPkg/Compatibility/AcpiVariableHobOnSmramReserveHobThunk/AcpiVariableHobOnSmramReserveHobThunk.c deleted file mode 100644 index 2d342d841e..0000000000 --- a/EdkCompatibilityPkg/Compatibility/AcpiVariableHobOnSmramReserveHobThunk/AcpiVariableHobOnSmramReserveHobThunk.c +++ /dev/null @@ -1,249 +0,0 @@ -/** @file - This is the driver that produce AcpiVariable hob and slit SmramReserve hob - for ECP platform. - -Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
- -This program and the accompanying materials -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 -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include -#include -#include - -#include -#include -#include -#include -#include - -/** - Retrieves the data structure associated witht he GUIDed HOB of type gEfiSmmPeiSmramMemoryReserveGuid - - @retval NULL A HOB of type gEfiSmmPeiSmramMemoryReserveGuid could not be found. - @retval !NULL A pointer to the GUID data from a HIB of type gEfiSmmPeiSmramMemoryReserveGuid - -**/ -EFI_SMRAM_HOB_DESCRIPTOR_BLOCK * -GetSrmamHobData ( - VOID - ) -{ - VOID *GuidHob; - - // - // Search SmramMemoryReserve HOB that describes SMRAM region - // - GuidHob = GetFirstGuidHob (&gEfiSmmPeiSmramMemoryReserveGuid); - if (GuidHob == NULL) { - return NULL; - } - return (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)GET_GUID_HOB_DATA (GuidHob); -} - -/** - This routine will split SmramReserve hob to reserve 1 page for SMRAM content in S3 phase - for PI SMM core. - - @retval EFI_SUCCESS The gEfiSmmPeiSmramMemoryReserveGuid is splited successfully. - @retval EFI_NOT_FOUND The gEfiSmmPeiSmramMemoryReserveGuid is not found. - -**/ -EFI_STATUS -EFIAPI -SplitSmramReserveHob ( - VOID - ) -{ - EFI_HOB_GUID_TYPE *GuidHob; - EFI_PEI_HOB_POINTERS Hob; - EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *DescriptorBlock; - EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *NewDescriptorBlock; - UINTN BufferSize; - UINTN SmramRanges; - UINTN Index; - UINTN SubIndex; - - // - // Retrieve the GUID HOB data that contains the set of SMRAM descriptyors - // - GuidHob = GetFirstGuidHob (&gEfiSmmPeiSmramMemoryReserveGuid); - if (GuidHob == NULL) { - return EFI_NOT_FOUND; - } - - DescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)GET_GUID_HOB_DATA (GuidHob); - - // - // Allocate one extra EFI_SMRAM_DESCRIPTOR to describe a page of SMRAM memory that contains a pointer - // to the SMM Services Table that is required on the S3 resume path - // - SmramRanges = DescriptorBlock->NumberOfSmmReservedRegions; - BufferSize = sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK) + (SmramRanges * sizeof (EFI_SMRAM_DESCRIPTOR)); - - Hob.Raw = BuildGuidHob ( - &gEfiSmmPeiSmramMemoryReserveGuid, - BufferSize - ); - ASSERT (Hob.Raw); - NewDescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)Hob.Raw; - - // - // Copy old EFI_SMRAM_HOB_DESCRIPTOR_BLOCK to new allocated region - // - CopyMem ((VOID *)Hob.Raw, DescriptorBlock, BufferSize - sizeof(EFI_SMRAM_DESCRIPTOR)); - - // - // Increase the number of SMRAM descriptors by 1 to make room for the ALLOCATED descriptor of size EFI_PAGE_SIZE - // - NewDescriptorBlock->NumberOfSmmReservedRegions = (UINT32)(SmramRanges + 1); - - ASSERT (SmramRanges >= 1); - // - // Copy last entry to the end - we assume TSEG is last entry, which is same assumption as Framework CPU/SMM driver - // - CopyMem (&NewDescriptorBlock->Descriptor[SmramRanges], &NewDescriptorBlock->Descriptor[SmramRanges - 1], sizeof(EFI_SMRAM_DESCRIPTOR)); - - // - // Update the last but 1 entry in the array with a size of EFI_PAGE_SIZE and put into the ALLOCATED state - // - NewDescriptorBlock->Descriptor[SmramRanges - 1].PhysicalSize = EFI_PAGE_SIZE; - NewDescriptorBlock->Descriptor[SmramRanges - 1].RegionState |= EFI_ALLOCATED; - - // - // Reduce the size of the last SMRAM descriptor by EFI_PAGE_SIZE - // - NewDescriptorBlock->Descriptor[SmramRanges].PhysicalStart += EFI_PAGE_SIZE; - NewDescriptorBlock->Descriptor[SmramRanges].CpuStart += EFI_PAGE_SIZE; - NewDescriptorBlock->Descriptor[SmramRanges].PhysicalSize -= EFI_PAGE_SIZE; - - // - // Now, we have created SmramReserve Hob for SmmAccess drive. But the issue is that, Framework SmmAccess will assume there is 2 SmramReserve region only. - // Reporting 3 SmramReserve region will cause buffer overflow. Moreover, we would like to filter AB-SEG or H-SEG to avoid SMM cache-poisoning issue. - // So we uses scan SmmReserve Hob to remove AB-SEG or H-SEG. - // - for (Index = 0; Index <= SmramRanges; Index++) { - if (NewDescriptorBlock->Descriptor[Index].PhysicalSize == 0) { - // - // Skip zero entry - // - continue; - } - if (NewDescriptorBlock->Descriptor[Index].PhysicalStart < BASE_1MB) { - // - // Find AB-SEG or H-SEG - // remove this region - // - for (SubIndex = Index; SubIndex < NewDescriptorBlock->NumberOfSmmReservedRegions - 1; SubIndex++) { - CopyMem (&NewDescriptorBlock->Descriptor[SubIndex], &NewDescriptorBlock->Descriptor[SubIndex + 1], sizeof (EFI_SMRAM_DESCRIPTOR)); - } - // - // Zero last one - // - ZeroMem (&NewDescriptorBlock->Descriptor[SubIndex], sizeof(EFI_SMRAM_DESCRIPTOR)); - // - // Decrease Number - // - NewDescriptorBlock->NumberOfSmmReservedRegions --; - // - // Decrease Index to let it test mew entry - // - Index --; - } - } - - // - // Last step, we can scrub old one - // - ZeroMem (&GuidHob->Name, sizeof(GuidHob->Name)); - - return EFI_SUCCESS; -} - -/** - This routine will create AcpiVariable hob to point the reserved smram in S3 phase - for PI SMM core. - - @retval EFI_SUCCESS The gEfiAcpiVariableGuid is created successfully. - @retval EFI_NOT_FOUND The gEfiSmmPeiSmramMemoryReserveGuid is not found. - -**/ -EFI_STATUS -EFIAPI -CreateAcpiVariableHob ( - VOID - ) -{ - EFI_PEI_HOB_POINTERS Hob; - EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *DescriptorBlock; - UINTN SmramRanges; - - // - // Retrieve the GUID HOB data that contains the set of SMRAM descriptyors - // - DescriptorBlock = GetSrmamHobData (); - if (DescriptorBlock == NULL) { - return EFI_NOT_FOUND; - } - - Hob.Raw = BuildGuidHob ( - &gEfiAcpiVariableGuid, - sizeof (EFI_SMRAM_DESCRIPTOR) - ); - ASSERT (Hob.Raw); - - // - // It should be already patch, so just copy last but 1 region directly. - // - SmramRanges = DescriptorBlock->NumberOfSmmReservedRegions; - ASSERT (SmramRanges >= 2); - if (SmramRanges >= 2) { - CopyMem ((VOID *)Hob.Raw, &DescriptorBlock->Descriptor[SmramRanges - 2], sizeof (EFI_SMRAM_DESCRIPTOR)); - } - - return EFI_SUCCESS; -} - -/** - Driver Entry for AcpiVariableHobOnSmramReservHob PEIM - - @param FileHandle Handle of the file being invoked. - @param PeiServices Describes the list of possible PEI Services. - - @retval EFI_SUCCESS Success create gEfiAcpiVariableGuid and - split gEfiSmmPeiSmramMemoryReserveGuid. - @retval EFI_NOT_FOUND Can not get gEfiSmmPeiSmramMemoryReserveGuid hob - -**/ -EFI_STATUS -EFIAPI -AcpiVariableHobEntry ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - ) -{ - EFI_STATUS Status; - - // - // Split SmramReserve hob, which is required for PI SMM Core for S3. - // - Status = SplitSmramReserveHob (); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Create AcpiVariable hob, which is required for PI SMM Core for S3. - // - Status = CreateAcpiVariableHob (); - - return Status; -}