21#include <Library/BaseMemoryLib.h>
22#include <Library/BaseOverflowLib.h>
24#include <Library/MemoryAllocationLib.h>
30#include <Library/UefiBootServicesTableLib.h>
31#include <Library/UefiRuntimeServicesTableLib.h>
32#include <Library/UefiLib.h>
34#define INTERNAL_ASSERT_EXTENT_TABLE_VALID(ExtentTable) \
35 ASSERT ((ExtentTable)->Signature == APPLE_RAM_DISK_EXTENT_SIGNATURE); \
36 ASSERT ((ExtentTable)->Version == APPLE_RAM_DISK_EXTENT_VERSION); \
37 ASSERT ((ExtentTable)->Reserved == 0); \
38 ASSERT ((ExtentTable)->Signature2 == APPLE_RAM_DISK_EXTENT_SIGNATURE); \
39 ASSERT ((ExtentTable)->ExtentCount > 0); \
40 ASSERT ((ExtentTable)->ExtentCount <= ARRAY_SIZE ((ExtentTable)->Extents))
34#define INTERNAL_ASSERT_EXTENT_TABLE_VALID(ExtentTable) \ …
54 IN EFI_PHYSICAL_ADDRESS AllocatedArea,
55 IN UINTN AllocatedAreaSize
60 ASSERT (AllocatedArea + AllocatedAreaSize - 1 <= MAX_UINTN);
61 ASSERT (AllocatedAreaSize >= EFI_PAGE_SIZE);
64 (VOID *)(UINTN)AllocatedArea,
65 EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (AllocatedAreaSize))
75 AllocatedArea += EFI_PAGE_SIZE;
76 AllocatedAreaSize -= EFI_PAGE_SIZE;
80 "Extent table different from EFI_PAGE_SIZE is unsupported!"
83 if (AllocatedAreaSize == 0) {
89 Table->Extents[Table->ExtentCount].Start = AllocatedArea;
90 Table->Extents[Table->ExtentCount].Length = AllocatedAreaSize;
113 IN EFI_PHYSICAL_ADDRESS BaseAddress,
114 IN EFI_PHYSICAL_ADDRESS TopAddress,
115 IN EFI_MEMORY_TYPE MemoryType,
116 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
117 IN UINTN MemoryMapSize,
118 IN UINTN DescriptorSize,
119 IN UINTN RemainingSize,
124 EFI_MEMORY_DESCRIPTOR *EntryWalker;
125 EFI_MEMORY_DESCRIPTOR *BiggestEntry;
126 EFI_PHYSICAL_ADDRESS AllocatedArea;
134 ASSERT (BaseAddress == EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (BaseAddress)));
135 ASSERT (TopAddress == EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (TopAddress)));
138 || (*ExtentTable)->ExtentCount <
ARRAY_SIZE ((*ExtentTable)->Extents)))
144 EntryWalker = MemoryMap;
145 (UINT8 *)EntryWalker < ((UINT8 *)MemoryMap + MemoryMapSize);
146 EntryWalker = NEXT_MEMORY_DESCRIPTOR (EntryWalker, DescriptorSize))
154 if ( (EntryWalker->Type != EfiConventionalMemory)
155 || (EntryWalker->PhysicalStart < BaseAddress)
156 || (EntryWalker->PhysicalStart >= TopAddress))
161 UsedSize = EFI_PAGES_TO_SIZE (EntryWalker->NumberOfPages);
162 if (EntryWalker->PhysicalStart + UsedSize > TopAddress) {
166 UsedSize = TopAddress - EntryWalker->PhysicalStart;
169 if ((BiggestEntry == NULL) || (UsedSize > BiggestSize)) {
170 BiggestEntry = EntryWalker;
171 BiggestSize = UsedSize;
175 if ((BiggestEntry == NULL) || (BiggestSize == 0)) {
178 "OCRAM: No entry for allocation %p / 0x%Lx bytes, rem 0x%Lx in 0x%Lx:0x%Lx\n",
181 (UINT64)RemainingSize,
185 return RemainingSize;
188 FinalUsedSize = (UINTN)
MIN (BiggestSize, RemainingSize);
190 AllocatedArea = BiggestEntry->PhysicalStart;
191 Status =
gBS->AllocatePages (
194 EFI_SIZE_TO_PAGES (FinalUsedSize),
198 if (EFI_ERROR (Status)) {
201 "OCRAM: Broken allocator for 0x%Lx in 0x%Lx bytes, rem 0x%Lx - %r\n",
202 (UINT64)BiggestEntry->PhysicalStart,
203 (UINT64)FinalUsedSize,
204 (UINT64)RemainingSize,
207 return RemainingSize;
212 RemainingSize -= FinalUsedSize;
214 BiggestEntry->PhysicalStart += EFI_SIZE_TO_PAGES (FinalUsedSize);
215 BiggestEntry->NumberOfPages -= EFI_SIZE_TO_PAGES (FinalUsedSize);
218 return RemainingSize;
239 IN EFI_MEMORY_TYPE MemoryType,
240 IN BOOLEAN PreferHighMem
245 EFI_MEMORY_DESCRIPTOR *MemoryMap;
246 UINTN DescriptorSize;
251 if (MemoryMap == NULL) {
257 "Extent table different from EFI_PAGE_SIZE is unsupported!"
260 Result = BaseOverflowAddUN (
Size, EFI_PAGE_SIZE, &RemainingSize);
312 if ((RemainingSize > 0) && (
ExtentTable != NULL)) {
324 IN EFI_MEMORY_TYPE MemoryType
344 "OCRAM: Extent allocation of %u bytes (%x) gave %p\n",
381 Index = 0, CurrentOffset = 0;
383 ++Index, CurrentOffset += (UINTN)Extent->Length
387 ASSERT (Extent->Start <= MAX_UINTN);
388 ASSERT (Extent->Length <= MAX_UINTN);
390 if ((Offset >= CurrentOffset) && ((Offset - CurrentOffset) < Extent->Length)) {
391 LocalOffset = (Offset - CurrentOffset);
392 LocalSize = (UINTN)
MIN ((Extent->Length - LocalOffset),
Size);
395 (VOID *)((UINTN)Extent->Start + LocalOffset),
404 BufferBytes += LocalSize;
420 CONST UINT8 *BufferBytes;
440 Index = 0, CurrentOffset = 0;
442 ++Index, CurrentOffset += (UINTN)Extent->Length
446 ASSERT (Extent->Start <= MAX_UINTN);
447 ASSERT (Extent->Length <= MAX_UINTN);
449 if ((Offset >= CurrentOffset) && ((Offset - CurrentOffset) < Extent->Length)) {
450 LocalOffset = (Offset - CurrentOffset);
451 LocalSize = (UINTN)
MIN ((Extent->Length - LocalOffset),
Size);
453 (VOID *)((UINTN)Extent->Start + LocalOffset),
463 BufferBytes += LocalSize;
474 IN EFI_FILE_PROTOCOL *File,
500 TmpBuffer = AllocatePool (BASE_4MB);
501 if (TmpBuffer == NULL) {
511 for (Index = 0; Index <
ExtentTable->ExtentCount && FileSize > 0; ++Index) {
515 ExtentBuffer = (VOID *)(UINTN)
ExtentTable->Extents[Index].Start;
516 ExtentSize = (UINTN)
ExtentTable->Extents[Index].Length;
518 while (FileSize > 0 && ExtentSize > 0) {
519 Status = File->SetPosition (File, FilePosition);
520 if (EFI_ERROR (Status)) {
521 FreePool (TmpBuffer);
525 RequestedSize =
MIN (
MIN (BASE_4MB, FileSize), ExtentSize);
526 ReadSize = RequestedSize;
527 Status = File->Read (
532 if (EFI_ERROR (Status) || (RequestedSize != ReadSize)) {
533 FreePool (TmpBuffer);
541 CopyMem (ExtentBuffer, TmpBuffer, ReadSize);
543 FilePosition += ReadSize;
544 ExtentBuffer += ReadSize;
545 ExtentSize -= ReadSize;
546 FileSize -= ReadSize;
550 FreePool (TmpBuffer);
563 "OCRAM: SHA-256 Digest is: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
616 for (Index = 1; Index <
ExtentTable->ExtentCount; ++Index) {
622 (UINTN)EFI_SIZE_TO_PAGES (
ExtentTable->Extents[Index].Length)
631 (UINTN)EFI_SIZE_TO_PAGES (
ExtentTable->Extents[0].Length) + 1
#define ARRAY_SIZE(Array)
PACKED struct @53 APPLE_RAM_DISK_EXTENT
#define APPLE_RAM_DISK_EXTENT_SIGNATURE
APPLE_RAM_DISK_EXTENT_TABLE ExtentTable
#define APPLE_RAM_DISK_EXTENT_VERSION
PACKED struct @54 APPLE_RAM_DISK_EXTENT_TABLE
DMG_SIZE_DEVICE_PATH Size
BOOLEAN OcAppleRamDiskWrite(IN CONST APPLE_RAM_DISK_EXTENT_TABLE *ExtentTable, IN UINTN Offset, IN UINTN Size, IN CONST VOID *Buffer)
STATIC UINTN InternalAllocateRemainingSize(IN EFI_PHYSICAL_ADDRESS BaseAddress, IN EFI_PHYSICAL_ADDRESS TopAddress, IN EFI_MEMORY_TYPE MemoryType, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, IN UINTN MemoryMapSize, IN UINTN DescriptorSize, IN UINTN RemainingSize, IN OUT APPLE_RAM_DISK_EXTENT_TABLE **ExtentTable)
VOID OcAppleRamDiskFree(IN CONST APPLE_RAM_DISK_EXTENT_TABLE *ExtentTable)
CONST APPLE_RAM_DISK_EXTENT_TABLE * OcAppleRamDiskAllocate(IN UINTN Size, IN EFI_MEMORY_TYPE MemoryType)
STATIC VOID InternalAddAllocatedArea(IN OUT APPLE_RAM_DISK_EXTENT_TABLE **ExtentTable, IN EFI_PHYSICAL_ADDRESS AllocatedArea, IN UINTN AllocatedAreaSize)
BOOLEAN OcAppleRamDiskLoadFile(IN CONST APPLE_RAM_DISK_EXTENT_TABLE *ExtentTable, IN EFI_FILE_PROTOCOL *File, IN UINTN FileSize)
STATIC CONST APPLE_RAM_DISK_EXTENT_TABLE * InternalAppleRamDiskAllocate(IN UINTN Size, IN EFI_MEMORY_TYPE MemoryType, IN BOOLEAN PreferHighMem)
#define INTERNAL_ASSERT_EXTENT_TABLE_VALID(ExtentTable)
BOOLEAN OcAppleRamDiskRead(IN CONST APPLE_RAM_DISK_EXTENT_TABLE *ExtentTable, IN UINTN Offset, IN UINTN Size, OUT VOID *Buffer)
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
VOID Sha256Init(SHA256_CONTEXT *Context)
#define SHA256_DIGEST_SIZE
VOID Sha256Final(SHA256_CONTEXT *Context, UINT8 *HashDigest)
VOID Sha256Update(SHA256_CONTEXT *Context, CONST UINT8 *Data, UINTN Len)
EFI_MEMORY_DESCRIPTOR * OcGetCurrentMemoryMap(OUT UINTN *MemoryMapSize, OUT UINTN *DescriptorSize, OUT UINTN *MapKey OPTIONAL, OUT UINT32 *DescriptorVersion OPTIONAL, OUT UINTN *OriginalMemoryMapSize OPTIONAL, IN BOOLEAN IncludeSplitSpace)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)