[U-Boot] [PATCH v2 7/9] efi_selftest: test reboot by watchdog

Alexander Graf agraf at suse.de
Tue Oct 17 07:59:50 UTC 2017



On 13.10.17 19:33, Heinrich Schuchardt wrote:
> A test is added that verifies that the watchdog timer actually
> causes a reboot upon timeout. The test in only executed on
> request using
> 
>     bootefi selftest 'watchdog reboot'
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
> v2
> 	no change
> ---
>  lib/efi_selftest/efi_selftest_watchdog.c | 65 +++++++++++++++++++++++++++-----
>  1 file changed, 55 insertions(+), 10 deletions(-)
> 
> diff --git a/lib/efi_selftest/efi_selftest_watchdog.c b/lib/efi_selftest/efi_selftest_watchdog.c
> index f8c5404000..a2c11ab1b9 100644
> --- a/lib/efi_selftest/efi_selftest_watchdog.c
> +++ b/lib/efi_selftest/efi_selftest_watchdog.c
> @@ -5,11 +5,15 @@
>   *
>   * SPDX-License-Identifier:     GPL-2.0+
>   *
> - * This unit test checks that the watchdog timer will not cause
> - * a system restart during the timeout period after a timer reset.
> + * The 'watchdog timer' unit test checks that the watchdog timer
> + * will not cause a system restart during the timeout period after
> + * a timer reset.
>   *
> - * Testing that the watchdog timer actually will reset the system
> - * after a timeout is not possible within the used framework.
> + * The 'watchdog reboot' unit test checks that the watchdog timer
> + * actually reboots the system after a timeout. The test is only
> + * executed on explicit request. Use the following command:
> + *
> + *     bootefi selftest 'watchdog reboot'
>   */
>  
>  #include <efi_selftest.h>
> @@ -28,6 +32,7 @@ static struct efi_event *event_notify;
>  static struct efi_event *event_wait;
>  static struct efi_boot_services *boottime;
>  static struct notify_context notification_context;
> +static bool watchdog_reset;
>  
>  /*
>   * Notification function, increments the notfication count if parameter
> @@ -88,6 +93,34 @@ static int setup(const efi_handle_t handle,
>  	return EFI_ST_SUCCESS;
>  }
>  
> +/*
> + * Execute the test resetting the watchdog in a timely manner. No reboot occurs.
> + *
> + * @handle:	handle of the loaded image
> + * @systable:	system table
> + * @return:	EFI_ST_SUCCESS for success
> + */
> +static int setup_timer(const efi_handle_t handle,
> +		       const struct efi_system_table *systable)
> +{
> +	watchdog_reset = true;
> +	return setup(handle, systable);
> +}
> +
> +/*
> + * Execute the test without resetting the watchdog. A system reboot occurs.
> + *
> + * @handle:	handle of the loaded image
> + * @systable:	system table
> + * @return:	EFI_ST_SUCCESS for success
> + */
> +static int setup_reboot(const efi_handle_t handle,
> +			const struct efi_system_table *systable)
> +{
> +	watchdog_reset = false;
> +	return setup(handle, systable);
> +}
> +
>  /*
>   * Tear down unit test.
>   *
> @@ -146,11 +179,14 @@ static int execute(void)
>  		efi_st_error("Setting watchdog timer failed\n");
>  		return EFI_ST_FAILURE;
>  	}
> +	if (watchdog_reset) {
>  	/* Set 600 ms timer */

Please indent :)


Alex

> -	ret = boottime->set_timer(event_notify, EFI_TIMER_PERIODIC, 6000000);
> -	if (ret != EFI_SUCCESS) {
> -		efi_st_error("Could not set timer\n");
> -		return EFI_ST_FAILURE;
> +		ret = boottime->set_timer(event_notify, EFI_TIMER_PERIODIC,
> +					  6000000);
> +		if (ret != EFI_SUCCESS) {
> +			efi_st_error("Could not set timer\n");
> +			return EFI_ST_FAILURE;
> +		}
>  	}
>  	/* Set 1350 ms timer */
>  	ret = boottime->set_timer(event_wait, EFI_TIMER_RELATIVE, 13500000);
> @@ -176,10 +212,19 @@ static int execute(void)
>  	return EFI_ST_SUCCESS;
>  }
>  
> -EFI_UNIT_TEST(watchdog) = {
> +EFI_UNIT_TEST(watchdog1) = {
>  	.name = "watchdog timer",
>  	.phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
> -	.setup = setup,
> +	.setup = setup_timer,
> +	.execute = execute,
> +	.teardown = teardown,
> +};
> +
> +EFI_UNIT_TEST(watchdog2) = {
> +	.name = "watchdog reboot",
> +	.phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
> +	.setup = setup_reboot,
>  	.execute = execute,
>  	.teardown = teardown,
> +	.on_request = true,
>  };
> 


More information about the U-Boot mailing list