diff --git a/system/smp.c b/system/smp.c index 26d4689..8c34d67 100644 --- a/system/smp.c +++ b/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.