在UEFI中,系统表(Configuration Table)是一个包含系统配置信息的数据结构,其中包含了各种系统信息和表格(Tables)。其中,ACPI(高级配置与电源接口)表和SMBIOS(系统管理BIOS)表是两个重要的系统表,用于描述系统的硬件配置和特性。
EFI_CONFIGURATION_TABLE *ConfigurationTable;
EFI_SYSTEM_TABLE;
Status = EfiGetSystemConfigurationTable (
&gEfiSmbiosTableGuid,
(VOID **)&SmbiosTable
);
Status = EfiGetSystemConfigurationTable (
&gEfiAcpi20TableGuid,
&Rsdp
);
UEFI _Spec中对于系统表有标准的Guid,在System Table中通过匹配Guid就可以定位到该系统表入口


Application在UEFI shell下获取SMBIOS和ACPI Table的信息:
ACPI表获取
EFI_STATUS
EFIAPI
UefiMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
SMBIOS_TABLE_ENTRY_POINT *SmbiosTable;
SMBIOS_TABLE_3_0_ENTRY_POINT *Smbios3Table;
EFI_ACPI_4_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;
UINT64 address;
UINT8 value;
UINT8 count;
EFI_ACPI_DESCRIPTION_HEADER *Xsdt;
EFI_ACPI_DESCRIPTION_HEADER *Rsdt;
UINT64 *XTableAddress;
UINT32 *RTableAddress;
UINTN TableCount;
EFI_ACPI_DESCRIPTION_HEADER *Hdr;
CHAR8 SignatureStr[5];
Status = EfiGetSystemConfigurationTable (
&gEfiSmbiosTableGuid,
(VOID **)&SmbiosTable
);
Print (L"SmbiosTable status: %r\r\n", Status);
if (!EFI_ERROR (Status)) {
Print (L"MajorVersion :%x MinorVersion:%x\r\n", SmbiosTable->MajorVersion,SmbiosTable->MinorVersion);
Print (L"SmbiosTable TableAddress: %x\r\n", SmbiosTable->TableAddress);address=SmbiosTable->TableAddress;
count=0;
for(UINT64 index=0;index<0x1ff;index++)
{
value= Mmioread8(address+index);
DEBUG ((DEBUG_ERROR, "%x ", value));
count++;
if(count==16)
{
count=0;
DEBUG ((DEBUG_ERROR, "\n ", value));
}
}
}
Status = EfiGetSystemConfigurationTable (
&gEfiSmbios3TableGuid,
(VOID **)&Smbios3Table
);
Print (L"Smbios3Table status: %r\r\n", Status);
if (!EFI_ERROR (Status)) {
Print (L"MajorVersion :%x MinorVersion:%x\r\n", Smbios3Table->MajorVersion,Smbios3Table->MinorVersion);
Print (L"Smbios3Table TableAddress: %x\r\n", Smbios3Table->TableAddress);address=Smbios3Table->TableAddress;
count=0;
for(UINT64 index=0;index<0x1ff;index++)
{
value= Mmioread8(address+index);
DEBUG ((DEBUG_ERROR, "%x ", value));
count++;
if(count==16)
{
count=0;
DEBUG ((DEBUG_ERROR, "\n ", value));
}
}
}
Status = EfiGetSystemConfigurationTable (
&gEfiAcpi20TableGuid,
&Rsdp
);
Print (L"gEfiAcpi20TableGuid status: %r\r\n", Status);
Print (L"gEfiAcpi20TableGuid RsdtAddress : %lx\r\n", Rsdp->RsdtAddress);
Print (L"gEfiAcpi20TableGuid XsdtAddress: %lx\r\n", Rsdp->XsdtAddress);
Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->XsdtAddress;
Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->RsdtAddress;
//Print (L"Xsdt->Length : %x\r\n", Xsdt->Length);
//Print (L"Rsdt->Length : %x\r\n", Rsdt->Length);
DEBUG ((DEBUG_ERROR,"Xsdt->Length: %lx\r", Xsdt->Length));
DEBUG ((DEBUG_ERROR,"Rsdt->Length: %lx\r", Rsdt->Length));
TableCount = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER))/sizeof(UINT64);
XTableAddress = (UINT64 *)(Xsdt + 1);
DEBUG((DEBUG_ERROR, "Xsdt Acpi Count: %x, XsdtAddress: %lx\n", TableCount, Rsdp->XsdtAddress));
for (UINT8 Index = 0; Index < TableCount; Index++) {
Hdr = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)XTableAddress[Index];
SignatureStr[3] = (CHAR8)((Hdr->Signature >> 24) & 0xFF);
SignatureStr[2] = (CHAR8)((Hdr->Signature >> 16) & 0xFF);
SignatureStr[1] = (CHAR8)((Hdr->Signature >> 8) & 0xFF);
SignatureStr[0] = (CHAR8)(Hdr->Signature & 0xFF);
SignatureStr[4] = '\0'; // Null-terminate the string
DEBUG ((DEBUG_ERROR,"Table Signature: %a\n", SignatureStr));
DEBUG ((DEBUG_ERROR," XTableAddress: %lx\n", (UINTN)XTableAddress[Index]));
}
TableCount = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) /sizeof (UINT32);
RTableAddress = (UINT32 *)(Rsdt + 1);
DEBUG((DEBUG_ERROR, "Rsdp Acpi Count: %x, RsdtAddress: %lx\n", TableCount, Rsdp->RsdtAddress));
for (UINT8 Index = 0; Index < TableCount; Index++) {
Hdr = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)RTableAddress[Index];
SignatureStr[3] = (CHAR8)((Hdr->Signature >> 24) & 0xFF);
SignatureStr[2] = (CHAR8)((Hdr->Signature >> 16) & 0xFF);
SignatureStr[1] = (CHAR8)((Hdr->Signature >> 8) & 0xFF);
SignatureStr[0] = (CHAR8)(Hdr->Signature & 0xFF);
SignatureStr[4] = '\0'; // Null-terminate the string
DEBUG ((DEBUG_ERROR,"Table Signature: %a\n", SignatureStr));
DEBUG ((DEBUG_ERROR," RTableAddress: %lx\n", (UINTN)RTableAddress[Index]));
}
Status = EfiGetSystemConfigurationTable (
&gEfiAcpi10TableGuid,
&Rsdp
);
Print (L"gEfiAcpi10TableGuid status: %r\r\n", Status);
Print (L"gEfiAcpi10TableGuid RsdtAddress: %lx\r\n", Rsdp->RsdtAddress);
Print (L"gEfiAcpi10TableGuid XsdtAddress: %lx\r\n", Rsdp->XsdtAddress);
return Status;
}
DSDT和RSDT都指向相同的表
XSDT表全称Extended Root System Description Table,它的作用于RSDT一样,区别在于两者包含的指针地址一个是32位的,一个是64位的。


425

被折叠的 条评论
为什么被折叠?



