REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the ArmPkg 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>
		
			
				
	
	
		
			337 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			337 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| *  Main file supporting the SEC Phase for Versatile Express
 | |
| *
 | |
| *  Copyright (c) 2011-2014, ARM Limited. All rights reserved.
 | |
| *
 | |
| *  SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| *
 | |
| **/
 | |
| 
 | |
| #include <Uefi.h>
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/DebugAgentLib.h>
 | |
| #include <Library/PcdLib.h>
 | |
| #include <Library/PeCoffExtraActionLib.h>
 | |
| #include <Library/PeCoffLib.h>
 | |
| 
 | |
| #include <Pi/PiFirmwareFile.h>
 | |
| #include <Pi/PiFirmwareVolume.h>
 | |
| 
 | |
| #define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
 | |
|   (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
 | |
| 
 | |
| // Vector Table for Sec Phase
 | |
| VOID
 | |
| DebugAgentVectorTable (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Returns the highest bit set of the State field
 | |
| 
 | |
|   @param ErasePolarity   Erase Polarity  as defined by EFI_FVB2_ERASE_POLARITY
 | |
|                          in the Attributes field.
 | |
|   @param FfsHeader       Pointer to FFS File Header
 | |
| 
 | |
| 
 | |
|   @retval the highest bit in the State field
 | |
| 
 | |
| **/
 | |
| STATIC
 | |
| EFI_FFS_FILE_STATE
 | |
| GetFileState (
 | |
|   IN UINT8                ErasePolarity,
 | |
|   IN EFI_FFS_FILE_HEADER  *FfsHeader
 | |
|   )
 | |
| {
 | |
|   EFI_FFS_FILE_STATE  FileState;
 | |
|   EFI_FFS_FILE_STATE  HighestBit;
 | |
| 
 | |
|   FileState = FfsHeader->State;
 | |
| 
 | |
|   if (ErasePolarity != 0) {
 | |
|     FileState = (EFI_FFS_FILE_STATE) ~FileState;
 | |
|   }
 | |
| 
 | |
|   HighestBit = 0x80;
 | |
|   while (HighestBit != 0 && (HighestBit & FileState) == 0) {
 | |
|     HighestBit >>= 1;
 | |
|   }
 | |
| 
 | |
|   return HighestBit;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Calculates the checksum of the header of a file.
 | |
|   The header is a zero byte checksum, so zero means header is good
 | |
| 
 | |
|   @param FfsHeader       Pointer to FFS File Header
 | |
| 
 | |
|   @retval Checksum of the header
 | |
| 
 | |
| **/
 | |
| STATIC
 | |
| UINT8
 | |
| CalculateHeaderChecksum (
 | |
|   IN EFI_FFS_FILE_HEADER  *FileHeader
 | |
|   )
 | |
| {
 | |
|   UINT8  Sum;
 | |
| 
 | |
|   // Calculate the sum of the header
 | |
|   Sum = CalculateSum8 ((CONST VOID *)FileHeader, sizeof (EFI_FFS_FILE_HEADER));
 | |
| 
 | |
|   // State field (since this indicates the different state of file).
 | |
|   Sum = (UINT8)(Sum - FileHeader->State);
 | |
| 
 | |
|   // Checksum field of the file is not part of the header checksum.
 | |
|   Sum = (UINT8)(Sum - FileHeader->IntegrityCheck.Checksum.File);
 | |
| 
 | |
|   return Sum;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| GetFfsFile (
 | |
|   IN  EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader,
 | |
|   IN  EFI_FV_FILETYPE             FileType,
 | |
|   OUT EFI_FFS_FILE_HEADER         **FileHeader
 | |
|   )
 | |
| {
 | |
|   UINT64               FvLength;
 | |
|   UINTN                FileOffset;
 | |
|   EFI_FFS_FILE_HEADER  *FfsFileHeader;
 | |
|   UINT8                ErasePolarity;
 | |
|   UINT8                FileState;
 | |
|   UINT32               FileLength;
 | |
|   UINT32               FileOccupiedSize;
 | |
| 
 | |
|   ASSERT (FwVolHeader->Signature == EFI_FVH_SIGNATURE);
 | |
| 
 | |
|   FvLength      = FwVolHeader->FvLength;
 | |
|   FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FwVolHeader + FwVolHeader->HeaderLength);
 | |
|   FileOffset    = FwVolHeader->HeaderLength;
 | |
| 
 | |
|   if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
 | |
|     ErasePolarity = 1;
 | |
|   } else {
 | |
|     ErasePolarity = 0;
 | |
|   }
 | |
| 
 | |
|   while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
 | |
|     // Get FileState which is the highest bit of the State
 | |
|     FileState = GetFileState (ErasePolarity, FfsFileHeader);
 | |
| 
 | |
|     switch (FileState) {
 | |
|       case EFI_FILE_HEADER_INVALID:
 | |
|         FileOffset   += sizeof (EFI_FFS_FILE_HEADER);
 | |
|         FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
 | |
|         break;
 | |
| 
 | |
|       case EFI_FILE_DATA_VALID:
 | |
|       case EFI_FILE_MARKED_FOR_UPDATE:
 | |
|         if (CalculateHeaderChecksum (FfsFileHeader) != 0) {
 | |
|           ASSERT (FALSE);
 | |
|           return EFI_NOT_FOUND;
 | |
|         }
 | |
| 
 | |
|         if (FfsFileHeader->Type == FileType) {
 | |
|           *FileHeader = FfsFileHeader;
 | |
|           return EFI_SUCCESS;
 | |
|         }
 | |
| 
 | |
|         FileLength       = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;
 | |
|         FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
 | |
| 
 | |
|         FileOffset   += FileOccupiedSize;
 | |
|         FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);
 | |
|         break;
 | |
| 
 | |
|       case EFI_FILE_DELETED:
 | |
|         FileLength       = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;
 | |
|         FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
 | |
|         FileOffset      += FileOccupiedSize;
 | |
|         FfsFileHeader    = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);
 | |
|         break;
 | |
| 
 | |
|       default:
 | |
|         return EFI_NOT_FOUND;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return EFI_NOT_FOUND;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| GetImageContext (
 | |
|   IN  EFI_FFS_FILE_HEADER           *FfsHeader,
 | |
|   OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                       Status;
 | |
|   UINTN                            ParsedLength;
 | |
|   UINTN                            SectionSize;
 | |
|   UINTN                            SectionLength;
 | |
|   EFI_COMMON_SECTION_HEADER        *Section;
 | |
|   VOID                             *EfiImage;
 | |
|   UINTN                            ImageAddress;
 | |
|   EFI_IMAGE_DEBUG_DIRECTORY_ENTRY  *DebugEntry;
 | |
|   VOID                             *CodeViewEntryPointer;
 | |
| 
 | |
|   Section      = (EFI_COMMON_SECTION_HEADER *)(FfsHeader + 1);
 | |
|   SectionSize  = *(UINT32 *)(FfsHeader->Size) & 0x00FFFFFF;
 | |
|   SectionSize -= sizeof (EFI_FFS_FILE_HEADER);
 | |
|   ParsedLength = 0;
 | |
|   EfiImage     = NULL;
 | |
| 
 | |
|   while (ParsedLength < SectionSize) {
 | |
|     if ((Section->Type == EFI_SECTION_PE32) || (Section->Type == EFI_SECTION_TE)) {
 | |
|       EfiImage = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(Section + 1);
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Size is 24 bits wide so mask upper 8 bits.
 | |
|     // SectionLength is adjusted it is 4 byte aligned.
 | |
|     // Go to the next section
 | |
|     //
 | |
|     SectionLength = *(UINT32 *)Section->Size & 0x00FFFFFF;
 | |
|     SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
 | |
|     ASSERT (SectionLength != 0);
 | |
|     ParsedLength += SectionLength;
 | |
|     Section       = (EFI_COMMON_SECTION_HEADER *)((UINT8 *)Section + SectionLength);
 | |
|   }
 | |
| 
 | |
|   if (EfiImage == NULL) {
 | |
|     return EFI_NOT_FOUND;
 | |
|   }
 | |
| 
 | |
|   // Initialize the Image Context
 | |
|   ZeroMem (ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));
 | |
|   ImageContext->Handle    = EfiImage;
 | |
|   ImageContext->ImageRead = PeCoffLoaderImageReadFromMemory;
 | |
| 
 | |
|   Status =  PeCoffLoaderGetImageInfo (ImageContext);
 | |
|   if (!EFI_ERROR (Status) && ((VOID *)(UINTN)ImageContext->DebugDirectoryEntryRva != NULL)) {
 | |
|     ImageAddress = ImageContext->ImageAddress;
 | |
|     if (ImageContext->IsTeImage) {
 | |
|       ImageAddress += sizeof (EFI_TE_IMAGE_HEADER) - ((EFI_TE_IMAGE_HEADER *)EfiImage)->StrippedSize;
 | |
|     }
 | |
| 
 | |
|     DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)(ImageAddress + ImageContext->DebugDirectoryEntryRva);
 | |
|     if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {
 | |
|       CodeViewEntryPointer = (VOID *)(ImageAddress + (UINTN)DebugEntry->RVA);
 | |
|       switch (*(UINT32 *)CodeViewEntryPointer) {
 | |
|         case CODEVIEW_SIGNATURE_NB10:
 | |
|           ImageContext->PdbPointer = (CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);
 | |
|           break;
 | |
|         case CODEVIEW_SIGNATURE_RSDS:
 | |
|           ImageContext->PdbPointer = (CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);
 | |
|           break;
 | |
|         case CODEVIEW_SIGNATURE_MTOC:
 | |
|           ImageContext->PdbPointer = (CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY);
 | |
|           break;
 | |
|         default:
 | |
|           break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Initialize debug agent.
 | |
| 
 | |
|   This function is used to set up debug environment to support source level debugging.
 | |
|   If certain Debug Agent Library instance has to save some private data in the stack,
 | |
|   this function must work on the mode that doesn't return to the caller, then
 | |
|   the caller needs to wrap up all rest of logic after InitializeDebugAgent() into one
 | |
|   function and pass it into InitializeDebugAgent(). InitializeDebugAgent() is
 | |
|   responsible to invoke the passing-in function at the end of InitializeDebugAgent().
 | |
| 
 | |
|   If the parameter Function is not NULL, Debug Agent Library instance will invoke it by
 | |
|   passing in the Context to be its parameter.
 | |
| 
 | |
|   If Function() is NULL, Debug Agent Library instance will return after setup debug
 | |
|   environment.
 | |
| 
 | |
|   @param[in] InitFlag     Init flag is used to decide the initialize process.
 | |
|   @param[in] Context      Context needed according to InitFlag; it was optional.
 | |
|   @param[in] Function     Continue function called by debug agent library; it was
 | |
|                           optional.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| InitializeDebugAgent (
 | |
|   IN UINT32                InitFlag,
 | |
|   IN VOID                  *Context  OPTIONAL,
 | |
|   IN DEBUG_AGENT_CONTINUE  Function  OPTIONAL
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                    Status;
 | |
|   EFI_FFS_FILE_HEADER           *FfsHeader;
 | |
|   PE_COFF_LOADER_IMAGE_CONTEXT  ImageContext;
 | |
| 
 | |
|   // We use InitFlag to know if DebugAgent has been initialized from
 | |
|   // Sec (DEBUG_AGENT_INIT_PREMEM_SEC) or PrePi (DEBUG_AGENT_INIT_POSTMEM_SEC)
 | |
|   // modules
 | |
|   if (InitFlag == DEBUG_AGENT_INIT_PREMEM_SEC) {
 | |
|     //
 | |
|     // Get the Sec or PrePeiCore module (defined as SEC type module)
 | |
|     //
 | |
|     Status = GetFfsFile ((EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet64 (PcdSecureFvBaseAddress), EFI_FV_FILETYPE_SECURITY_CORE, &FfsHeader);
 | |
|     if (!EFI_ERROR (Status)) {
 | |
|       Status = GetImageContext (FfsHeader, &ImageContext);
 | |
|       if (!EFI_ERROR (Status)) {
 | |
|         PeCoffLoaderRelocateImageExtraAction (&ImageContext);
 | |
|       }
 | |
|     }
 | |
|   } else if (InitFlag == DEBUG_AGENT_INIT_POSTMEM_SEC) {
 | |
|     //
 | |
|     // Get the PrePi or PrePeiCore module (defined as SEC type module)
 | |
|     //
 | |
|     Status = GetFfsFile ((EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet64 (PcdFvBaseAddress), EFI_FV_FILETYPE_SECURITY_CORE, &FfsHeader);
 | |
|     if (!EFI_ERROR (Status)) {
 | |
|       Status = GetImageContext (FfsHeader, &ImageContext);
 | |
|       if (!EFI_ERROR (Status)) {
 | |
|         PeCoffLoaderRelocateImageExtraAction (&ImageContext);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Get the PeiCore module (defined as PEI_CORE type module)
 | |
|     //
 | |
|     Status = GetFfsFile ((EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdGet64 (PcdFvBaseAddress), EFI_FV_FILETYPE_PEI_CORE, &FfsHeader);
 | |
|     if (!EFI_ERROR (Status)) {
 | |
|       Status = GetImageContext (FfsHeader, &ImageContext);
 | |
|       if (!EFI_ERROR (Status)) {
 | |
|         PeCoffLoaderRelocateImageExtraAction (&ImageContext);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Enable/Disable the interrupt of debug timer and return the interrupt state
 | |
|   prior to the operation.
 | |
| 
 | |
|   If EnableStatus is TRUE, enable the interrupt of debug timer.
 | |
|   If EnableStatus is FALSE, disable the interrupt of debug timer.
 | |
| 
 | |
|   @param[in] EnableStatus    Enable/Disable.
 | |
| 
 | |
|   @return FALSE always.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| SaveAndSetDebugTimerInterrupt (
 | |
|   IN BOOLEAN  EnableStatus
 | |
|   )
 | |
| {
 | |
|   return FALSE;
 | |
| }
 |