kernel中efi变量初始化

在setup_arch->efi_init->uefi_init->efi_config_parse_tables
int __init efi_config_parse_tables(void *config_tables, int count, int sz,
                   efi_config_table_type_t *arch_tables)
{
    void *tablep;
    int i;

    tablep = config_tables;
    pr_info("");
    for (i = 0; i < count; i++) {
        efi_guid_t guid;
        unsigned long table;

        if (efi_enabled(EFI_64BIT)) {
            u64 table64;
            guid = ((efi_config_table_64_t *)tablep)->guid;
            table64 = ((efi_config_table_64_t *)tablep)->table;
            table = table64;
#ifndef CONFIG_64BIT
            if (table64 >> 32) {
                pr_cont("\n");
                pr_err("Table located above 4GB, disabling EFI.\n");
                return -EINVAL;
            }
#endif
        } else {
            guid = ((efi_config_table_32_t *)tablep)->guid;
            table = ((efi_config_table_32_t *)tablep)->table;
        }

        if (!match_config_table(&guid, table, common_tables))
            match_config_table(&guid, table, arch_tables);

        tablep += sz;
    }
    pr_cont("\n");
    set_bit(EFI_CONFIG_TABLES, &efi.flags);

    /* Parse the EFI Properties table if it exists */
    if (efi.properties_table != EFI_INVALID_TABLE_ADDR) {
        efi_properties_table_t *tbl;

        tbl = early_memremap(efi.properties_table, sizeof(*tbl));
        if (tbl == NULL) {
            pr_err("Could not map Properties table!\n");
            return -ENOMEM;
        }

        if (tbl->memory_protection_attribute &
            EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA)
            set_bit(EFI_NX_PE_DATA, &efi.flags);

        early_memunmap(tbl, sizeof(*tbl));
    }

    return 0;
}
在efi_config_parse_tables 中会对common_tables 中的ptr赋值,这样我们就能在kernel中使用common_tables 中的指针
static __initdata efi_config_table_type_t common_tables[] = {
    {ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20},
    {ACPI_TABLE_GUID, "ACPI", &efi.acpi},
    {HCDP_TABLE_GUID, "HCDP", &efi.hcdp},
    {MPS_TABLE_GUID, "MPS", &efi.mps},
    {SAL_SYSTEM_TABLE_GUID, "SALsystab", &efi.sal_systab},
    {SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
    {SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
    {UGA_IO_PROTOCOL_GUID, "UGA", &efi.uga},
    {EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
    {EFI_PROPERTIES_TABLE_GUID, "PROP", &efi.properties_table},
    {EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi.mem_attr_table},
    {NULL_GUID, NULL, NULL},
};
具体是在在efi_config_parse_tables中的下面code中赋值.
if (!match_config_table(&guid, table, common_tables))
            match_config_table(&guid, table, arch_tables);
同时会设定EFI_CONFIG_TABLES 这个flag。set_bit(EFI_CONFIG_TABLES, &efi.flags);
如果uefi中有Properties table 的话,会设定set_bit(EFI_NX_PE_DATA, &efi.flags);
最后补充一下,在match_config_table 中是根据guid 来找对应的table的.
static __init int match_config_table(efi_guid_t *guid,
                     unsigned long table,
                     efi_config_table_type_t *table_types)
{
    int i;

    if (table_types) {
        for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) {
            if (!efi_guidcmp(*guid, table_types[i].guid)) {
                *(table_types[i].ptr) = table;
                if (table_types[i].name)
                    pr_cont(" %s=0x%lx ",
                        table_types[i].name, table);
                return 1;
            }
        }
    }

    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值