efi_loader: add check_tpl parameter to efi_signal_event
In ExitBootServices we need to signal events irrespective of the current TPL level. A new parameter check_tpl is added to efi_signal_event(). Function efi_console_timer_notify() gets some comments. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
65436f91c5
commit
9bc9664d5e
@ -240,7 +240,7 @@ efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
|
||||
efi_status_t efi_set_timer(struct efi_event *event, enum efi_timer_delay type,
|
||||
uint64_t trigger_time);
|
||||
/* Call this to signal an event */
|
||||
void efi_signal_event(struct efi_event *event);
|
||||
void efi_signal_event(struct efi_event *event, bool check_tpl);
|
||||
|
||||
/* open file system: */
|
||||
struct efi_simple_file_system_protocol *efi_simple_file_system(
|
||||
|
@ -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);
|
||||
|
@ -482,18 +482,26 @@ static void EFIAPI efi_key_notify(struct efi_event *event, void *context)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Notification function of the console timer event.
|
||||
*
|
||||
* event: console timer event
|
||||
* context: not used
|
||||
*/
|
||||
static void EFIAPI efi_console_timer_notify(struct efi_event *event,
|
||||
void *context)
|
||||
{
|
||||
EFI_ENTRY("%p, %p", event, context);
|
||||
|
||||
/* Check if input is available */
|
||||
if (tstc()) {
|
||||
/* Queue the wait for key event */
|
||||
efi_con_in.wait_for_key->is_signaled = true;
|
||||
efi_signal_event(efi_con_in.wait_for_key);
|
||||
}
|
||||
efi_signal_event(efi_con_in.wait_for_key, true);
|
||||
}
|
||||
EFI_EXIT(EFI_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
/* This gets called from do_bootefi_exec(). */
|
||||
int efi_console_register(void)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user