Only look for the RDSP in the appropriate EFI system table.
We don't support mixed-mode boot, so we will never find a 32-bit EFI system table when running from a 64-bit binary.
This commit is contained in:
parent
80bb3f452d
commit
faab0a321d
29
system/smp.c
29
system/smp.c
|
@ -491,9 +491,10 @@ static bool parse_madt(uintptr_t addr)
|
|||
return true;
|
||||
}
|
||||
|
||||
static rsdp_t *find_rsdp_in_efi32_system_table(efi32_system_table_t *system_table)
|
||||
#ifdef __x86_64__
|
||||
static rsdp_t *find_rsdp_in_efi64_system_table(efi64_system_table_t *system_table)
|
||||
{
|
||||
efi32_config_table_t *config_tables = (efi32_config_table_t *)map_region(system_table->config_tables, system_table->num_config_tables * sizeof(efi32_config_table_t), true);
|
||||
efi64_config_table_t *config_tables = (efi64_config_table_t *)map_region(system_table->config_tables, system_table->num_config_tables * sizeof(efi64_config_table_t), true);
|
||||
if (config_tables == NULL) return NULL;
|
||||
|
||||
uintptr_t table_addr = 0;
|
||||
|
@ -508,11 +509,10 @@ static rsdp_t *find_rsdp_in_efi32_system_table(efi32_system_table_t *system_tabl
|
|||
}
|
||||
return (rsdp_t *)table_addr;
|
||||
}
|
||||
|
||||
#ifdef __x86_64__
|
||||
static rsdp_t *find_rsdp_in_efi64_system_table(efi64_system_table_t *system_table)
|
||||
#else
|
||||
static rsdp_t *find_rsdp_in_efi32_system_table(efi32_system_table_t *system_table)
|
||||
{
|
||||
efi64_config_table_t *config_tables = (efi64_config_table_t *)map_region(system_table->config_tables, system_table->num_config_tables * sizeof(efi64_config_table_t), true);
|
||||
efi32_config_table_t *config_tables = (efi32_config_table_t *)map_region(system_table->config_tables, system_table->num_config_tables * sizeof(efi32_config_table_t), true);
|
||||
if (config_tables == NULL) return NULL;
|
||||
|
||||
uintptr_t table_addr = 0;
|
||||
|
@ -537,15 +537,8 @@ static bool find_cpus_in_rsdp(void)
|
|||
|
||||
// Search for the RSDP
|
||||
rsdp_t *rp = NULL;
|
||||
if (efi_info->loader_signature == EFI32_LOADER_SIGNATURE) {
|
||||
uintptr_t system_table_addr = map_region(efi_info->sys_tab, sizeof(efi32_system_table_t), true);
|
||||
if (system_table_addr != 0) {
|
||||
rp = find_rsdp_in_efi32_system_table((efi32_system_table_t *)system_table_addr);
|
||||
if (rp) rsdp_source = "EFI32 system table";
|
||||
}
|
||||
}
|
||||
#ifdef __x86_64__
|
||||
if (rp == NULL && efi_info->loader_signature == EFI64_LOADER_SIGNATURE) {
|
||||
if (efi_info->loader_signature == EFI64_LOADER_SIGNATURE) {
|
||||
uintptr_t system_table_addr = (uintptr_t)efi_info->sys_tab_hi << 32 | (uintptr_t)efi_info->sys_tab;
|
||||
system_table_addr = map_region(system_table_addr, sizeof(efi64_system_table_t), true);
|
||||
if (system_table_addr != 0) {
|
||||
|
@ -553,6 +546,14 @@ static bool find_cpus_in_rsdp(void)
|
|||
if (rp) rsdp_source = "EFI64 system table";
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (efi_info->loader_signature == EFI32_LOADER_SIGNATURE) {
|
||||
uintptr_t system_table_addr = map_region(efi_info->sys_tab, sizeof(efi32_system_table_t), true);
|
||||
if (system_table_addr != 0) {
|
||||
rp = find_rsdp_in_efi32_system_table((efi32_system_table_t *)system_table_addr);
|
||||
if (rp) rsdp_source = "EFI32 system table";
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (rp == NULL) {
|
||||
// Search the BIOS EBDA area.
|
||||
|
|
Loading…
Reference in New Issue