diff options
author | Matt Fleming <matt.fleming@intel.com> | 2013-03-25 09:14:30 +0000 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2013-05-30 14:35:10 +0100 |
commit | 649aeb46c8ff0aa527e73e8f847f9895c835d8cb (patch) | |
tree | 4bdd4889b47d469fd6fa6cf7a017b353bc3b0497 /drivers | |
parent | 9c4254fbab06989a943eb5633cf6dd1bd6b79d6b (diff) |
x86, efivars: firmware bug workarounds should be in platform code
commit a6e4d5a03e9e3587e88aba687d8f225f4f04c792 upstream.
Let's not burden ia64 with checks in the common efivars code that we're not
writing too much data to the variable store. That kind of thing is an x86
firmware bug, plain and simple.
efi_query_variable_store() provides platforms with a wrapper in which they can
perform checks and workarounds for EFI variable storage bugs.
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Matthew Garrett <mjg59@srcf.ucam.org>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
[bwh: Backported to 3.2: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/firmware/efivars.c | 18 |
1 files changed, 3 insertions, 15 deletions
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c index b15c0aa4099..2a64e6984b9 100644 --- a/drivers/firmware/efivars.c +++ b/drivers/firmware/efivars.c @@ -425,24 +425,12 @@ static efi_status_t check_var_size_locked(struct efivars *efivars, u32 attributes, unsigned long size) { - u64 storage_size, remaining_size, max_size; - efi_status_t status; const struct efivar_operations *fops = efivars->ops; - if (!efivars->ops->query_variable_info) + if (!efivars->ops->query_variable_store) return EFI_UNSUPPORTED; - status = fops->query_variable_info(attributes, &storage_size, - &remaining_size, &max_size); - - if (status != EFI_SUCCESS) - return status; - - if (!storage_size || size > remaining_size || size > max_size || - (remaining_size - size) < (storage_size / 2)) - return EFI_OUT_OF_RESOURCES; - - return status; + return fops->query_variable_store(attributes, size); } static ssize_t @@ -1456,7 +1444,7 @@ efivars_init(void) ops.get_variable = efi.get_variable; ops.set_variable = efi.set_variable; ops.get_next_variable = efi.get_next_variable; - ops.query_variable_info = efi.query_variable_info; + ops.query_variable_store = efi_query_variable_store; error = register_efivars(&__efivars, &ops, efi_kobj); if (error) goto err_put; |