Commit 201b5c01 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'efi-urgent-for-v5.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi

Pull EFI fixes from Ard Biesheuvel:

 - don't treat valid hartid U32_MAX as a failure return code (RISC-V)

 - avoid blocking query_variable_info() call when blocking is not
   allowed

* tag 'efi-urgent-for-v5.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi:
  efivars: Respect "block" flag in efivar_entry_set_safe()
  riscv/efi_stub: Fix get_boot_hartid_from_fdt() return value
parents 7e57714c 258dd902
...@@ -25,7 +25,7 @@ typedef void __noreturn (*jump_kernel_func)(unsigned int, unsigned long); ...@@ -25,7 +25,7 @@ typedef void __noreturn (*jump_kernel_func)(unsigned int, unsigned long);
static u32 hartid; static u32 hartid;
static u32 get_boot_hartid_from_fdt(void) static int get_boot_hartid_from_fdt(void)
{ {
const void *fdt; const void *fdt;
int chosen_node, len; int chosen_node, len;
...@@ -33,23 +33,26 @@ static u32 get_boot_hartid_from_fdt(void) ...@@ -33,23 +33,26 @@ static u32 get_boot_hartid_from_fdt(void)
fdt = get_efi_config_table(DEVICE_TREE_GUID); fdt = get_efi_config_table(DEVICE_TREE_GUID);
if (!fdt) if (!fdt)
return U32_MAX; return -EINVAL;
chosen_node = fdt_path_offset(fdt, "/chosen"); chosen_node = fdt_path_offset(fdt, "/chosen");
if (chosen_node < 0) if (chosen_node < 0)
return U32_MAX; return -EINVAL;
prop = fdt_getprop((void *)fdt, chosen_node, "boot-hartid", &len); prop = fdt_getprop((void *)fdt, chosen_node, "boot-hartid", &len);
if (!prop || len != sizeof(u32)) if (!prop || len != sizeof(u32))
return U32_MAX; return -EINVAL;
return fdt32_to_cpu(*prop); hartid = fdt32_to_cpu(*prop);
return 0;
} }
efi_status_t check_platform_features(void) efi_status_t check_platform_features(void)
{ {
hartid = get_boot_hartid_from_fdt(); int ret;
if (hartid == U32_MAX) {
ret = get_boot_hartid_from_fdt();
if (ret) {
efi_err("/chosen/boot-hartid missing or invalid!\n"); efi_err("/chosen/boot-hartid missing or invalid!\n");
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
......
...@@ -742,6 +742,7 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes, ...@@ -742,6 +742,7 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
{ {
const struct efivar_operations *ops; const struct efivar_operations *ops;
efi_status_t status; efi_status_t status;
unsigned long varsize;
if (!__efivars) if (!__efivars)
return -EINVAL; return -EINVAL;
...@@ -764,15 +765,17 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes, ...@@ -764,15 +765,17 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
return efivar_entry_set_nonblocking(name, vendor, attributes, return efivar_entry_set_nonblocking(name, vendor, attributes,
size, data); size, data);
varsize = size + ucs2_strsize(name, 1024);
if (!block) { if (!block) {
if (down_trylock(&efivars_lock)) if (down_trylock(&efivars_lock))
return -EBUSY; return -EBUSY;
status = check_var_size_nonblocking(attributes, varsize);
} else { } else {
if (down_interruptible(&efivars_lock)) if (down_interruptible(&efivars_lock))
return -EINTR; return -EINTR;
status = check_var_size(attributes, varsize);
} }
status = check_var_size(attributes, size + ucs2_strsize(name, 1024));
if (status != EFI_SUCCESS) { if (status != EFI_SUCCESS) {
up(&efivars_lock); up(&efivars_lock);
return -ENOSPC; return -ENOSPC;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment