lkml.org 
[lkml]   [2022]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/sev] x86/compressed/acpi: Move EFI system table lookup to helper
    The following commit has been merged into the x86/sev branch of tip:

    Commit-ID: 58f3e6b71f42f99ab5d0ab26ddf6e7ee5631f5db
    Gitweb: https://git.kernel.org/tip/58f3e6b71f42f99ab5d0ab26ddf6e7ee5631f5db
    Author: Michael Roth <michael.roth@amd.com>
    AuthorDate: Thu, 24 Feb 2022 10:56:05 -06:00
    Committer: Borislav Petkov <bp@suse.de>
    CommitterDate: Wed, 06 Apr 2022 17:07:09 +02:00

    x86/compressed/acpi: Move EFI system table lookup to helper

    Future patches for SEV-SNP-validated CPUID will also require early
    parsing of the EFI configuration. Incrementally move the related
    code into a set of helpers that can be re-used for that purpose.

    Signed-off-by: Michael Roth <michael.roth@amd.com>
    Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Link: https://lore.kernel.org/r/20220307213356.2797205-26-brijesh.singh@amd.com
    ---
    arch/x86/boot/compressed/acpi.c | 21 +++++++--------------
    arch/x86/boot/compressed/efi.c | 29 +++++++++++++++++++++++++++++
    arch/x86/boot/compressed/misc.h | 6 ++++++
    3 files changed, 42 insertions(+), 14 deletions(-)

    diff --git a/arch/x86/boot/compressed/acpi.c b/arch/x86/boot/compressed/acpi.c
    index db6c561..58a3d3f 100644
    --- a/arch/x86/boot/compressed/acpi.c
    +++ b/arch/x86/boot/compressed/acpi.c
    @@ -105,7 +105,7 @@ static acpi_physical_address kexec_get_rsdp_addr(void)
    }

    /* Get systab from boot params. */
    - systab = (efi_system_table_64_t *) (ei->efi_systab | ((__u64)ei->efi_systab_hi << 32));
    + systab = (efi_system_table_64_t *)efi_get_system_table(boot_params);
    if (!systab)
    error("EFI system table not found in kexec boot_params.");

    @@ -118,9 +118,8 @@ static acpi_physical_address kexec_get_rsdp_addr(void) { return 0; }
    static acpi_physical_address efi_get_rsdp_addr(void)
    {
    #ifdef CONFIG_EFI
    - unsigned long systab, config_tables;
    + unsigned long systab_pa, config_tables;
    unsigned int nr_tables;
    - struct efi_info *ei;
    enum efi_type et;
    bool efi_64;

    @@ -132,24 +131,18 @@ static acpi_physical_address efi_get_rsdp_addr(void)
    else
    return 0;

    - /* Get systab from boot params. */
    - ei = &boot_params->efi_info;
    -#ifdef CONFIG_X86_64
    - systab = ei->efi_systab | ((__u64)ei->efi_systab_hi << 32);
    -#else
    - systab = ei->efi_systab;
    -#endif
    - if (!systab)
    - error("EFI system table not found.");
    + systab_pa = efi_get_system_table(boot_params);
    + if (!systab_pa)
    + error("EFI support advertised, but unable to locate system table.");

    /* Handle EFI bitness properly */
    if (efi_64) {
    - efi_system_table_64_t *stbl = (efi_system_table_64_t *)systab;
    + efi_system_table_64_t *stbl = (efi_system_table_64_t *)systab_pa;

    config_tables = stbl->tables;
    nr_tables = stbl->nr_tables;
    } else {
    - efi_system_table_32_t *stbl = (efi_system_table_32_t *)systab;
    + efi_system_table_32_t *stbl = (efi_system_table_32_t *)systab_pa;

    config_tables = stbl->tables;
    nr_tables = stbl->nr_tables;
    diff --git a/arch/x86/boot/compressed/efi.c b/arch/x86/boot/compressed/efi.c
    index bad0ce3..72a81ba 100644
    --- a/arch/x86/boot/compressed/efi.c
    +++ b/arch/x86/boot/compressed/efi.c
    @@ -48,3 +48,32 @@ enum efi_type efi_get_type(struct boot_params *bp)

    return et;
    }
    +
    +/**
    + * efi_get_system_table - Given a pointer to boot_params, retrieve the physical address
    + * of the EFI system table.
    + *
    + * @bp: pointer to boot_params
    + *
    + * Return: EFI system table address on success. On error, return 0.
    + */
    +unsigned long efi_get_system_table(struct boot_params *bp)
    +{
    + unsigned long sys_tbl_pa;
    + struct efi_info *ei;
    + enum efi_type et;
    +
    + /* Get systab from boot params. */
    + ei = &bp->efi_info;
    +#ifdef CONFIG_X86_64
    + sys_tbl_pa = ei->efi_systab | ((__u64)ei->efi_systab_hi << 32);
    +#else
    + sys_tbl_pa = ei->efi_systab;
    +#endif
    + if (!sys_tbl_pa) {
    + debug_putstr("EFI system table not found.");
    + return 0;
    + }
    +
    + return sys_tbl_pa;
    +}
    diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h
    index fede1af..b2acd3a 100644
    --- a/arch/x86/boot/compressed/misc.h
    +++ b/arch/x86/boot/compressed/misc.h
    @@ -185,11 +185,17 @@ enum efi_type {
    #ifdef CONFIG_EFI
    /* helpers for early EFI config table access */
    enum efi_type efi_get_type(struct boot_params *bp);
    +unsigned long efi_get_system_table(struct boot_params *bp);
    #else
    static inline enum efi_type efi_get_type(struct boot_params *bp)
    {
    return EFI_TYPE_NONE;
    }
    +
    +static inline unsigned long efi_get_system_table(struct boot_params *bp)
    +{
    + return 0;
    +}
    #endif /* CONFIG_EFI */

    #endif /* BOOT_COMPRESSED_MISC_H */
    \
     
     \ /
      Last update: 2022-04-08 11:14    [W:3.857 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site