VOID CapsuleReset ( IN UINTN CapsuleDataPtr ) /*++ Routine Description: If need be, do any special reset required for capsules. For this implementation where we're called from the ResetSystem () api, just set our capsule variable and return to let the caller do a soft reset. Arguments: CapsuleDataPtr - pointer to the capsule block descriptors Returns: Nothing. --*/ { UINT32 Eflags; UINT16 PmCntl; UINT16 AcpiPm1CntBase; // // This implementation assumes that we're using a variable // to indicate capsule updates. // gST->RuntimeServices->SetVariable ( EFI_CAPSULE_VARIABLE_NAME, &gEfiCapsuleVendorGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS, sizeof (UINTN), (VOID *) &CapsuleDataPtr ); // Get sleep state right now. ReadPMIO (FCH_PMIOA_REG62, AccWidthUint16, (VOID*)&AcpiPm1CntBase); PmCntl = ((IoRead16 (AcpiPm1CntBase) & ~(SLP_EN | SLP_TYPE)) | SUS_S3); Eflags = EfiGetEflags (); if ((Eflags & 0x200)) { EfiDisableInterrupt (); } EfiDisableCache (); // Transform system into S3 sleep state IoWrite16 (AcpiPm1CntBase, PmCntl); PmCntl |= SLP_EN; IoWrite16 (AcpiPm1CntBase, PmCntl); if ((Eflags & 0x200)) { EfiEnableInterrupt (); } // // Should not return // EFI_DEADLOOP (); }
/** * ASSERT backend function for PEI phase * **/ BOOLEAN IdsAssert ( IN UINT32 FileCode ) { //EFI_BREAKPOINT (); EFI_DEADLOOP (); return TRUE; }
VOID PeiDebugAssert ( IN CONST EFI_PEI_SERVICES **PeiServices, IN CHAR8 *FileName, IN INTN LineNumber, IN CHAR8 *Description ) /*++ Routine Description: Worker function for ASSERT(). If Error Logging hub is loaded log ASSERT information. If Error Logging hub is not loaded DEADLOOP (). Arguments: PeiServices - The PEI core services table. FileName - File name of failing routine. LineNumber - Line number of failing ASSERT(). Description - Description, usually the assertion, Returns: None --*/ { UINT64 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE]; EfiDebugAssertWorker (FileName, LineNumber, Description, sizeof (Buffer), Buffer); // // We choose NOT to use PEI_REPORT_STATUS_CODE here, because when debug is enable, // we want get enough information if assert. // (**PeiServices).PeiReportStatusCode ( (EFI_PEI_SERVICES**)PeiServices, (EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED), (EFI_SOFTWARE_PEI_MODULE | EFI_SW_EC_ILLEGAL_SOFTWARE_STATE), 0, &gEfiCallerIdGuid, (EFI_STATUS_CODE_DATA *) Buffer ); EFI_DEADLOOP (); }
VOID EfiDebugAssert ( IN CHAR8 *FileName, IN INTN LineNumber, IN CHAR8 *Description ) /*++ Routine Description: Worker function for ASSERT (). If Error Logging hub is loaded log ASSERT information. If Error Logging hub is not loaded BREAKPOINT (). Arguments: FileName - File name of failing routine. LineNumber - Line number of failing ASSERT (). Description - Description, usually the assertion, Returns: None --*/ { UINT64 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE64]; EfiDebugAssertWorker (FileName, LineNumber, Description, sizeof (Buffer), Buffer); EfiReportStatusCode ( (EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED), (EFI_SOFTWARE_DXE_RT_DRIVER | EFI_SW_EC_ILLEGAL_SOFTWARE_STATE), 0, &gEfiCallerIdGuid, (EFI_STATUS_CODE_DATA *) Buffer ); // // Put dead loop in module that contained the error. // EFI_DEADLOOP (); }
VOID EfiLoader ( UINT32 BiosMemoryMapBaseAddress ) { BIOS_MEMORY_MAP *BiosMemoryMap; EFILDR_HEADER *EFILDRHeader; EFILDR_IMAGE *EFILDRImage; EFI_MEMORY_DESCRIPTOR EfiMemoryDescriptor[EFI_MAX_MEMORY_DESCRIPTORS]; EFI_STATUS Status; UINTN NumberOfMemoryMapEntries; UINT32 DestinationSize; UINT32 ScratchSize; UINTN BfvPageNumber; UINTN BfvBase; EFI_MAIN_ENTRYPOINT EfiMainEntrypoint; static EFILDRHANDOFF Handoff; PrintHeader ('A'); ClearScreen(); PrintString("EFI Loader\n"); // PrintString("&BiosMemoryMapBaseAddress = "); // PrintValue64 ((UINT64)(&BiosMemoryMapBaseAddress)); // PrintString(" BiosMemoryMapBaseAddress = "); // PrintValue(BiosMemoryMapBaseAddress); // PrintString("\n"); // // Add all EfiConventionalMemory descriptors to the table. If there are partial pages, then // round the start address up to the next page, and round the length down to a page boundry. // BiosMemoryMap = (BIOS_MEMORY_MAP *)(UINTN)(BiosMemoryMapBaseAddress); NumberOfMemoryMapEntries = 0; GenMemoryMap (&NumberOfMemoryMapEntries, EfiMemoryDescriptor, BiosMemoryMap); // // Get information on where the image is in memory // EFILDRHeader = (EFILDR_HEADER *)(UINTN)(EFILDR_HEADER_ADDRESS); EFILDRImage = (EFILDR_IMAGE *)(UINTN)(EFILDR_HEADER_ADDRESS + sizeof(EFILDR_HEADER)); PrintHeader ('D'); // // Point to the 4th image (Bfv) // EFILDRImage += 3; // // Decompress the image // Status = TianoGetInfo ( NULL, (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset), EFILDRImage->Length, &DestinationSize, &ScratchSize ); if (EFI_ERROR (Status)) { EFI_DEADLOOP(); } Status = TianoDecompress ( NULL, (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset), EFILDRImage->Length, (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS, DestinationSize, (VOID *)(UINTN)((EFI_DECOMPRESSED_BUFFER_ADDRESS + DestinationSize + 0x1000) & 0xfffff000), ScratchSize ); if (EFI_ERROR (Status)) { EFI_DEADLOOP(); } BfvPageNumber = EFI_SIZE_TO_PAGES (DestinationSize); BfvBase = (UINTN) FindSpace (BfvPageNumber, &NumberOfMemoryMapEntries, EfiMemoryDescriptor, EfiRuntimeServicesData, EFI_MEMORY_WB); if (BfvBase == 0) { EFI_DEADLOOP(); } EfiCommonLibZeroMem ((VOID *)(UINTN)BfvBase, BfvPageNumber * EFI_PAGE_SIZE); EfiCommonLibCopyMem ((VOID *)(UINTN)BfvBase, (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS, DestinationSize); PrintHeader ('B'); // // Point to the 2nd image (DxeIpl) // EFILDRImage -= 2; // // Decompress the image // Status = TianoGetInfo ( NULL, (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset), EFILDRImage->Length, &DestinationSize, &ScratchSize ); if (EFI_ERROR (Status)) { EFI_DEADLOOP(); } Status = TianoDecompress ( NULL, (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset), EFILDRImage->Length, (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS, DestinationSize, (VOID *)(UINTN)((EFI_DECOMPRESSED_BUFFER_ADDRESS + DestinationSize + 0x1000) & 0xfffff000), ScratchSize ); if (EFI_ERROR (Status)) { EFI_DEADLOOP(); } // // Load and relocate the EFI PE/COFF Firmware Image // Status = EfiLdrPeCoffLoadPeImage ( (VOID *)(UINTN)(EFI_DECOMPRESSED_BUFFER_ADDRESS), &DxeIplImage, &NumberOfMemoryMapEntries, EfiMemoryDescriptor ); if (EFI_ERROR (Status)) { EFI_DEADLOOP(); } // PrintString("Image.NoPages = "); // PrintValue(Image.NoPages); // PrintString("\n"); PrintHeader ('C'); // // Point to the 3rd image (DxeMain) // EFILDRImage++; // // Decompress the image // Status = TianoGetInfo ( NULL, (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset), EFILDRImage->Length, &DestinationSize, &ScratchSize ); if (EFI_ERROR (Status)) { EFI_DEADLOOP(); } Status = TianoDecompress ( NULL, (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset), EFILDRImage->Length, (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS, DestinationSize, (VOID *)(UINTN)((EFI_DECOMPRESSED_BUFFER_ADDRESS + DestinationSize + 0x1000) & 0xfffff000), ScratchSize ); if (EFI_ERROR (Status)) { EFI_DEADLOOP(); } // // Load and relocate the EFI PE/COFF Firmware Image // Status = EfiLdrPeCoffLoadPeImage ( (VOID *)(UINTN)(EFI_DECOMPRESSED_BUFFER_ADDRESS), &DxeCoreImage, &NumberOfMemoryMapEntries, EfiMemoryDescriptor ); if (EFI_ERROR (Status)) { EFI_DEADLOOP(); } PrintHeader ('E'); // // Display the table of memory descriptors. // // PrintString("\nEFI Memory Descriptors\n"); /* { UINTN Index; for (Index = 0; Index < NumberOfMemoryMapEntries; Index++) { PrintString("Type = "); PrintValue(EfiMemoryDescriptor[Index].Type); PrintString(" Start = "); PrintValue((UINT32)(EfiMemoryDescriptor[Index].PhysicalStart)); PrintString(" NumberOfPages = "); PrintValue((UINT32)(EfiMemoryDescriptor[Index].NumberOfPages)); PrintString("\n"); } } */ // // Jump to EFI Firmware // if (DxeIplImage.EntryPoint != NULL) { Handoff.MemDescCount = NumberOfMemoryMapEntries; Handoff.MemDesc = EfiMemoryDescriptor; Handoff.BfvBase = (VOID *)(UINTN)BfvBase; Handoff.BfvSize = BfvPageNumber * EFI_PAGE_SIZE; Handoff.DxeIplImageBase = (VOID *)(UINTN)DxeIplImage.ImageBasePage; Handoff.DxeIplImageSize = DxeIplImage.NoPages * EFI_PAGE_SIZE; Handoff.DxeCoreImageBase = (VOID *)(UINTN)DxeCoreImage.ImageBasePage; Handoff.DxeCoreImageSize = DxeCoreImage.NoPages * EFI_PAGE_SIZE; Handoff.DxeCoreEntryPoint = (VOID *)(UINTN)DxeCoreImage.EntryPoint; EfiMainEntrypoint = (EFI_MAIN_ENTRYPOINT)(UINTN)DxeIplImage.EntryPoint; EfiMainEntrypoint (&Handoff); } PrintHeader ('F'); // // There was a problem loading the image, so HALT the system. // EFI_DEADLOOP(); }