Skip to content

Commit

Permalink
efi: Use more granular check for availability for variable services
Browse files Browse the repository at this point in the history
The UEFI spec rev 2.8 permits firmware implementations to support only
a subset of EFI runtime services at OS runtime (i.e., after the call to
ExitBootServices()), so let's take this into account in the drivers that
rely specifically on the availability of the EFI variable services.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
  • Loading branch information
Ard Biesheuvel committed Feb 23, 2020
1 parent fe4db90 commit bf67fad
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 23 deletions.
2 changes: 1 addition & 1 deletion drivers/firmware/efi/efi-pstore.c
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ static struct pstore_info efi_pstore_info = {

static __init int efivars_pstore_init(void)
{
if (!efi_enabled(EFI_RUNTIME_SERVICES))
if (!efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
return 0;

if (!efivars_kobject())
Expand Down
28 changes: 8 additions & 20 deletions drivers/firmware/efi/efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,12 +328,13 @@ static int __init efisubsys_init(void)
return -ENOMEM;
}

error = generic_ops_register();
if (error)
goto err_put;

if (efi_enabled(EFI_RUNTIME_SERVICES))
if (efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES)) {
efivar_ssdt_load();
error = generic_ops_register();
if (error)
goto err_put;
platform_device_register_simple("efivars", 0, NULL, 0);
}

error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group);
if (error) {
Expand All @@ -358,7 +359,8 @@ static int __init efisubsys_init(void)
err_remove_group:
sysfs_remove_group(efi_kobj, &efi_subsys_attr_group);
err_unregister:
generic_ops_unregister();
if (efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
generic_ops_unregister();
err_put:
kobject_put(efi_kobj);
return error;
Expand Down Expand Up @@ -650,20 +652,6 @@ void __init efi_systab_report_header(const efi_table_hdr_t *systab_hdr,
vendor);
}

#ifdef CONFIG_EFI_VARS_MODULE
static int __init efi_load_efivars(void)
{
struct platform_device *pdev;

if (!efi_enabled(EFI_RUNTIME_SERVICES))
return 0;

pdev = platform_device_register_simple("efivars", 0, NULL, 0);
return PTR_ERR_OR_ZERO(pdev);
}
device_initcall(efi_load_efivars);
#endif

static __initdata char memory_type_name[][20] = {
"Reserved",
"Loader Code",
Expand Down
2 changes: 1 addition & 1 deletion drivers/firmware/efi/efivars.c
Original file line number Diff line number Diff line change
Expand Up @@ -664,7 +664,7 @@ int efivars_sysfs_init(void)
struct kobject *parent_kobj = efivars_kobject();
int error = 0;

if (!efi_enabled(EFI_RUNTIME_SERVICES))
if (!efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
return -ENODEV;

/* No efivars has been registered yet */
Expand Down
2 changes: 1 addition & 1 deletion fs/efivarfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ static struct file_system_type efivarfs_type = {

static __init int efivarfs_init(void)
{
if (!efi_enabled(EFI_RUNTIME_SERVICES))
if (!efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
return -ENODEV;

if (!efivars_kobject())
Expand Down

0 comments on commit bf67fad

Please sign in to comment.