REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the EmbeddedPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Andrew Fish <afish@apple.com>
		
			
				
	
	
		
			239 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| 
 | |
|   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include <PrePi.h>
 | |
| 
 | |
| //
 | |
| // Hack to work in NT32
 | |
| //
 | |
| EFI_STATUS
 | |
| 
 | |
| EFIAPI
 | |
| 
 | |
| SecWinNtPeiLoadFile (
 | |
|   IN  VOID                  *Pe32Data,
 | |
|   IN  EFI_PHYSICAL_ADDRESS  *ImageAddress,
 | |
|   IN  UINT64                *ImageSize,
 | |
|   IN  EFI_PHYSICAL_ADDRESS  *EntryPoint
 | |
|   );
 | |
| 
 | |
| STATIC
 | |
| VOID *
 | |
| EFIAPI
 | |
| AllocateCodePages (
 | |
|   IN  UINTN  Pages
 | |
|   )
 | |
| {
 | |
|   VOID                  *Alloc;
 | |
|   EFI_PEI_HOB_POINTERS  Hob;
 | |
| 
 | |
|   Alloc = AllocatePages (Pages);
 | |
|   if (Alloc == NULL) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   // find the HOB we just created, and change the type to EfiBootServicesCode
 | |
|   Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION);
 | |
|   while (Hob.Raw != NULL) {
 | |
|     if (Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress == (UINTN)Alloc) {
 | |
|       Hob.MemoryAllocation->AllocDescriptor.MemoryType = EfiBootServicesCode;
 | |
|       return Alloc;
 | |
|     }
 | |
| 
 | |
|     Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, GET_NEXT_HOB (Hob));
 | |
|   }
 | |
| 
 | |
|   ASSERT (FALSE);
 | |
| 
 | |
|   FreePages (Alloc, Pages);
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LoadPeCoffImage (
 | |
|   IN  VOID                  *PeCoffImage,
 | |
|   OUT EFI_PHYSICAL_ADDRESS  *ImageAddress,
 | |
|   OUT UINT64                *ImageSize,
 | |
|   OUT EFI_PHYSICAL_ADDRESS  *EntryPoint
 | |
|   )
 | |
| {
 | |
|   RETURN_STATUS                 Status;
 | |
|   PE_COFF_LOADER_IMAGE_CONTEXT  ImageContext;
 | |
|   VOID                          *Buffer;
 | |
| 
 | |
|   ZeroMem (&ImageContext, sizeof (ImageContext));
 | |
| 
 | |
|   ImageContext.Handle    = PeCoffImage;
 | |
|   ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;
 | |
| 
 | |
|   Status = PeCoffLoaderGetImageInfo (&ImageContext);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   //
 | |
|   // Allocate Memory for the image
 | |
|   //
 | |
|   Buffer = AllocateCodePages (EFI_SIZE_TO_PAGES ((UINT32)ImageContext.ImageSize));
 | |
|   ASSERT (Buffer != 0);
 | |
| 
 | |
|   ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer;
 | |
| 
 | |
|   //
 | |
|   // Load the image to our new buffer
 | |
|   //
 | |
|   Status = PeCoffLoaderLoadImage (&ImageContext);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   //
 | |
|   // Relocate the image in our new buffer
 | |
|   //
 | |
|   Status = PeCoffLoaderRelocateImage (&ImageContext);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   *ImageAddress = ImageContext.ImageAddress;
 | |
|   *ImageSize    = ImageContext.ImageSize;
 | |
|   *EntryPoint   = ImageContext.EntryPoint;
 | |
| 
 | |
|   //
 | |
|   // Flush not needed for all architectures. We could have a processor specific
 | |
|   // function in this library that does the no-op if needed.
 | |
|   //
 | |
|   InvalidateInstructionCacheRange ((VOID *)(UINTN)*ImageAddress, (UINTN)*ImageSize);
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| typedef
 | |
| VOID
 | |
| (EFIAPI *DXE_CORE_ENTRY_POINT)(
 | |
|   IN  VOID *HobStart
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LoadDxeCoreFromFfsFile (
 | |
|   IN EFI_PEI_FILE_HANDLE  FileHandle,
 | |
|   IN UINTN                StackSize
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS            Status;
 | |
|   VOID                  *PeCoffImage;
 | |
|   EFI_PHYSICAL_ADDRESS  ImageAddress;
 | |
|   UINT64                ImageSize;
 | |
|   EFI_PHYSICAL_ADDRESS  EntryPoint;
 | |
|   VOID                  *BaseOfStack;
 | |
|   VOID                  *TopOfStack;
 | |
|   VOID                  *Hob;
 | |
|   EFI_FV_FILE_INFO      FvFileInfo;
 | |
| 
 | |
|   Status = FfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   Status = LoadPeCoffImage (PeCoffImage, &ImageAddress, &ImageSize, &EntryPoint);
 | |
|   // For NT32 Debug  Status = SecWinNtPeiLoadFile (PeCoffImage, &ImageAddress, &ImageSize, &EntryPoint);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   //
 | |
|   // Extract the DxeCore GUID file name.
 | |
|   //
 | |
|   Status = FfsGetFileInfo (FileHandle, &FvFileInfo);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   BuildModuleHob (&FvFileInfo.FileName, (EFI_PHYSICAL_ADDRESS)(UINTN)ImageAddress, EFI_SIZE_TO_PAGES ((UINT32)ImageSize) * EFI_PAGE_SIZE, EntryPoint);
 | |
| 
 | |
|   DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Loading DxeCore at 0x%10p EntryPoint=0x%10p\n", (VOID *)(UINTN)ImageAddress, (VOID *)(UINTN)EntryPoint));
 | |
| 
 | |
|   Hob = GetHobList ();
 | |
|   if (StackSize == 0) {
 | |
|     // User the current stack
 | |
| 
 | |
|     ((DXE_CORE_ENTRY_POINT)(UINTN)EntryPoint)(Hob);
 | |
|   } else {
 | |
|     //
 | |
|     // Allocate 128KB for the Stack
 | |
|     //
 | |
|     BaseOfStack = AllocatePages (EFI_SIZE_TO_PAGES (StackSize));
 | |
|     ASSERT (BaseOfStack != NULL);
 | |
| 
 | |
|     //
 | |
|     // Compute the top of the stack we were allocated. Pre-allocate a UINTN
 | |
|     // for safety.
 | |
|     //
 | |
|     TopOfStack = (VOID *)((UINTN)BaseOfStack + EFI_SIZE_TO_PAGES (StackSize) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT);
 | |
|     TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
 | |
| 
 | |
|     //
 | |
|     // Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore.
 | |
|     //
 | |
|     UpdateStackHob ((EFI_PHYSICAL_ADDRESS)(UINTN)BaseOfStack, StackSize);
 | |
| 
 | |
|     SwitchStack (
 | |
|       (SWITCH_STACK_ENTRY_POINT)(UINTN)EntryPoint,
 | |
|       Hob,
 | |
|       NULL,
 | |
|       TopOfStack
 | |
|       );
 | |
|   }
 | |
| 
 | |
|   // Should never get here as DXE Core does not return
 | |
|   DEBUG ((DEBUG_ERROR, "DxeCore returned\n"));
 | |
|   ASSERT (FALSE);
 | |
| 
 | |
|   return EFI_DEVICE_ERROR;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LoadDxeCoreFromFv (
 | |
|   IN UINTN  *FvInstance    OPTIONAL,
 | |
|   IN UINTN  StackSize
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS           Status;
 | |
|   EFI_PEI_FV_HANDLE    VolumeHandle;
 | |
|   EFI_PEI_FILE_HANDLE  FileHandle = NULL;
 | |
| 
 | |
|   if (FvInstance != NULL) {
 | |
|     //
 | |
|     // Caller passed in a specific FV to try, so only try that one
 | |
|     //
 | |
|     Status = FfsFindNextVolume (*FvInstance, &VolumeHandle);
 | |
|     if (!EFI_ERROR (Status)) {
 | |
|       Status = FfsFindNextFile (EFI_FV_FILETYPE_DXE_CORE, VolumeHandle, &FileHandle);
 | |
|     }
 | |
|   } else {
 | |
|     Status = FfsAnyFvFindFirstFile (EFI_FV_FILETYPE_DXE_CORE, &VolumeHandle, &FileHandle);
 | |
|   }
 | |
| 
 | |
|   if (!EFI_ERROR (Status)) {
 | |
|     return LoadDxeCoreFromFfsFile (FileHandle, StackSize);
 | |
|   }
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| DecompressFirstFv (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS           Status;
 | |
|   EFI_PEI_FV_HANDLE    VolumeHandle;
 | |
|   EFI_PEI_FILE_HANDLE  FileHandle;
 | |
| 
 | |
|   Status = FfsAnyFvFindFirstFile (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, &VolumeHandle, &FileHandle);
 | |
|   if (!EFI_ERROR (Status)) {
 | |
|     Status = FfsProcessFvFile (FileHandle);
 | |
|   }
 | |
| 
 | |
|   return Status;
 | |
| }
 |