VOID DxeInit ( IN EFILDRHANDOFF *Handoff ) /*++ Routine Description: This is the entry point after this code has been loaded into memory. Arguments: Returns: Calls into EFI Firmware --*/ { VOID *StackTop; VOID *StackBottom; VOID *PageTableBase; VOID *MemoryTopOnDescriptor; VOID *MemoryDescriptor; VOID *NvStorageBase; CHAR8 PrintBuffer[256]; ClearScreen(); PrintString("Enter DxeIpl ...\n"); /* ClearScreen(); PrintString("handoff:\n"); PrintString("Handoff.BfvBase = "); PrintValue64((UINT64)(UINTN)Handoff->BfvBase); PrintString(", "); PrintString("BfvLength = "); PrintValue64(Handoff->BfvSize); PrintString("\n"); PrintString("Handoff.DxeIplImageBase = "); PrintValue64((UINT64)(UINTN)Handoff->DxeIplImageBase); PrintString(", "); PrintString("DxeIplImageSize = "); PrintValue64(Handoff->DxeIplImageSize); PrintString("\n"); PrintString("Handoff.DxeCoreImageBase = "); PrintValue64((UINT64)(UINTN)Handoff->DxeCoreImageBase); PrintString(", "); PrintString("DxeCoreImageSize = "); PrintValue64(Handoff->DxeCoreImageSize); PrintString("\n"); */ // // Hob Generation Guild line: // * Don't report FV as physical memory // * MemoryAllocation Hob should only cover physical memory // * Use ResourceDescriptor Hob to report physical memory or Firmware Device and they shouldn't be overlapped PrintString("Prepare Cpu HOB information ...\n"); PrepareHobCpu (); // // 1. BFV // PrintString("Prepare BFV HOB information ...\n"); PrepareHobBfv (Handoff->BfvBase, Handoff->BfvSize); // // 2. Updates Memory information, and get the top free address under 4GB // PrintString("Prepare Memory HOB information ...\n"); MemoryTopOnDescriptor = PrepareHobMemory (Handoff->MemDescCount, Handoff->MemDesc); // // 3. Put [NV], [Stack], [PageTable], [MemDesc], [HOB] just below the [top free address under 4GB] // // 3.1 NV data PrintString("Prepare NV Storage information ...\n"); NvStorageBase = PrepareHobNvStorage (MemoryTopOnDescriptor); AsciiSPrint (PrintBuffer, 256, "NV Storage Base=0x%x\n", (UINTN)NvStorageBase); PrintString (PrintBuffer); // 3.2 Stack StackTop = NvStorageBase; StackBottom = PrepareHobStack (StackTop); AsciiSPrint (PrintBuffer, 256, "Stack Top=0x%x, Stack Bottom=0x%x\n", (UINTN)StackTop, (UINTN)StackBottom); PrintString (PrintBuffer); // 3.3 Page Table PageTableBase = PreparePageTable (StackBottom, gHob->Cpu.SizeOfMemorySpace); // 3.4 MemDesc (will be used in PlatformBds) MemoryDescriptor = PrepareHobMemoryDescriptor (PageTableBase, Handoff->MemDescCount, Handoff->MemDesc); // 3.5 Copy the Hob itself to EfiMemoryBottom, and update the PHIT Hob PrepareHobPhit (StackTop, MemoryDescriptor); // // 4. Register the memory occupied by DxeCore and DxeIpl together as DxeCore // PrintString("Prepare DxeCore memory Hob ...\n"); PrepareHobDxeCore ( Handoff->DxeCoreEntryPoint, (EFI_PHYSICAL_ADDRESS)(UINTN)Handoff->DxeCoreImageBase, (UINTN)Handoff->DxeIplImageBase + (UINTN)Handoff->DxeIplImageSize - (UINTN)Handoff->DxeCoreImageBase ); PrepareHobLegacyTable (gHob); PreparePpisNeededByDxeCore (gHob); CompleteHobGeneration (); AsciiSPrint (PrintBuffer, 256, "HobStart=0x%x\n", (UINTN)gHob); PrintString (PrintBuffer); AsciiSPrint (PrintBuffer, 256, "Memory Top=0x%x, Bottom=0x%x\n", (UINTN)gHob->Phit.EfiMemoryTop, (UINTN)gHob->Phit.EfiMemoryBottom); PrintString (PrintBuffer); AsciiSPrint (PrintBuffer, 256, "Free Memory Top=0x%x, Bottom=0x%x\n", (UINTN)gHob->Phit.EfiFreeMemoryTop, (UINTN)gHob->Phit.EfiFreeMemoryBottom); PrintString (PrintBuffer); AsciiSPrint (PrintBuffer, 256, "Nv Base=0x%x, Length=0x%x\n", (UINTN)gHob->NvStorageFvb.FvbInfo.Entries[0].Base, (UINTN)gHob->NvFtwFvb.FvbInfo.Entries[0].Length); PrintString (PrintBuffer); /* // // Print Hob Info // ClearScreen(); PrintString("Hob Info\n"); PrintString("Phit.EfiMemoryTop = "); PrintValue64(gHob->Phit.EfiMemoryTop); PrintString(" Phit.EfiMemoryBottom = "); PrintValue64(gHob->Phit.EfiMemoryBottom); PrintString("\n"); PrintString("Phit.EfiFreeMemoryTop = "); PrintValue64(gHob->Phit.EfiFreeMemoryTop); PrintString(" Phit.EfiFreeMemoryBottom = "); PrintValue64(gHob->Phit.EfiFreeMemoryBottom); PrintString("\n"); PrintString("Bfv = "); PrintValue64(gHob->Bfv.BaseAddress); PrintString(" BfvLength = "); PrintValue64(gHob->Bfv.Length); PrintString("\n"); PrintString("NvStorageFvb = "); PrintValue64(gHob->NvStorageFvb.FvbInfo.Entries[0].Base); PrintString(" Length = "); PrintValue64(gHob->NvStorageFvb.FvbInfo.Entries[0].Length); PrintString("\n"); PrintString("NvFtwFvb = "); PrintValue64(gHob->NvFtwFvb.FvbInfo.Entries[0].Base); PrintString(" Length = "); PrintValue64(gHob->NvFtwFvb.FvbInfo.Entries[0].Length); PrintString("\n"); PrintString("BfvResource = "); PrintValue64(gHob->BfvResource.PhysicalStart); PrintString(" Length = "); PrintValue64(gHob->BfvResource.ResourceLength); PrintString("\n"); PrintString("NvStorageFvResource = "); PrintValue64(gHob->NvStorageFvResource.PhysicalStart); PrintString(" Length = "); PrintValue64(gHob->NvStorageFvResource.ResourceLength); PrintString("\n"); PrintString("NvStorage = "); PrintValue64(gHob->NvStorage.FvbInfo.Entries[0].Base); PrintString(" Length = "); PrintValue64(gHob->NvStorage.FvbInfo.Entries[0].Length); PrintString("\n"); PrintString("NvFtwFvResource = "); PrintValue64(gHob->NvFtwFvResource.PhysicalStart); PrintString(" Length = "); PrintValue64(gHob->NvFtwFvResource.ResourceLength); PrintString("\n"); PrintString("NvFtwWorking = "); PrintValue64(gHob->NvFtwWorking.FvbInfo.Entries[0].Base); PrintString(" Length = "); PrintValue64(gHob->NvFtwWorking.FvbInfo.Entries[0].Length); PrintString("\n"); PrintString("NvFtwSpare = "); PrintValue64(gHob->NvFtwSpare.FvbInfo.Entries[0].Base); PrintString(" Length = "); PrintValue64(gHob->NvFtwSpare.FvbInfo.Entries[0].Length); PrintString("\n"); PrintString("Stack = "); PrintValue64(gHob->Stack.AllocDescriptor.MemoryBaseAddress); PrintString(" StackLength = "); PrintValue64(gHob->Stack.AllocDescriptor.MemoryLength); PrintString("\n"); PrintString("PageTable = "); PrintValue64((UINTN)PageTableBase); PrintString("\n"); PrintString("MemoryFreeUnder1MB = "); PrintValue64(gHob->MemoryFreeUnder1MB.PhysicalStart); PrintString(" MemoryFreeUnder1MBLength = "); PrintValue64(gHob->MemoryFreeUnder1MB.ResourceLength); PrintString("\n"); PrintString("MemoryAbove1MB = "); PrintValue64(gHob->MemoryAbove1MB.PhysicalStart); PrintString(" MemoryAbove1MBLength = "); PrintValue64(gHob->MemoryAbove1MB.ResourceLength); PrintString("\n"); PrintString("MemoryAbove4GB = "); PrintValue64(gHob->MemoryAbove4GB.PhysicalStart); PrintString(" MemoryAbove4GBLength = "); PrintValue64(gHob->MemoryAbove4GB.ResourceLength); PrintString("\n"); PrintString("DxeCore = "); PrintValue64(gHob->DxeCore.MemoryAllocationHeader.MemoryBaseAddress); PrintString(" DxeCoreLength = "); PrintValue64(gHob->DxeCore.MemoryAllocationHeader.MemoryLength); PrintString("\n"); PrintString("MemoryAllocation = "); PrintValue64(gHob->MemoryAllocation.AllocDescriptor.MemoryBaseAddress); PrintString(" MemoryLength = "); PrintValue64(gHob->MemoryAllocation.AllocDescriptor.MemoryLength); PrintString("\n"); EFI_DEADLOOP(); */ ClearScreen(); PrintString("\n\n\n\n\n\n\n\n\n\n"); PrintString(" WELCOME TO EFI WORLD!\n"); EnterDxeMain (StackTop, Handoff->DxeCoreEntryPoint, gHob, PageTableBase); PrintString("Fail to enter DXE main!\n"); // // Should never get here // CpuDeadLoop (); }
VOID DxeInit ( IN EFILDRHANDOFF *Handoff ) /*++ Routine Description: This is the entry point after this code has been loaded into memory. Arguments: Returns: Calls into EFI Firmware --*/ { VOID *StackTop; VOID *StackBottom; VOID *PageTableBase; VOID *MemoryTopOnDescriptor; VOID *MemoryDescriptor; VOID *NvStorageBase; EFILDRHANDOFF HandoffCopy; CopyMem ((VOID*) &HandoffCopy, (VOID*) Handoff, sizeof (EFILDRHANDOFF)); Handoff = &HandoffCopy; #if 0 UINT32 rcba; UINT32 *fdr; rcba = 0xFED1C000; fdr = ((UINT32 *) (UINTN) (rcba + 0x3418)); *fdr &= ~0x8; ClearScreen(); PrintString ( "Enter DxeIpl ...\n" "Handoff:\n" "Handoff.BfvBase = %p, BfvLength = %x\n" "Handoff.DxeIplImageBase = %p, DxeIplImageSize = %x\n" "Handoff.DxeCoreImageBase = %p, DxeCoreImageSize = %x\n", Handoff->BfvBase, Handoff->BfvSize, Handoff->DxeIplImageBase, Handoff->DxeIplImageSize, Handoff->DxeCoreImageBase, Handoff->DxeCoreImageSize ); #endif // // Hob Generation Guild line: // * Don't report FV as physical memory // * MemoryAllocation Hob should only cover physical memory // * Use ResourceDescriptor Hob to report physical memory or Firmware Device and they shouldn't be overlapped // // 1. BFV // #if 0 PrintString ("Prepare Cpu HOB information ...\n"); #endif PrepareHobCpu (); #if 0 PrintString ("Prepare BFV HOB information ...\n"); #endif PrepareHobBfv (Handoff->BfvBase, Handoff->BfvSize); // // 2. Updates Memory information, and get the top free address under 4GB // #if 0 PrintString ("Prepare Memory HOB information ...\n"); #endif MemoryTopOnDescriptor = PrepareHobMemory (Handoff->MemDescCount, Handoff->MemDesc); // // 3. Put [NV], [Stack], [PageTable], [MemDesc], [HOB] just below the [top free address under 4GB] // // 3.1 NV data #if 0 PrintString ("Prepare NV Storage information ...\n"); #endif NvStorageBase = PrepareHobNvStorage (MemoryTopOnDescriptor); #if 0 PrintString ("NV Storage Base = %p\n", NvStorageBase); #endif // 3.2 Stack StackTop = NvStorageBase; StackBottom = PrepareHobStack (StackTop); #if 0 PrintString ("Stack Top=0x%x, Stack Bottom=0x%x\n", StackTop, StackBottom); #endif // 3.3 Page Table PageTableBase = PreparePageTable (StackBottom, gHob->Cpu.SizeOfMemorySpace); // 3.4 MemDesc (will be used in PlatformBds) MemoryDescriptor = PrepareHobMemoryDescriptor (PageTableBase, Handoff->MemDescCount, Handoff->MemDesc); // 3.5 Copy the Hob itself to EfiMemoryBottom, and update the PHIT Hob PrepareHobPhit (StackTop, MemoryDescriptor); // // 4. Register the memory occupied by DxeCore and DxeIpl together as DxeCore // #if 0 PrintString ("Prepare DxeCore memory Hob ...\n"); #endif PrepareHobDxeCore ( Handoff->DxeCoreEntryPoint, (EFI_PHYSICAL_ADDRESS)(UINTN)Handoff->DxeCoreImageBase, (UINTN)Handoff->DxeIplImageBase + (UINTN)Handoff->DxeIplImageSize - (UINTN)Handoff->DxeCoreImageBase ); PrepareHobLegacyTable (gHob); PreparePpisNeededByDxeCore (gHob); CompleteHobGeneration (); // // Print Hob Info // #if 0 ClearScreen(); PrintString ( "HobStart = %p\n" "Memory Top = %lx, Bottom = %lx\n" "Free Memory Top = %lx, Bottom = %lx\n" "NvStorageFvb = %lx, Length = %lx\n" "BfvResource = %lx, Length = %lx\n" "NvStorageFvResource = %lx, Length = %lx\n" "NvStorage = %lx, Length = %lx\n" "NvFtwFvResource = %lx, Length = %lx\n" "NvFtwWorking = %lx, Length = %lx\n" "NvFtwSpare = %lx, Length = %lx\n" "Stack = %lx, StackLength = %lx\n" "PageTable = %p\n" "MemoryFreeUnder1MB = %lx, MemoryFreeUnder1MBLength = %lx\n" "MemoryAbove1MB = %lx, MemoryAbove1MBLength = %lx\n" "MemoryAbove4GB = %lx, MemoryAbove4GBLength = %lx\n" "DxeCore = %lx, DxeCoreLength = %lx\n" "MemoryAllocation = %lx, MemoryLength = %lx\n" "$", gHob, gHob->Phit.EfiMemoryTop, gHob->Phit.EfiMemoryBottom, gHob->Phit.EfiFreeMemoryTop, gHob->Phit.EfiFreeMemoryBottom, gHob->NvStorageFvb.FvbInfo.Entries[0].Base, gHob->NvFtwFvb.FvbInfo.Entries[0].Length, gHob->BfvResource.PhysicalStart, gHob->BfvResource.ResourceLength, gHob->NvStorageFvResource.PhysicalStart, gHob->NvStorageFvResource.ResourceLength, gHob->NvStorage.FvbInfo.Entries[0].Base, gHob->NvStorage.FvbInfo.Entries[0].Length, gHob->NvFtwFvResource.PhysicalStart, gHob->NvFtwFvResource.ResourceLength, gHob->NvFtwWorking.FvbInfo.Entries[0].Base, gHob->NvFtwWorking.FvbInfo.Entries[0].Length, gHob->NvFtwSpare.FvbInfo.Entries[0].Base, gHob->NvFtwSpare.FvbInfo.Entries[0].Length, gHob->Stack.AllocDescriptor.MemoryBaseAddress, gHob->Stack.AllocDescriptor.MemoryLength, PageTableBase, gHob->MemoryFreeUnder1MB.PhysicalStart, gHob->MemoryFreeUnder1MB.ResourceLength, gHob->MemoryAbove1MB.PhysicalStart, gHob->MemoryAbove1MB.ResourceLength, gHob->MemoryAbove4GB.PhysicalStart, gHob->MemoryAbove4GB.ResourceLength, gHob->DxeCore.MemoryAllocationHeader.MemoryBaseAddress, gHob->DxeCore.MemoryAllocationHeader.MemoryLength, gHob->MemoryAllocation.AllocDescriptor.MemoryBaseAddress, gHob->MemoryAllocation.AllocDescriptor.MemoryLength ); ClearScreen(); PrintString ( "\n\n\n\n\n\n\n\n\n\n" " WELCOME TO EFI WORLD!\n" ); #endif EnterDxeMain (StackTop, Handoff->DxeCoreEntryPoint, gHob, PageTableBase); PrintString ("Fail to enter DXE main!\n"); // // Should never get here // CpuDeadLoop (); }