mirror of
https://xff.cz/git/u-boot/
synced 2025-09-29 22:41:17 +02:00
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:
committed by
Alexander Graf
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,
|
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)
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
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:
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user