diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/platform/efi/efi.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 5f2ecaf3f9d8..c89c245eff40 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
@@ -999,3 +999,28 @@ u64 efi_mem_attributes(unsigned long phys_addr) | |||
999 | } | 999 | } |
1000 | return 0; | 1000 | return 0; |
1001 | } | 1001 | } |
1002 | |||
1003 | /* | ||
1004 | * Some firmware has serious problems when using more than 50% of the EFI | ||
1005 | * variable store, i.e. it triggers bugs that can brick machines. Ensure that | ||
1006 | * we never use more than this safe limit. | ||
1007 | * | ||
1008 | * Return EFI_SUCCESS if it is safe to write 'size' bytes to the variable | ||
1009 | * store. | ||
1010 | */ | ||
1011 | efi_status_t efi_query_variable_store(u32 attributes, unsigned long size) | ||
1012 | { | ||
1013 | efi_status_t status; | ||
1014 | u64 storage_size, remaining_size, max_size; | ||
1015 | |||
1016 | status = efi.query_variable_info(attributes, &storage_size, | ||
1017 | &remaining_size, &max_size); | ||
1018 | if (status != EFI_SUCCESS) | ||
1019 | return status; | ||
1020 | |||
1021 | if (!storage_size || size > remaining_size || size > max_size || | ||
1022 | (remaining_size - size) < (storage_size / 2)) | ||
1023 | return EFI_OUT_OF_RESOURCES; | ||
1024 | |||
1025 | return EFI_SUCCESS; | ||
1026 | } | ||