3 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php.
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include <Library/MemoryAllocationLib.h>
18 #include <Library/UefiBootServicesTableLib.h>
19 #include <Library/BaseMemoryLib.h>
20 #include <Library/DebugLib.h>
21 #include <LockBoxLib.h>
24 Allocate memory below 4G memory address.
26 This function allocates memory below 4G memory address.
28 @param MemoryType Memory type of memory to allocate.
29 @param Size Size of memory to allocate.
31 @return Allocated address for output.
36 AllocateMemoryBelow4G (
37 IN EFI_MEMORY_TYPE MemoryType
,
42 EFI_PHYSICAL_ADDRESS Address
;
47 Pages
= EFI_SIZE_TO_PAGES (Size
);
51 // Since we need to use gBS->AllocatePages to get a buffer below
52 // 4GB, there is a good chance that space will be wasted for very
53 // small allocation. We keep track of unused portions of the page
54 // allocations, and use these to allocate memory for small buffers.
56 ASSERT (mLockBoxGlobal
->Signature
== LOCK_BOX_GLOBAL_SIGNATURE
);
57 if ((UINTN
) mLockBoxGlobal
->SubPageRemaining
>= Size
) {
58 Buffer
= (VOID
*)(UINTN
) mLockBoxGlobal
->SubPageBuffer
;
59 mLockBoxGlobal
->SubPageBuffer
+= (UINT32
) Size
;
60 mLockBoxGlobal
->SubPageRemaining
-= (UINT32
) Size
;
64 Status
= gBS
->AllocatePages (
70 if (EFI_ERROR (Status
)) {
74 Buffer
= (VOID
*) (UINTN
) Address
;
75 ZeroMem (Buffer
, EFI_PAGES_TO_SIZE (Pages
));
77 AllocRemaining
= EFI_PAGES_TO_SIZE (Pages
) - Size
;
78 if (AllocRemaining
> (UINTN
) mLockBoxGlobal
->SubPageRemaining
) {
79 mLockBoxGlobal
->SubPageBuffer
= (UINT32
) (Address
+ Size
);
80 mLockBoxGlobal
->SubPageRemaining
= (UINT32
) AllocRemaining
;
88 Allocates a buffer of type EfiACPIMemoryNVS.
90 Allocates the number bytes specified by AllocationSize of type
91 EfiACPIMemoryNVS and returns a pointer to the allocated buffer.
92 If AllocationSize is 0, then a valid buffer of 0 size is
93 returned. If there is not enough memory remaining to satisfy
94 the request, then NULL is returned.
96 @param AllocationSize The number of bytes to allocate.
98 @return A pointer to the allocated buffer or NULL if allocation fails.
103 AllocateAcpiNvsPool (
104 IN UINTN AllocationSize
107 return AllocateMemoryBelow4G (EfiACPIMemoryNVS
, AllocationSize
);
113 LockBoxDxeLibInitialize (
114 IN EFI_HANDLE ImageHandle
,
115 IN EFI_SYSTEM_TABLE
*SystemTable
118 return LockBoxLibInitialize ();