@ -13,20 +13,20 @@
static struct efi_event * event_notify ;
static struct efi_event * event_wait ;
static unsigned int counter ;
static unsigned int notification_ count;
static struct efi_boot_services * boottime ;
/*
* Notification function , increments a counter .
* Notification function , increments the notification count .
*
* @ event notified event
* @ context pointer to the counter
* @ context pointer to the notification count
*/
static void EFIAPI notify ( struct efi_event * event , void * context )
{
if ( ! context )
return ;
+ + * ( unsigned int * ) contex t;
unsigned int * count = context ;
+ + * coun t;
}
/*
@ -37,6 +37,7 @@ static void EFIAPI notify(struct efi_event *event, void *context)
*
* @ handle : handle of the loaded image
* @ systable : system table
* @ return : EFI_ST_SUCCESS for success
*/
static int setup ( const efi_handle_t handle ,
const struct efi_system_table * systable )
@ -46,25 +47,28 @@ static int setup(const efi_handle_t handle,
boottime = systable - > boottime ;
ret = boottime - > create_event ( EVT_TIMER | EVT_NOTIFY_SIGNAL ,
TPL_CALLBACK , notify , ( void * ) & counter ,
TPL_CALLBACK , notify ,
( void * ) & notification_count ,
& event_notify ) ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " could not create event \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
ret = boottime - > create_event ( EVT_TIMER | EVT_NOTIFY_WAIT ,
TPL_HIGH_LEVEL , notify , NULL , & event_wait ) ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " could not create event \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
return 0 ;
return EFI_ST_SUCCESS ;
}
/*
* Tear down unit test .
*
* Close the events created in setup .
*
* @ return : EFI_ST_SUCCESS for success
*/
static int teardown ( void )
{
@ -75,7 +79,7 @@ static int teardown(void)
event_notify = NULL ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " could not close event \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
}
if ( event_wait ) {
@ -83,11 +87,11 @@ static int teardown(void)
event_wait = NULL ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " could not close event \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
}
boottime - > restore_tpl ( TPL_APPLICATION ) ;
return 0 ;
return EFI_ST_SUCCESS ;
}
/*
@ -101,6 +105,8 @@ static int teardown(void)
*
* Lower the TPL level and check that the queued notification
* function is called .
*
* @ return : EFI_ST_SUCCESS for success
*/
static int execute ( void )
{
@ -109,100 +115,103 @@ static int execute(void)
UINTN old_tpl ;
/* Set 10 ms timer */
counter = 0 ;
notification_ count = 0 ;
ret = boottime - > set_timer ( event_notify , EFI_TIMER_PERIODIC , 100000 ) ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " Could not set timer \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
/* Set 100 ms timer */
ret = boottime - > set_timer ( event_wait , EFI_TIMER_RELATIVE , 1000000 ) ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " Could not set timer \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
index = 5 ;
ret = boottime - > wait_for_event ( 1 , & event_wait , & index ) ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " Could not wait for event \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
ret = boottime - > check_event ( event_wait ) ;
if ( ret ! = EFI_NOT_READY ) {
efi_st_error ( " Signaled state was not cleared. \n " ) ;
efi_st_printf ( " ret = %u \n " , ( unsigned int ) ret ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
if ( index ! = 0 ) {
efi_st_error ( " WaitForEvent returned wrong index \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
efi_st_printf ( " Counter with TPL level TPL_APPLICATION: %u \n " , counter ) ;
if ( counter < 8 | | counter > 12 ) {
efi_st_printf ( " Notification count with TPL level TPL_APPLICATION: %u \n " ,
notification_count ) ;
if ( notification_count < 8 | | notification_count > 12 ) {
efi_st_error ( " Incorrect timing of events \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
ret = boottime - > set_timer ( event_notify , EFI_TIMER_STOP , 0 ) ;
if ( index ! = 0 ) {
efi_st_error ( " Could not cancel timer \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
/* Raise TPL level */
old_tpl = boottime - > raise_tpl ( TPL_CALLBACK ) ;
if ( old_tpl ! = TPL_APPLICATION ) {
efi_st_error ( " Initial TPL level was not TPL_APPLICATION " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
/* Set 10 ms timer */
counter = 0 ;
notification_ count = 0 ;
ret = boottime - > set_timer ( event_notify , EFI_TIMER_PERIODIC , 100000 ) ;
if ( index ! = 0 ) {
efi_st_error ( " Could not set timer \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
/* Set 100 ms timer */
ret = boottime - > set_timer ( event_wait , EFI_TIMER_RELATIVE , 1000000 ) ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " Could not set timer \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
do {
ret = boottime - > check_event ( event_wait ) ;
} while ( ret = = EFI_NOT_READY ) ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " Could not check event \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
efi_st_printf ( " Counter with TPL level TPL_CALLBACK: %u \n " , counter ) ;
if ( counter ! = 0 ) {
efi_st_printf ( " Notification count with TPL level TPL_CALLBACK: %u \n " ,
notification_count ) ;
if ( notification_count ! = 0 ) {
efi_st_error ( " Suppressed timer fired \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
/* Set 1 ms timer */
ret = boottime - > set_timer ( event_wait , EFI_TIMER_RELATIVE , 1000 ) ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " Could not set timer \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
/* Restore the old TPL level */
boottime - > restore_tpl ( TPL_APPLICATION ) ;
ret = boottime - > wait_for_event ( 1 , & event_wait , & index ) ;
if ( ret ! = EFI_SUCCESS ) {
efi_st_error ( " Could not wait for event \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
efi_st_printf ( " Counter with TPL level TPL_APPLICATION: %u \n " , counter ) ;
if ( counter < 1 ) {
efi_st_printf ( " Notification count with TPL level TPL_APPLICATION: %u \n " ,
notification_count ) ;
if ( notification_count < 1 ) {
efi_st_error ( " Queued timer event did not fire \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
ret = boottime - > set_timer ( event_wait , EFI_TIMER_STOP , 0 ) ;
if ( index ! = 0 ) {
efi_st_error ( " Could not cancel timer \n " ) ;
return 1 ;
return EFI_ST_FAILURE ;
}
return 0 ;
return EFI_ST_SUCCESS ;
}
EFI_UNIT_TEST ( tpl ) = {