/** @file CrHookDxe driver for memory allocation module ;****************************************************************************** ;* Copyright (c) 2012-2017, Insyde Software Corp. All Rights Reserved. ;* ;* You may not reproduce, distribute, publish, display, perform, modify, adapt, ;* transmit, broadcast, present, recite, release, license or otherwise exploit ;* any part of this publication in any form, by any means, without the prior ;* written permission of Insyde Software Corporation. ;* ;****************************************************************************** */ #include "CrBdaMemManager.h" #define MAX_ALLOC_ADDR 0x10000 #define DEFAULT_CR_MEM_SIZE_OF_PAGE 1 UINTN mCrMemStart = 0; /** Initialize Console Redirection memory manager. @retval EFI_SUCCESS Console Redirection memory manager Initialize success @retval others Console Redirection memory manager Initialize fail **/ EFI_STATUS InitCrEfiMemManager ( VOID ) { EFI_STATUS Status; EFI_PHYSICAL_ADDRESS MemoryBuf; CR_EFI_MEM_MANAGER *CrEfiMemoryMgr; CR_COMMON_AREA_INFO *CrOpromInfo; // // Allocate a page space as default CREfiMemory space below 64K // MemoryBuf = MAX_ALLOC_ADDR; Status = gBS->AllocatePages ( AllocateMaxAddress, EfiRuntimeServicesData, DEFAULT_CR_MEM_SIZE_OF_PAGE, &MemoryBuf ); if (EFI_ERROR (Status)) { return Status; } ZeroMem ((UINT8 *)(UINTN)MemoryBuf, (DEFAULT_CR_MEM_SIZE_OF_PAGE << 12)); mCrMemStart = (UINT32)MemoryBuf; CrEfiMemoryMgr = (CR_EFI_MEM_MANAGER *) mCrMemStart; // // Fill CR Efi memory space Info // CrEfiMemoryMgr->Signature = SIGNATURE('$','C','E','I'); CrEfiMemoryMgr->EndOfMemory = (UINT16)(DEFAULT_CR_MEM_SIZE_OF_PAGE << 12); CrEfiMemoryMgr->UsedOfMemory = (UINT16)sizeof(CR_EFI_MEM_MANAGER); CrOpromInfo = (CR_COMMON_AREA_INFO*)CrEfiMemAlloc (sizeof (CR_COMMON_AREA_INFO)); if (CrOpromInfo == NULL) { ASSERT (0); return EFI_OUT_OF_RESOURCES; } CrOpromInfo->Signature = SIGNATURE('$','C','O','I'); CrEfiMemoryMgr->CommonAreaOffset = (UINT16)((UINTN)CrOpromInfo - mCrMemStart); return EFI_SUCCESS; } /** Allocate a memory space from Console Redirection Memory Manager. @param Size Size of memory to allocate. @retval Return allocated address. **/ VOID* CrEfiMemAlloc ( IN UINTN Size ) { EFI_STATUS Status; EFI_PHYSICAL_ADDRESS MemoryBuf; CR_EFI_MEM_MANAGER *CrEfiMemoryMgr; UINTN RemainMemorySize; UINTN NeededSizeOfPages; UINTN OrgSizeOfPages; VOID *Memory; if (Size == 0) { return NULL; } if (mCrMemStart == 0) { Status = InitCrEfiMemManager (); if (EFI_ERROR (Status)) { return NULL; } } //[-start-180729-IB08400622-modify]// Memory = NULL; if (mCrMemStart != 0) { CrEfiMemoryMgr = (CR_EFI_MEM_MANAGER *)(mCrMemStart); RemainMemorySize = CrEfiMemoryMgr->EndOfMemory - CrEfiMemoryMgr->UsedOfMemory; if (Size > RemainMemorySize) { OrgSizeOfPages = CrEfiMemoryMgr->EndOfMemory >> 12; // // Calculate needed Memory size in Pages // NeededSizeOfPages = (Size - RemainMemorySize + 4095) >> 12; // // Rellocate CREfiMemory space below 64K // MemoryBuf = MAX_ALLOC_ADDR; Status = gBS->AllocatePages ( AllocateMaxAddress, EfiRuntimeServicesData, OrgSizeOfPages + NeededSizeOfPages, &MemoryBuf ); if (EFI_ERROR (Status)) { return NULL; } ZeroMem ((UINT8 *)(UINTN)MemoryBuf, ((OrgSizeOfPages + NeededSizeOfPages) << 12)); // // Copy old location data to new location // CopyMem ((UINT8 *)(UINTN)MemoryBuf, (UINT8 *)mCrMemStart, CrEfiMemoryMgr->UsedOfMemory); // // Rellocate memory space complete and free old memory space // FreeCrEfiMemorySpace (); // // Update new location to mCrMemStart // mCrMemStart = (UINT32)MemoryBuf; CrEfiMemoryMgr = (CR_EFI_MEM_MANAGER *)(mCrMemStart); CrEfiMemoryMgr->EndOfMemory = (UINT16)((OrgSizeOfPages + NeededSizeOfPages) << 12); } Memory = (void *)(mCrMemStart + CrEfiMemoryMgr->UsedOfMemory); CrEfiMemoryMgr->UsedOfMemory = (UINT16)(CrEfiMemoryMgr->UsedOfMemory + Size); } //[-end-180729-IB08400622-modify]// return Memory; } /** Frees the memory space that allocate for Console Redirection Memory Manager. @retval EFI_SUCCESS Free memory success @retval EFI_UNSUPPORTED Free memory fail @retval others Free memory fail **/ EFI_STATUS FreeCrEfiMemorySpace ( VOID ) { EFI_STATUS Status; CR_EFI_MEM_MANAGER *CrEfiMemoryMgr; if (mCrMemStart == 0) { return EFI_UNSUPPORTED; } CrEfiMemoryMgr = (CR_EFI_MEM_MANAGER *)(mCrMemStart); Status = gBS->FreePages ((EFI_PHYSICAL_ADDRESS)mCrMemStart, (CrEfiMemoryMgr->EndOfMemory >> 12)); mCrMemStart = 0; return Status; }