提交 9bc9664d 编写于 作者: H Heinrich Schuchardt 提交者: Alexander Graf

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: NHeinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: NAlexander Graf <agraf@suse.de>
上级 65436f91
...@@ -240,7 +240,7 @@ efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl, ...@@ -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, efi_status_t efi_set_timer(struct efi_event *event, enum efi_timer_delay type,
uint64_t trigger_time); uint64_t trigger_time);
/* Call this to signal an event */ /* 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: */ /* open file system: */
struct efi_simple_file_system_protocol *efi_simple_file_system( struct efi_simple_file_system_protocol *efi_simple_file_system(
......
...@@ -149,13 +149,14 @@ const char *__efi_nesting_dec(void) ...@@ -149,13 +149,14 @@ const char *__efi_nesting_dec(void)
* For the SignalEvent service see efi_signal_event_ext. * For the SignalEvent service see efi_signal_event_ext.
* *
* @event event to signal * @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) { if (event->notify_function) {
event->is_queued = true; event->is_queued = true;
/* Check TPL */ /* Check TPL */
if (efi_tpl >= event->notify_tpl) if (check_tpl && efi_tpl >= event->notify_tpl)
return; return;
EFI_CALL_VOID(event->notify_function(event, EFI_CALL_VOID(event->notify_function(event,
event->notify_context)); event->notify_context));
...@@ -565,7 +566,7 @@ void efi_timer_check(void) ...@@ -565,7 +566,7 @@ void efi_timer_check(void)
if (!efi_events[i].type) if (!efi_events[i].type)
continue; continue;
if (efi_events[i].is_queued) 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) || if (!(efi_events[i].type & EVT_TIMER) ||
now < efi_events[i].trigger_next) now < efi_events[i].trigger_next)
continue; continue;
...@@ -581,7 +582,7 @@ void efi_timer_check(void) ...@@ -581,7 +582,7 @@ void efi_timer_check(void)
continue; continue;
} }
efi_events[i].is_signaled = true; efi_events[i].is_signaled = true;
efi_signal_event(&efi_events[i]); efi_signal_event(&efi_events[i], true);
} }
WATCHDOG_RESET(); WATCHDOG_RESET();
} }
...@@ -690,7 +691,7 @@ known_event: ...@@ -690,7 +691,7 @@ known_event:
if (!event[i]->type || event[i]->type & EVT_NOTIFY_SIGNAL) if (!event[i]->type || event[i]->type & EVT_NOTIFY_SIGNAL)
return EFI_EXIT(EFI_INVALID_PARAMETER); return EFI_EXIT(EFI_INVALID_PARAMETER);
if (!event[i]->is_signaled) if (!event[i]->is_signaled)
efi_signal_event(event[i]); efi_signal_event(event[i], true);
} }
/* Wait for signal */ /* Wait for signal */
...@@ -740,7 +741,7 @@ static efi_status_t EFIAPI efi_signal_event_ext(struct efi_event *event) ...@@ -740,7 +741,7 @@ static efi_status_t EFIAPI efi_signal_event_ext(struct efi_event *event)
break; break;
event->is_signaled = true; event->is_signaled = true;
if (event->type & EVT_NOTIFY_SIGNAL) if (event->type & EVT_NOTIFY_SIGNAL)
efi_signal_event(event); efi_signal_event(event, true);
break; break;
} }
return EFI_EXIT(EFI_SUCCESS); return EFI_EXIT(EFI_SUCCESS);
...@@ -797,7 +798,7 @@ static efi_status_t EFIAPI efi_check_event(struct efi_event *event) ...@@ -797,7 +798,7 @@ static efi_status_t EFIAPI efi_check_event(struct efi_event *event)
if (!event->type || event->type & EVT_NOTIFY_SIGNAL) if (!event->type || event->type & EVT_NOTIFY_SIGNAL)
break; break;
if (!event->is_signaled) if (!event->is_signaled)
efi_signal_event(event); efi_signal_event(event, true);
if (event->is_signaled) if (event->is_signaled)
return EFI_EXIT(EFI_SUCCESS); return EFI_EXIT(EFI_SUCCESS);
return EFI_EXIT(EFI_NOT_READY); return EFI_EXIT(EFI_NOT_READY);
......
...@@ -482,18 +482,26 @@ static void EFIAPI efi_key_notify(struct efi_event *event, void *context) ...@@ -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, static void EFIAPI efi_console_timer_notify(struct efi_event *event,
void *context) void *context)
{ {
EFI_ENTRY("%p, %p", event, context); EFI_ENTRY("%p, %p", event, context);
/* Check if input is available */
if (tstc()) { if (tstc()) {
/* Queue the wait for key event */
efi_con_in.wait_for_key->is_signaled = true; 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); EFI_EXIT(EFI_SUCCESS);
} }
/* This gets called from do_bootefi_exec(). */ /* This gets called from do_bootefi_exec(). */
int efi_console_register(void) int efi_console_register(void)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册