|
@@ -149,13 +149,14 @@ const char *__efi_nesting_dec(void)
|
|
|
* For the SignalEvent service see efi_signal_event_ext.
|
|
|
*
|
|
|
* @event event to signal
|
|
|
+ * @check_tpl check the TPL level
|
|
|
*/
|
|
|
-void efi_signal_event(struct efi_event *event)
|
|
|
+void efi_signal_event(struct efi_event *event, bool check_tpl)
|
|
|
{
|
|
|
if (event->notify_function) {
|
|
|
event->is_queued = true;
|
|
|
/* Check TPL */
|
|
|
- if (efi_tpl >= event->notify_tpl)
|
|
|
+ if (check_tpl && efi_tpl >= event->notify_tpl)
|
|
|
return;
|
|
|
EFI_CALL_VOID(event->notify_function(event,
|
|
|
event->notify_context));
|
|
@@ -565,7 +566,7 @@ void efi_timer_check(void)
|
|
|
if (!efi_events[i].type)
|
|
|
continue;
|
|
|
if (efi_events[i].is_queued)
|
|
|
- efi_signal_event(&efi_events[i]);
|
|
|
+ efi_signal_event(&efi_events[i], true);
|
|
|
if (!(efi_events[i].type & EVT_TIMER) ||
|
|
|
now < efi_events[i].trigger_next)
|
|
|
continue;
|
|
@@ -581,7 +582,7 @@ void efi_timer_check(void)
|
|
|
continue;
|
|
|
}
|
|
|
efi_events[i].is_signaled = true;
|
|
|
- efi_signal_event(&efi_events[i]);
|
|
|
+ efi_signal_event(&efi_events[i], true);
|
|
|
}
|
|
|
WATCHDOG_RESET();
|
|
|
}
|
|
@@ -690,7 +691,7 @@ known_event:
|
|
|
if (!event[i]->type || event[i]->type & EVT_NOTIFY_SIGNAL)
|
|
|
return EFI_EXIT(EFI_INVALID_PARAMETER);
|
|
|
if (!event[i]->is_signaled)
|
|
|
- efi_signal_event(event[i]);
|
|
|
+ efi_signal_event(event[i], true);
|
|
|
}
|
|
|
|
|
|
/* Wait for signal */
|
|
@@ -740,7 +741,7 @@ static efi_status_t EFIAPI efi_signal_event_ext(struct efi_event *event)
|
|
|
break;
|
|
|
event->is_signaled = true;
|
|
|
if (event->type & EVT_NOTIFY_SIGNAL)
|
|
|
- efi_signal_event(event);
|
|
|
+ efi_signal_event(event, true);
|
|
|
break;
|
|
|
}
|
|
|
return EFI_EXIT(EFI_SUCCESS);
|
|
@@ -797,7 +798,7 @@ static efi_status_t EFIAPI efi_check_event(struct efi_event *event)
|
|
|
if (!event->type || event->type & EVT_NOTIFY_SIGNAL)
|
|
|
break;
|
|
|
if (!event->is_signaled)
|
|
|
- efi_signal_event(event);
|
|
|
+ efi_signal_event(event, true);
|
|
|
if (event->is_signaled)
|
|
|
return EFI_EXIT(EFI_SUCCESS);
|
|
|
return EFI_EXIT(EFI_NOT_READY);
|