コード例 #1
0
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 ();
}
コード例 #2
0
ファイル: DxeInit.c プロジェクト: SunnyKi/bareBoot
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 ();
}