[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