]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CryptoPkg/Library/BaseCryptLib/SysCall/RuntimeMemAllocation.c
CryptoPkg: Apply uncrustify changes
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLib / SysCall / RuntimeMemAllocation.c
index f615ae8f903c3efabff99831b6bf3eb17dd047ee..0d2ca604ea3e69cc59349d808801a838482707dd 100644 (file)
@@ -2,58 +2,53 @@
   Light-weight Memory Management Routines for OpenSSL-based Crypto\r
   Library at Runtime Phase.\r
 \r
-Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
-#include <OpenSslSupport.h>\r
+#include <CrtLibSupport.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Library/UefiRuntimeLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
 #include <Guid/EventGroup.h>\r
 \r
-//----------------------------------------------------------------\r
+// ----------------------------------------------------------------\r
 // Initial version. Needs further optimizations.\r
-//----------------------------------------------------------------\r
+// ----------------------------------------------------------------\r
 \r
 //\r
 // Definitions for Runtime Memory Operations\r
 //\r
-#define RT_PAGE_SIZE                0x200\r
-#define RT_PAGE_MASK                0x1FF\r
-#define RT_PAGE_SHIFT               9\r
+#define RT_PAGE_SIZE   0x200\r
+#define RT_PAGE_MASK   0x1FF\r
+#define RT_PAGE_SHIFT  9\r
 \r
-#define RT_SIZE_TO_PAGES(a)         (((a) >> RT_PAGE_SHIFT) + (((a) & RT_PAGE_MASK) ? 1 : 0))\r
-#define RT_PAGES_TO_SIZE(a)         ((a) << RT_PAGE_SHIFT)\r
+#define RT_SIZE_TO_PAGES(a)  (((a) >> RT_PAGE_SHIFT) + (((a) & RT_PAGE_MASK) ? 1 : 0))\r
+#define RT_PAGES_TO_SIZE(a)  ((a) << RT_PAGE_SHIFT)\r
 \r
 //\r
 // Page Flag Definitions\r
 //\r
-#define RT_PAGE_FREE                0x00000000\r
-#define RT_PAGE_USED                0x00000001\r
+#define RT_PAGE_FREE  0x00000000\r
+#define RT_PAGE_USED  0x00000001\r
 \r
-#define MIN_REQUIRED_BLOCKS         24\r
+#define MIN_REQUIRED_BLOCKS  600\r
 \r
 //\r
 // Memory Page Table\r
 //\r
 typedef struct {\r
-  UINTN   StartPageOffset;      // Offset of the starting page allocated.\r
+  UINTN     StartPageOffset;    // Offset of the starting page allocated.\r
                                 // Only available for USED pages.\r
-  UINT32  PageFlag;             // Page Attributes.\r
+  UINT32    PageFlag;           // Page Attributes.\r
 } RT_MEMORY_PAGE_ENTRY;\r
 \r
 typedef struct {\r
-  UINTN                 PageCount;\r
-  UINTN                 LastEmptyPageOffset;\r
-  UINT8                 *DataAreaBase;         // Pointer to data Area.\r
-  RT_MEMORY_PAGE_ENTRY  Pages[1];              // Page Table Entries.\r
+  UINTN                   PageCount;\r
+  UINTN                   LastEmptyPageOffset;\r
+  UINT8                   *DataAreaBase;       // Pointer to data Area.\r
+  RT_MEMORY_PAGE_ENTRY    Pages[1];            // Page Table Entries.\r
 } RT_MEMORY_PAGE_TABLE;\r
 \r
 //\r
@@ -64,8 +59,7 @@ RT_MEMORY_PAGE_TABLE  *mRTPageTable = NULL;
 //\r
 // Event for Runtime Address Conversion.\r
 //\r
-EFI_EVENT             mVirtualAddressChangeEvent;\r
-\r
+STATIC EFI_EVENT  mVirtualAddressChangeEvent;\r
 \r
 /**\r
   Initializes pre-allocated memory pointed by ScratchBuffer for subsequent\r
@@ -119,7 +113,6 @@ InitializeScratchMemory (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Look-up Free memory Region for object allocation.\r
 \r
@@ -140,6 +133,12 @@ LookupFreeMemRegion (
 \r
   StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->LastEmptyPageOffset);\r
   ReqPages       = RT_SIZE_TO_PAGES (AllocationSize);\r
+  if (ReqPages > mRTPageTable->PageCount) {\r
+    //\r
+    // No enough region for object allocation.\r
+    //\r
+    return (UINTN)(-1);\r
+  }\r
 \r
   //\r
   // Look up the free memory region with in current memory map table.\r
@@ -175,6 +174,13 @@ LookupFreeMemRegion (
   // Look up the free memory region from the beginning of the memory table\r
   // until the StartCursorOffset\r
   //\r
+  if (ReqPages > StartPageIndex) {\r
+    //\r
+    // No enough region for object allocation.\r
+    //\r
+    return (UINTN)(-1);\r
+  }\r
+\r
   for (Index = 0; Index < (StartPageIndex - ReqPages); ) {\r
     //\r
     // Check Consecutive ReqPages Pages.\r
@@ -196,7 +202,8 @@ LookupFreeMemRegion (
     // Failed! Skip current adjacent Used pages\r
     //\r
     while ((SubIndex < (StartPageIndex - ReqPages)) &&\r
-           ((mRTPageTable->Pages[SubIndex + Index].PageFlag & RT_PAGE_USED) != 0)) {\r
+           ((mRTPageTable->Pages[SubIndex + Index].PageFlag & RT_PAGE_USED) != 0))\r
+    {\r
       SubIndex++;\r
     }\r
 \r
@@ -204,12 +211,11 @@ LookupFreeMemRegion (
   }\r
 \r
   //\r
-  // No availabe region for object allocation!\r
+  // No available region for object allocation!\r
   //\r
   return (UINTN)(-1);\r
 }\r
 \r
-\r
 /**\r
   Allocates a buffer at runtime phase.\r
 \r
@@ -267,7 +273,6 @@ RuntimeAllocateMem (
   return AllocPtr;\r
 }\r
 \r
-\r
 /**\r
   Frees a buffer that was previously allocated at runtime phase.\r
 \r
@@ -282,20 +287,21 @@ RuntimeFreeMem (
   UINTN  StartOffset;\r
   UINTN  StartPageIndex;\r
 \r
-  StartOffset    = (UINTN) ((UINT8 *)Buffer - mRTPageTable->DataAreaBase);\r
-  StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->Pages[RT_SIZE_TO_PAGES(StartOffset)].StartPageOffset);\r
+  StartOffset    = (UINTN)Buffer - (UINTN)mRTPageTable->DataAreaBase;\r
+  StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->Pages[RT_SIZE_TO_PAGES (StartOffset)].StartPageOffset);\r
 \r
   while (StartPageIndex < mRTPageTable->PageCount) {\r
     if (((mRTPageTable->Pages[StartPageIndex].PageFlag & RT_PAGE_USED) != 0) &&\r
-        (mRTPageTable->Pages[StartPageIndex].StartPageOffset == StartOffset)) {\r
-        //\r
-        // Free this page\r
-        //\r
-        mRTPageTable->Pages[StartPageIndex].PageFlag       &= ~RT_PAGE_USED;\r
-        mRTPageTable->Pages[StartPageIndex].PageFlag       |= RT_PAGE_FREE;\r
-        mRTPageTable->Pages[StartPageIndex].StartPageOffset = 0;\r
-\r
-        StartPageIndex++;\r
+        (mRTPageTable->Pages[StartPageIndex].StartPageOffset == StartOffset))\r
+    {\r
+      //\r
+      // Free this page\r
+      //\r
+      mRTPageTable->Pages[StartPageIndex].PageFlag       &= ~RT_PAGE_USED;\r
+      mRTPageTable->Pages[StartPageIndex].PageFlag       |= RT_PAGE_FREE;\r
+      mRTPageTable->Pages[StartPageIndex].StartPageOffset = 0;\r
+\r
+      StartPageIndex++;\r
     } else {\r
       break;\r
     }\r
@@ -304,7 +310,6 @@ RuntimeFreeMem (
   return;\r
 }\r
 \r
-\r
 /**\r
   Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE.\r
 \r
@@ -318,18 +323,17 @@ RuntimeFreeMem (
 VOID\r
 EFIAPI\r
 RuntimeCryptLibAddressChangeEvent (\r
-  IN  EFI_EVENT        Event,\r
-  IN  VOID             *Context\r
+  IN  EFI_EVENT  Event,\r
+  IN  VOID       *Context\r
   )\r
 {\r
   //\r
   // Converts a pointer for runtime memory management to a new virtual address.\r
   //\r
-  EfiConvertPointer (0x0, (VOID **) &mRTPageTable->DataAreaBase);\r
-  EfiConvertPointer (0x0, (VOID **) &mRTPageTable);\r
+  EfiConvertPointer (0x0, (VOID **)&mRTPageTable->DataAreaBase);\r
+  EfiConvertPointer (0x0, (VOID **)&mRTPageTable);\r
 }\r
 \r
-\r
 /**\r
   Constructor routine for runtime crypt library instance.\r
 \r
@@ -377,36 +381,47 @@ RuntimeCryptLibConstructor (
   return Status;\r
 }\r
 \r
-\r
 //\r
 // -- Memory-Allocation Routines Wrapper for UEFI-OpenSSL Library --\r
 //\r
 \r
 /* Allocates memory blocks */\r
-void *malloc (size_t size)\r
+void *\r
+malloc (\r
+  size_t  size\r
+  )\r
 {\r
   return RuntimeAllocateMem ((UINTN)size);\r
 }\r
 \r
 /* Reallocate memory blocks */\r
-void *realloc (void *ptr, size_t size)\r
+void *\r
+realloc (\r
+  void    *ptr,\r
+  size_t  size\r
+  )\r
 {\r
   VOID   *NewPtr;\r
   UINTN  StartOffset;\r
   UINTN  StartPageIndex;\r
   UINTN  PageCount;\r
 \r
+  if (ptr == NULL) {\r
+    return malloc (size);\r
+  }\r
+\r
   //\r
   // Get Original Size of ptr\r
   //\r
-  StartOffset    = (UINTN) ((UINT8 *)ptr - mRTPageTable->DataAreaBase);\r
+  StartOffset    = (UINTN)ptr - (UINTN)mRTPageTable->DataAreaBase;\r
   StartPageIndex = RT_SIZE_TO_PAGES (mRTPageTable->Pages[RT_SIZE_TO_PAGES (StartOffset)].StartPageOffset);\r
   PageCount      = 0;\r
   while (StartPageIndex < mRTPageTable->PageCount) {\r
     if (((mRTPageTable->Pages[StartPageIndex].PageFlag & RT_PAGE_USED) != 0) &&\r
-        (mRTPageTable->Pages[StartPageIndex].StartPageOffset == StartOffset)) {\r
-        StartPageIndex++;\r
-        PageCount++;\r
+        (mRTPageTable->Pages[StartPageIndex].StartPageOffset == StartOffset))\r
+    {\r
+      StartPageIndex++;\r
+      PageCount++;\r
     } else {\r
       break;\r
     }\r
@@ -419,7 +434,7 @@ void *realloc (void *ptr, size_t size)
     return ptr;\r
   }\r
 \r
-  NewPtr = RuntimeAllocateMem ((UINTN) size);\r
+  NewPtr = RuntimeAllocateMem ((UINTN)size);\r
   if (NewPtr == NULL) {\r
     return NULL;\r
   }\r
@@ -432,7 +447,16 @@ void *realloc (void *ptr, size_t size)
 }\r
 \r
 /* Deallocates or frees a memory block */\r
-void free (void *ptr)\r
+void\r
+free (\r
+  void  *ptr\r
+  )\r
 {\r
-  RuntimeFreeMem (ptr);\r
+  //\r
+  // In Standard C, free() handles a null pointer argument transparently. This\r
+  // is not true of RuntimeFreeMem() below, so protect it.\r
+  //\r
+  if (ptr != NULL) {\r
+    RuntimeFreeMem (ptr);\r
+  }\r
 }\r