Step to UEFI (257)DxeIpl S3Resume2Pei PEI 的终结

1
2
3
4
Loading PEIM 86D70125-BAA3-4296-A62F-602BEBBB9081
Loading PEIM at 0x00007ECF000 EntryPoint=0x00007ECF5A8 DxeIpl.efi
Install PPI: 1A36E4E7-FAB6-476A-8E75-695A0576FDD7
Install PPI: 0AE8CE5D-E448-4437-A8D7-EBF5F194F731

代码在\MdeModulePkg\Core\DxeIplPeim 中,模块入口是如下函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
  Entry point of DXE IPL PEIM.
 
  This function installs DXE IPL PPI.  It also reloads
  itself to memory on non-S3 resume boot path.
 
  @param  FileHandle  Handle of the file being invoked.
  @param  PeiServices Describes the list of possible PEI Services.
 
  @retval EFI_SUCESS  The entry point of DXE IPL PEIM executes successfully.
  @retval Others      Some error occurs during the execution of this function.
 
**/
EFI_STATUS
EFIAPI
PeimInitializeDxeIpl (
  IN       EFI_PEI_FILE_HANDLE  FileHandle,
  IN CONST EFI_PEI_SERVICES     **PeiServices
  )

1A36E4E7-FAB6-476A-8E75-695A0576FDD7 是 EFI_PEI_DECOMPRESS_PPI_GUID

0AE8CE5D-E448-4437-A8D7-EBF5F194F731 是EFI_DXE_IPL_PPI_GUID

1
2
3
Loading PEIM 89E549B0-7CFE-449D-9BA3-10D8B2312D71
Loading PEIM at 0x00007ECA000 EntryPoint=0x00007ECA5C8 S3Resume2Pei.efi
Install PPI: 6D582DBC-DB85-4514-8FCC-5ADF6227B147

代码在 \ueficpupkg\universal\acpi\s3resume2pei\中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
  Main entry for S3 Resume PEIM.
 
  This routine is to install EFI_PEI_S3_RESUME2_PPI.
 
  @param  FileHandle              Handle of the file being invoked.
  @param  PeiServices             Pointer to PEI Services table.
 
  @retval EFI_SUCCESS S3Resume Ppi is installed successfully.
 
**/
EFI_STATUS
EFIAPI
PeimS3ResumeEntryPoint (
  IN EFI_PEI_FILE_HANDLE       FileHandle,
  IN CONST EFI_PEI_SERVICES    **PeiServices
  )

动作是安装 EFI_PEI_S3_RESUME2_PPI_GUID  6D582DBC-DB85-4514-8FCC-5ADF6227B147 这个 PPI

当全部的 PEIM 都加载之后, \mdemodulepkg\core\pei\dispatcher\Dispatcher.c 会执行下面的代码,在第二个FV 中扫描查找 PEIM:

1
2
3
4
5
6
7
8
if (Private->CurrentPeimCount == 0) {
  //
  // When going through each FV, at first, search Apriori file to
  // reorder all PEIMs to ensure the PEIMs in Apriori file to get
  // dispatch at first.
  //
  DiscoverPeimsAndOrderWithApriori (Private, CoreFvHandle);
}

查找没有找到,输入如下:

1
DiscoverPeimsAndOrderWithApriori(): Found 0x0 PEI FFS files in the 1th FV

\mdemodulepkg\core\pei\peimain\PeiMain.c 中如下代码执行完毕,至此PEI 阶段就结束了。

1
2
3
4
//
// Call PEIM dispatcher
//
PeiDispatcher (SecCoreData, &PrivateData);

接下来查找 IPL PPI

1
2
3
4
5
6
7
8
9
10
//
// Lookup DXE IPL PPI
//
Status = PeiServicesLocatePpi (
           &gEfiDxeIplPpiGuid,
           0,
           NULL,
           (VOID **)&TempPtr.DxeIpl
           );
ASSERT_EFI_ERROR (Status);

通过这个 PPI 进入 DXE 阶段:

1
2
3
4
5
6
7
8
9
//
// Enter DxeIpl to load Dxe core.
//
DEBUG ((EFI_D_INFO, "DXE IPL Entry\n"));
Status = TempPtr.DxeIpl->Entry (
                           TempPtr.DxeIpl,
                           &PrivateData.Ps,
                           PrivateData.HobList
                           );

至此开始了新的阶段。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注