* for QueryVariableInfo() and SetVariable(), as these can be reached in NMI
* context through efi_pstore_write().
*/
-#ifndef efi_in_nmi
-#define efi_in_nmi() (0)
-#endif
/*
* As per commit ef68c8f87ed1 ("x86: Serialize EFI time accesses on rtc_lock"),
{
unsigned long flags;
efi_status_t status;
- bool __in_nmi = efi_in_nmi();
- if (!__in_nmi)
- spin_lock_irqsave(&efi_runtime_lock, flags);
+ spin_lock_irqsave(&efi_runtime_lock, flags);
+ status = efi_call_virt(set_variable, name, vendor, attr, data_size,
+ data);
+ spin_unlock_irqrestore(&efi_runtime_lock, flags);
+ return status;
+}
+
+static efi_status_t
+virt_efi_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,
+ u32 attr, unsigned long data_size,
+ void *data)
+{
+ unsigned long flags;
+ efi_status_t status;
+
+ if (!spin_trylock_irqsave(&efi_runtime_lock, flags))
+ return EFI_NOT_READY;
+
status = efi_call_virt(set_variable, name, vendor, attr, data_size,
data);
- if (!__in_nmi)
- spin_unlock_irqrestore(&efi_runtime_lock, flags);
+ spin_unlock_irqrestore(&efi_runtime_lock, flags);
return status;
}
+
static efi_status_t virt_efi_query_variable_info(u32 attr,
u64 *storage_space,
u64 *remaining_space,
{
unsigned long flags;
efi_status_t status;
- bool __in_nmi = efi_in_nmi();
if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
return EFI_UNSUPPORTED;
- if (!__in_nmi)
- spin_lock_irqsave(&efi_runtime_lock, flags);
+ spin_lock_irqsave(&efi_runtime_lock, flags);
status = efi_call_virt(query_variable_info, attr, storage_space,
remaining_space, max_variable_size);
- if (!__in_nmi)
- spin_unlock_irqrestore(&efi_runtime_lock, flags);
+ spin_unlock_irqrestore(&efi_runtime_lock, flags);
return status;
}
efi.get_variable = virt_efi_get_variable;
efi.get_next_variable = virt_efi_get_next_variable;
efi.set_variable = virt_efi_set_variable;
+ efi.set_variable_nonblocking = virt_efi_set_variable_nonblocking;
efi.get_next_high_mono_count = virt_efi_get_next_high_mono_count;
efi.reset_system = virt_efi_reset_system;
efi.query_variable_info = virt_efi_query_variable_info;