]>
git.proxmox.com Git - mirror_edk2.git/blob - CryptoPkg/Library/BaseCryptLib/SysCall/BaseMemAllocation.c
2 Base Memory Allocation Routines Wrapper for Crypto library over OpenSSL
3 during PEI & DXE phases.
5 Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include <CrtLibSupport.h>
17 #include <Library/MemoryAllocationLib.h>
20 // Extra header to record the memory buffer size from malloc routine.
22 #define CRYPTMEM_HEAD_SIGNATURE SIGNATURE_32('c','m','h','d')
29 #define CRYPTMEM_OVERHEAD sizeof(CRYPTMEM_HEAD)
32 // -- Memory-Allocation Routines --
35 /* Allocates memory blocks */
36 void *malloc (size_t size
)
38 CRYPTMEM_HEAD
*PoolHdr
;
43 // Adjust the size by the buffer header overhead
45 NewSize
= (UINTN
)(size
) + CRYPTMEM_OVERHEAD
;
47 Data
= AllocatePool (NewSize
);
49 PoolHdr
= (CRYPTMEM_HEAD
*)Data
;
51 // Record the memory brief information
53 PoolHdr
->Signature
= CRYPTMEM_HEAD_SIGNATURE
;
56 return (VOID
*)(PoolHdr
+ 1);
59 // The buffer allocation failed.
65 /* Reallocate memory blocks */
66 void *realloc (void *ptr
, size_t size
)
68 CRYPTMEM_HEAD
*OldPoolHdr
;
69 CRYPTMEM_HEAD
*NewPoolHdr
;
74 NewSize
= (UINTN
)size
+ CRYPTMEM_OVERHEAD
;
75 Data
= AllocatePool (NewSize
);
77 NewPoolHdr
= (CRYPTMEM_HEAD
*)Data
;
78 NewPoolHdr
->Signature
= CRYPTMEM_HEAD_SIGNATURE
;
79 NewPoolHdr
->Size
= size
;
82 // Retrieve the original size from the buffer header.
84 OldPoolHdr
= (CRYPTMEM_HEAD
*)ptr
- 1;
85 ASSERT (OldPoolHdr
->Signature
== CRYPTMEM_HEAD_SIGNATURE
);
86 OldSize
= OldPoolHdr
->Size
;
89 // Duplicate the buffer content.
91 CopyMem ((VOID
*)(NewPoolHdr
+ 1), ptr
, MIN (OldSize
, size
));
92 FreePool ((VOID
*)OldPoolHdr
);
95 return (VOID
*)(NewPoolHdr
+ 1);
98 // The buffer allocation failed.
104 /* De-allocates or frees a memory block */
105 void free (void *ptr
)
107 CRYPTMEM_HEAD
*PoolHdr
;
110 // In Standard C, free() handles a null pointer argument transparently. This
111 // is not true of FreePool() below, so protect it.
114 PoolHdr
= (CRYPTMEM_HEAD
*)ptr
- 1;
115 ASSERT (PoolHdr
->Signature
== CRYPTMEM_HEAD_SIGNATURE
);