● Small, tight startup code
• Startup with transitory memory store for call-stack (I.e., cache)
• XIP from ROM● Core locates, validates, and dispatches PEIMs
● Publishes own protocol and call-abstraction with PPI
• Silicon/platform abstractions● Primary goals
• Discover boot mode
• Launch modules that initialize main memory
• Discovery & launch DXE core- Convey platform info into DXE
$ PEI 名詞解釋
● PEI Core
The main PEI executable binary responsible for dispatching PEIM and provide basic services.● PEIM
An executable binary that is loaded by the core to do various tasks and initializations.● PPI
PEIM to PEIM Interface. An interface that allows a PEIM to invoke another PEIM.● PEI Dispatcher
The part of the PEI core that searches for and executes the PEIM.● PEI Services
Functions provided by the core visible to all PEIM.
$ PEI Phase Flow
$ PEI提供的Services:
| 
PPI Services | 
Manages PEIM-to-PEIM
  Interface (PPIs) to facilitate intermodule calls between PEIMs. Interfaces are installed and tracked on a database maintained in temporary RAM. | 
InstallPpi() ReInstallPpi() LocatePpi() NotifyPpi() | 
| 
Boot Mode Services | 
Manages the boot mode (S3,
  S5, normal boot, diagnostics, etc.) of the system. | 
GetBootMode() SetBootMode() | 
| 
HOB Services | 
Creates data structures
  called Hand-Off Blocks (HOBs) that are used to pass information to the next
  phase of the PI Architecture. | 
GetHobList() CreateHob() | 
| 
Firmware Volume Services | 
Walks the Firmware File
  Systems (FFS) in firmware volumes to find PEIMs and other firmware files in
  the flash device. | 
FfsFindNextVolume() FfsFindNextFile() FfsFindSectionData() | 
| 
PEI Memory Services | 
Provides a collection of
  memory management services for use both before and after permanent memory has
  been discovered. | 
InstallPeiMemory() AllocatePages() AllocatePool() CopyMem() SetMem() | 
| 
Status Code Services | 
Provides common progress
  and error code reporting services (for example, port 080h or a serial port
  for simple text output for debug). | 
PeiReportStatusCode() | 
| 
Reset Services | 
Provides a common means by
  which to initiate a warm or cold restart of the system. | 
PeiResetSystem() | 
$ PEI Code Trace
Pre-Memory經Memory initialized後為Post-Memory
● PEI 的進入點
| VOID EFIAPI PeiCore ( /* SecCoreData Points to a data structure containing information about the PEI core's operating environment, such as the size and location of temporary RAM, the stack location and the BFV location. */ IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, /* PpiList Points to a list of one or more PPI descriptors to be installed initially by the PEI core. An empty PPI list consists of a single descriptor with the end-tag EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST. As part of its initialization phase, the PEI Foundation will add these SEC-hosted PPIs to its PPI database such that both the PEI Foundation and any modules can leverage the associated service calls and/or code in these early PPIs*/ IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList, /* Data Pointer to old core data that is used to initialize the core's data areas. If NULL, it is first PeiCore entering.*/ IN VOID *Data 
  ) 
{ 
... 
// 
// Initialize PEI Core Services 
// 
InitializeMemoryServices (&PrivateData, SecCoreData, OldCoreData); 
InitializePpiServices (&PrivateData, OldCoreData); 
... 
// 
// Call PEIM dispatcher 
// 
PeiDispatcher (SecCoreData, &PrivateData);; 
... 
// 
// Lookup DXE IPL PPI 
// 
Status = PeiServicesLocatePpi ( 
             &gEfiDxeIplPpiGuid, 
             0, 
             NULL, 
             (VOID **)&TempPtr.DxeIpl 
             ); 
  ASSERT_EFI_ERROR (Status); 
// 
// Enter DxeIpl to load Dxe core. 
// 
Status = TempPtr.DxeIpl->Entry ( 
                             TempPtr.DxeIpl, 
                             &PrivateData.Ps, 
                             PrivateData.HobList 
                             ); 
} | 
PEI dispatch最後一個PEIM (DxeIplPeim),其功用就是將控制權交給DXE phase, 同時也會install EFI_END_OF_PEI_PPI 
| 
VOID HandOffToDxeCore ( IN EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint, IN EFI_PEI_HOB_POINTERS HobList ) { ... // // Transfer the control to the entry point of DxeCore. // SwitchStack ( (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint, HobList.Raw, NULL, TopOfStack ); } | 
●  DXE 的進入點
| 
VOID EFIAPI DxeMain ( IN VOID *HobStart //Pointer to the beginning of the HOB List from PEI. ) { } | 


 
沒有留言:
張貼留言