X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=CryptoPkg%2FLibrary%2FBaseCryptLib%2FSysCall%2FRuntimeMemAllocation.c;h=0d2ca604ea3e69cc59349d808801a838482707dd;hp=f615ae8f903c3efabff99831b6bf3eb17dd047ee;hb=7c342378317039e632d9a1a5d4cf7c21aec8cb7a;hpb=97f98500c1d40eba76210961e90ea5d354bcbc18 diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/RuntimeMemAllocation.c b/CryptoPkg/Library/BaseCryptLib/SysCall/RuntimeMemAllocation.c index f615ae8f90..0d2ca604ea 100644 --- a/CryptoPkg/Library/BaseCryptLib/SysCall/RuntimeMemAllocation.c +++ b/CryptoPkg/Library/BaseCryptLib/SysCall/RuntimeMemAllocation.c @@ -2,58 +2,53 @@ Light-weight Memory Management Routines for OpenSSL-based Crypto Library at Runtime Phase. -Copyright (c) 2009 - 2010, 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. +Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include +#include #include #include +#include #include -//---------------------------------------------------------------- +// ---------------------------------------------------------------- // Initial version. Needs further optimizations. -//---------------------------------------------------------------- +// ---------------------------------------------------------------- // // Definitions for Runtime Memory Operations // -#define RT_PAGE_SIZE 0x200 -#define RT_PAGE_MASK 0x1FF -#define RT_PAGE_SHIFT 9 +#define RT_PAGE_SIZE 0x200 +#define RT_PAGE_MASK 0x1FF +#define RT_PAGE_SHIFT 9 -#define RT_SIZE_TO_PAGES(a) (((a) >> RT_PAGE_SHIFT) + (((a) & RT_PAGE_MASK) ? 1 : 0)) -#define RT_PAGES_TO_SIZE(a) ((a) << RT_PAGE_SHIFT) +#define RT_SIZE_TO_PAGES(a) (((a) >> RT_PAGE_SHIFT) + (((a) & RT_PAGE_MASK) ? 1 : 0)) +#define RT_PAGES_TO_SIZE(a) ((a) << RT_PAGE_SHIFT) // // Page Flag Definitions // -#define RT_PAGE_FREE 0x00000000 -#define RT_PAGE_USED 0x00000001 +#define RT_PAGE_FREE 0x00000000 +#define RT_PAGE_USED 0x00000001 -#define MIN_REQUIRED_BLOCKS 24 +#define MIN_REQUIRED_BLOCKS 600 // // Memory Page Table // typedef struct { - UINTN StartPageOffset; // Offset of the starting page allocated. + UINTN StartPageOffset; // Offset of the starting page allocated. // Only available for USED pages. - UINT32 PageFlag; // Page Attributes. + UINT32 PageFlag; // Page Attributes. } RT_MEMORY_PAGE_ENTRY; typedef struct { - UINTN PageCount; - UINTN LastEmptyPageOffset; - UINT8 *DataAreaBase; // Pointer to data Area. - RT_MEMORY_PAGE_ENTRY Pages[1]; // Page Table Entries. + UINTN PageCount; + UINTN LastEmptyPageOffset; + UINT8 *DataAreaBase; // Pointer to data Area. + RT_MEMORY_PAGE_ENTRY Pages[1]; // Page Table Entries. } RT_MEMORY_PAGE_TABLE; // @@ -64,8 +59,7 @@ RT_MEMORY_PAGE_TABLE *mRTPageTable = NULL; // // Event for Runtime Address Conversion. // -EFI_EVENT mVirtualAddressChangeEvent; - +STATIC EFI_EVENT mVirtualAddressChangeEvent; /** Initializes pre-allocated memory pointed by ScratchBuffer for subsequent @@ -119,7 +113,6 @@ InitializeScratchMemory ( return EFI_SUCCESS; } - /** Look-up Free memory Region for object allocation. @@ -140,6 +133,12 @@ LookupFreeMemRegion ( StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->LastEmptyPageOffset); ReqPages = RT_SIZE_TO_PAGES (AllocationSize); + if (ReqPages > mRTPageTable->PageCount) { + // + // No enough region for object allocation. + // + return (UINTN)(-1); + } // // Look up the free memory region with in current memory map table. @@ -175,6 +174,13 @@ LookupFreeMemRegion ( // Look up the free memory region from the beginning of the memory table // until the StartCursorOffset // + if (ReqPages > StartPageIndex) { + // + // No enough region for object allocation. + // + return (UINTN)(-1); + } + for (Index = 0; Index < (StartPageIndex - ReqPages); ) { // // Check Consecutive ReqPages Pages. @@ -196,7 +202,8 @@ LookupFreeMemRegion ( // Failed! Skip current adjacent Used pages // while ((SubIndex < (StartPageIndex - ReqPages)) && - ((mRTPageTable->Pages[SubIndex + Index].PageFlag & RT_PAGE_USED) != 0)) { + ((mRTPageTable->Pages[SubIndex + Index].PageFlag & RT_PAGE_USED) != 0)) + { SubIndex++; } @@ -204,12 +211,11 @@ LookupFreeMemRegion ( } // - // No availabe region for object allocation! + // No available region for object allocation! // return (UINTN)(-1); } - /** Allocates a buffer at runtime phase. @@ -267,7 +273,6 @@ RuntimeAllocateMem ( return AllocPtr; } - /** Frees a buffer that was previously allocated at runtime phase. @@ -282,20 +287,21 @@ RuntimeFreeMem ( UINTN StartOffset; UINTN StartPageIndex; - StartOffset = (UINTN) ((UINT8 *)Buffer - mRTPageTable->DataAreaBase); - StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->Pages[RT_SIZE_TO_PAGES(StartOffset)].StartPageOffset); + StartOffset = (UINTN)Buffer - (UINTN)mRTPageTable->DataAreaBase; + StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->Pages[RT_SIZE_TO_PAGES (StartOffset)].StartPageOffset); while (StartPageIndex < mRTPageTable->PageCount) { if (((mRTPageTable->Pages[StartPageIndex].PageFlag & RT_PAGE_USED) != 0) && - (mRTPageTable->Pages[StartPageIndex].StartPageOffset == StartOffset)) { - // - // Free this page - // - mRTPageTable->Pages[StartPageIndex].PageFlag &= ~RT_PAGE_USED; - mRTPageTable->Pages[StartPageIndex].PageFlag |= RT_PAGE_FREE; - mRTPageTable->Pages[StartPageIndex].StartPageOffset = 0; - - StartPageIndex++; + (mRTPageTable->Pages[StartPageIndex].StartPageOffset == StartOffset)) + { + // + // Free this page + // + mRTPageTable->Pages[StartPageIndex].PageFlag &= ~RT_PAGE_USED; + mRTPageTable->Pages[StartPageIndex].PageFlag |= RT_PAGE_FREE; + mRTPageTable->Pages[StartPageIndex].StartPageOffset = 0; + + StartPageIndex++; } else { break; } @@ -304,7 +310,6 @@ RuntimeFreeMem ( return; } - /** Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. @@ -318,18 +323,17 @@ RuntimeFreeMem ( VOID EFIAPI RuntimeCryptLibAddressChangeEvent ( - IN EFI_EVENT Event, - IN VOID *Context + IN EFI_EVENT Event, + IN VOID *Context ) { // // Converts a pointer for runtime memory management to a new virtual address. // - EfiConvertPointer (0x0, (VOID **) &mRTPageTable->DataAreaBase); - EfiConvertPointer (0x0, (VOID **) &mRTPageTable); + EfiConvertPointer (0x0, (VOID **)&mRTPageTable->DataAreaBase); + EfiConvertPointer (0x0, (VOID **)&mRTPageTable); } - /** Constructor routine for runtime crypt library instance. @@ -377,36 +381,47 @@ RuntimeCryptLibConstructor ( return Status; } - // // -- Memory-Allocation Routines Wrapper for UEFI-OpenSSL Library -- // /* Allocates memory blocks */ -void *malloc (size_t size) +void * +malloc ( + size_t size + ) { return RuntimeAllocateMem ((UINTN)size); } /* Reallocate memory blocks */ -void *realloc (void *ptr, size_t size) +void * +realloc ( + void *ptr, + size_t size + ) { VOID *NewPtr; UINTN StartOffset; UINTN StartPageIndex; UINTN PageCount; + if (ptr == NULL) { + return malloc (size); + } + // // Get Original Size of ptr // - StartOffset = (UINTN) ((UINT8 *)ptr - mRTPageTable->DataAreaBase); + StartOffset = (UINTN)ptr - (UINTN)mRTPageTable->DataAreaBase; StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->Pages[RT_SIZE_TO_PAGES (StartOffset)].StartPageOffset); PageCount = 0; while (StartPageIndex < mRTPageTable->PageCount) { if (((mRTPageTable->Pages[StartPageIndex].PageFlag & RT_PAGE_USED) != 0) && - (mRTPageTable->Pages[StartPageIndex].StartPageOffset == StartOffset)) { - StartPageIndex++; - PageCount++; + (mRTPageTable->Pages[StartPageIndex].StartPageOffset == StartOffset)) + { + StartPageIndex++; + PageCount++; } else { break; } @@ -419,7 +434,7 @@ void *realloc (void *ptr, size_t size) return ptr; } - NewPtr = RuntimeAllocateMem ((UINTN) size); + NewPtr = RuntimeAllocateMem ((UINTN)size); if (NewPtr == NULL) { return NULL; } @@ -432,7 +447,16 @@ void *realloc (void *ptr, size_t size) } /* Deallocates or frees a memory block */ -void free (void *ptr) +void +free ( + void *ptr + ) { - RuntimeFreeMem (ptr); + // + // In Standard C, free() handles a null pointer argument transparently. This + // is not true of RuntimeFreeMem() below, so protect it. + // + if (ptr != NULL) { + RuntimeFreeMem (ptr); + } }