]> git.proxmox.com Git - mirror_edk2.git/blame - CryptoPkg/Library/BaseCryptLib/SysCall/BaseMemAllocation.c
CryptoPkg/BaseHashApiLib: Implement Unified Hash Calculation API
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLib / SysCall / BaseMemAllocation.c
CommitLineData
97f98500
HT
1/** @file\r
2 Base Memory Allocation Routines Wrapper for Crypto library over OpenSSL\r
3 during PEI & DXE phases.\r
4\r
fc9fa685 5Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>\r
2009f6b4 6SPDX-License-Identifier: BSD-2-Clause-Patent\r
97f98500
HT
7\r
8**/\r
9\r
fc9fa685
QL
10#include <CrtLibSupport.h>\r
11#include <Library/MemoryAllocationLib.h>\r
97f98500 12\r
cf8197a3
LQ
13//\r
14// Extra header to record the memory buffer size from malloc routine.\r
15//\r
16#define CRYPTMEM_HEAD_SIGNATURE SIGNATURE_32('c','m','h','d')\r
17typedef struct {\r
18 UINT32 Signature;\r
19 UINT32 Reserved;\r
20 UINTN Size;\r
21} CRYPTMEM_HEAD;\r
22\r
23#define CRYPTMEM_OVERHEAD sizeof(CRYPTMEM_HEAD)\r
24\r
97f98500
HT
25//\r
26// -- Memory-Allocation Routines --\r
27//\r
28\r
29/* Allocates memory blocks */\r
30void *malloc (size_t size)\r
31{\r
cf8197a3
LQ
32 CRYPTMEM_HEAD *PoolHdr;\r
33 UINTN NewSize;\r
34 VOID *Data;\r
35\r
36 //\r
37 // Adjust the size by the buffer header overhead\r
38 //\r
39 NewSize = (UINTN)(size) + CRYPTMEM_OVERHEAD;\r
40\r
41 Data = AllocatePool (NewSize);\r
42 if (Data != NULL) {\r
43 PoolHdr = (CRYPTMEM_HEAD *)Data;\r
44 //\r
45 // Record the memory brief information\r
46 //\r
47 PoolHdr->Signature = CRYPTMEM_HEAD_SIGNATURE;\r
48 PoolHdr->Size = size;\r
49\r
50 return (VOID *)(PoolHdr + 1);\r
51 } else {\r
52 //\r
53 // The buffer allocation failed.\r
54 //\r
55 return NULL;\r
56 }\r
97f98500
HT
57}\r
58\r
59/* Reallocate memory blocks */\r
60void *realloc (void *ptr, size_t size)\r
61{\r
cf8197a3
LQ
62 CRYPTMEM_HEAD *OldPoolHdr;\r
63 CRYPTMEM_HEAD *NewPoolHdr;\r
64 UINTN OldSize;\r
65 UINTN NewSize;\r
66 VOID *Data;\r
67\r
68 NewSize = (UINTN)size + CRYPTMEM_OVERHEAD;\r
69 Data = AllocatePool (NewSize);\r
70 if (Data != NULL) {\r
71 NewPoolHdr = (CRYPTMEM_HEAD *)Data;\r
72 NewPoolHdr->Signature = CRYPTMEM_HEAD_SIGNATURE;\r
73 NewPoolHdr->Size = size;\r
74 if (ptr != NULL) {\r
75 //\r
76 // Retrieve the original size from the buffer header.\r
77 //\r
78 OldPoolHdr = (CRYPTMEM_HEAD *)ptr - 1;\r
79 ASSERT (OldPoolHdr->Signature == CRYPTMEM_HEAD_SIGNATURE);\r
80 OldSize = OldPoolHdr->Size;\r
81\r
82 //\r
83 // Duplicate the buffer content.\r
84 //\r
85 CopyMem ((VOID *)(NewPoolHdr + 1), ptr, MIN (OldSize, size));\r
86 FreePool ((VOID *)OldPoolHdr);\r
87 }\r
88\r
89 return (VOID *)(NewPoolHdr + 1);\r
90 } else {\r
91 //\r
92 // The buffer allocation failed.\r
93 //\r
94 return NULL;\r
95 }\r
97f98500
HT
96}\r
97\r
98/* De-allocates or frees a memory block */\r
99void free (void *ptr)\r
100{\r
cf8197a3
LQ
101 CRYPTMEM_HEAD *PoolHdr;\r
102\r
211372d6
LE
103 //\r
104 // In Standard C, free() handles a null pointer argument transparently. This\r
105 // is not true of FreePool() below, so protect it.\r
106 //\r
107 if (ptr != NULL) {\r
cf8197a3
LQ
108 PoolHdr = (CRYPTMEM_HEAD *)ptr - 1;\r
109 ASSERT (PoolHdr->Signature == CRYPTMEM_HEAD_SIGNATURE);\r
110 FreePool (PoolHdr);\r
211372d6 111 }\r
97f98500 112}\r