On Thu, Mar 28, 2019 at 04:17:16AM +0000, Junichi Nomura wrote: >On 2019/03/27 10:48, bhe@xxxxxxxxxx wrote: >>>> So efi_get_rsdp_addr() needs to be refactored in such a way so that at >>>> least the loop towards the end gets carved out into a separate function >>>> - __efi_get_rsdp_addr() or so - which gets config_tables, nr_tables and >>>> size as arguments and finds the RSDP address in the kexec-ed kernel. >>> >>> You need to carve out the loop at the end and make it into a separate >>> __efi_get_rsdp_addr() function which gets the physical or the virtual >>> address. >> >> I guess Boris is suggesting code like below. Please correct me if I am >> wrong. >> >> static acpi_physical_address _efi_get_rsdp_addr(efi_config_table tbl, ...) >> { >> /* Get EFI tables from systab. */ >> for (i = 0; i < nr_tables; i++) { >> ... >> } >> return rsdp_addr; >> } >> >> static acpi_physical_address efi_get_rsdp_addr(void) >> { >> ... >> /* Get systab from boot params. */ >> ... >> /* Handle EFI bitness properly */ >> ... >> return _efi_get_rsdp_addr(); >> } >> >> >> static acpi_physical_address kexec_get_rsdp_addr(void) >> { >> if (!is_kexec_booted) >> return 0; >> >> efi_get_setup_data_addr(); >> ... >> /* Handle EFI bitness properly */ >> ... >> return _efi_get_rsdp_addr(); >> } > >I still don't get it... We still need systab for kexec case as well >to get nr_tables. Don't we? > >> acpi_physical_address get_rsdp_addr(void) >> { >> acpi_physical_address pa; >> >> pa = get_acpi_rsdp(); >> >> if (!pa) >> pa = boot_params->acpi_rsdp_addr; >> >> >> /** >> /*I think here we should check if it's kexec booted firstly. >> * Skip it if not kexec. this can avoid the wrong kexec virt >> * addr parsing./ >> if (!pa) >> pa = kexec_get_rdsp_addr(); <--- new function >> >> if (!pa) >> pa = efi_get_rsdp_addr(); >> > >Shouldn't t efi_get_rsdp_addr() check "is_kexec_booted" and exit >early so that it never tries to use virtual config_tables pointer >if for some unknown resason kexec_get_rsdp_addr() failed. In my understanding, in EFI issue, RSDP is from efi_get_rsdp_addr() or kexec_get_rdsp_addr()(only in kexec environment). So in these two functions only one can be excuted, so how about this: if (is_kexec_booted) pa = kexec_get_rdsp_addr(); <--- new function else pa = efi_get_rsdp_addr(); And also split the same code as _efi_get_rsdp_addr(). If there is something wrong in my understanding, please let me know. Thanks, Chao Fan > >Currently I check "is_kexec_booted" by subset of efi_get_setup_data_addr(). >Do you know a simpler way to check "is_kexec_booted"? > >> if (!pa) >> pa = bios_get_rsdp_addr(); >> >> return pa; >> } > >-- >Jun'ichi Nomura, NEC Corporation / NEC Solution Innovators, Ltd. > _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec