前文提到PEI阶段加载了7个模块,从Log 中的如下字样,我们知道当前跳入了 PcdPeim.efi 运行
1 | Loading PEIM at 0x0000083D120 EntryPoint=0x0000083D620 PcdPeim.efi |
执行输出的 Log 如下:
1 2 3 4 5 | Install PPI: 06E81C58-4AD7-44BC-8390-F10265F72480 Install PPI: 01F34D25-4DE2-23AD-3FF3-36353FF323F1 Install PPI: 4D8B155B-C059-4C8F-8926-06FD4331DB8A Install PPI: A60C6B59-E459-425D-9C69-0BCC9CB27D81 Register PPI Notify: 605EA650-C65C-42E1-BA80-91A52AB618C6 |
其中的 GUID 可以在 \MdePkg\MdePkg.dec 中查到:
1 2 3 4 5 6 7 8 | ## Include/Ppi/Pcd.h gPcdPpiGuid = { 0x6e81c58, 0x4ad7, 0x44bc, { 0x83, 0x90, 0xf1, 0x2, 0x65, 0xf7, 0x24, 0x80 } } ## Include/Ppi/PiPcd.h gEfiPeiPcdPpiGuid = { 0x1f34d25, 0x4de2, 0x23ad, { 0x3f, 0xf3, 0x36, 0x35, 0x3f, 0xf3, 0x23, 0xf1 } } ## Include/Ppi/PcdInfo.h gGetPcdInfoPpiGuid = { 0x4d8b155b, 0xc059, 0x4c8f, { 0x89, 0x26, 0x6, 0xfd, 0x43, 0x31, 0xdb, 0x8a } } ## Include/Ppi/PiPcdInfo.h gEfiGetPcdInfoPpiGuid = { 0xa60c6b59, 0xe459, 0x425d, { 0x9c, 0x69, 0xb, 0xcc, 0x9c, 0xb2, 0x7d, 0x81 } } |
最后的一个 PPI Notify 定义为:
1 2 | ## Include/Ppi/EndOfPeiPhase.h gEfiEndOfPeiSignalPpiGuid = {0x605EA650, 0xC65C, 0x42e1, {0xBA, 0x80, 0x91, 0xA5, 0x2A, 0xB6, 0x18, 0xC6 } } |
继代码位于 MdeModulePkg\Universal\PCD\Pei\Pcd.c 中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /** Main entry for PCD PEIM driver. This routine initialize the PCD database for PEI phase and install PCD_PPI/EFI_PEI_PCD_PPI. @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. @return Status of install PCD_PPI **/ EFI_STATUS EFIAPI PcdPeimInit ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) |
从代码上看,QEMU 模拟了 SPI ROM,使可以看到,这个 PEI Module 主要作用是注册了多个和PCD 相关的 Ppi Service 以便后续使用。
qemu如果能加载编译好的BIOS ROM就好了;说不定可以验证一些code
Chipset 方面的寄存器差别很大,没有通用的。