系统表 ConfigurationTable 之ACPI Table SmbiosTable

18 篇文章 0 订阅

在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就可以定位到该系统表入口

ApplicationUEFI shell下获取SMBIOSACPI 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;
}

DSDTRSDT都指向相同的表

XSDT表全称Extended Root System Description Table,它的作用于RSDT一样,区别在于两者包含的指针地址一个是32位的,一个是64位的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小菜鸟-BIOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值