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);
+ }
}