All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: The development of GNU GRUB <grub-devel@gnu.org>
Subject: Re: [PATCH] Remove unconditional disablement of the watchdog
Date: Tue, 8 Sep 2015 09:42:08 -0700	[thread overview]
Message-ID: <55EF0FE0.4060207@gmail.com> (raw)
In-Reply-To: <20150901145133.GK47665@juniper.net>

[-- Attachment #1: Type: text/plain, Size: 4773 bytes --]

On 01.09.2015 07:51, Arthur Mesh wrote:
> Starting with d9a0c9413e81d3c0affc6383693bdd28dc863a5c, GRUB unconditionally
> disables watchdog on EFI platforms. This opens up a window (starting at GRUB's
> grub_efi_init(), until OS re-enables it) when EFI system operates w/o watchdog.
> If an EFI system gets stuck in that window, the chipset will never reset the
> system.
> 
> Remove the unconditional disablement of the watchdog, and create a command line
> interface to enable/disable watchdog:
> 
This patch will break any current config on systems with watchdog. You
need to ensure that:
a) watchdog timeout is plenty to load config file even on very slow
netboot systems.
b) disable watchdog if the config didn't opt-in to have the watchdog.
>  efi-watchdog (enable|disable) <timeout>
> ---
>  docs/grub.texi            |    8 ++++++
>  grub-core/kern/efi/init.c |   60 ++++++++++++++++++++++++++++++++++++++++++---
>  2 files changed, 65 insertions(+), 3 deletions(-)
> 
> diff --git a/docs/grub.texi b/docs/grub.texi
> index b9f41a7..4cfd50c 100644
> --- a/docs/grub.texi
> +++ b/docs/grub.texi
> @@ -3784,6 +3784,7 @@ you forget a command, you can run the command @command{help}
>  * distrust::                    Remove a pubkey from trusted keys
>  * drivemap::                    Map a drive to another
>  * echo::                        Display a line of text
> +* efi-watchdog::                Manipulate EFI watchdog
>  * eval::                        Evaluate agruments as GRUB commands
>  * export::                      Export an environment variable
>  * false::                       Do nothing, unsuccessfully
> @@ -4192,6 +4193,13 @@ When interpreting backslash escapes, backslash followed by any other
>  character will print that character.
>  @end deffn
>  
> +@node efi-watchdog
> +@subsection efi-watchdog
> +
> +@deffn Command efi-watchdog enable|disable <timeout>
> +Enable or disable the system's watchdog timer. Only available in EFI targeted
> +GRUB.
> +@end deffn
>  
>  @node eval
>  @subsection eval
> diff --git a/grub-core/kern/efi/init.c b/grub-core/kern/efi/init.c
> index e9c85de..f8a79eb 100644
> --- a/grub-core/kern/efi/init.c
> +++ b/grub-core/kern/efi/init.c
> @@ -25,9 +25,62 @@
>  #include <grub/env.h>
>  #include <grub/mm.h>
>  #include <grub/kernel.h>
> +#include <grub/extcmd.h>
> +#include <grub/command.h>
>  
>  grub_addr_t grub_modbase;
>  
> +static grub_command_t cmd_list;
> +
> +static grub_err_t
> +grub_cmd_efi_watchdog (grub_command_t cmd  __attribute__ ((unused)),
> +		       int argc, char **args)
> +{
> +    long input;
> +    grub_efi_status_t status;
> +    grub_efi_uintn_t timeout;
> +
> +    if (argc < 1)
> +	return grub_error (GRUB_ERR_BAD_ARGUMENT,
> +	    N_("efi-watchdog (enable|disable) <timeout>"));
> +
> +    if (grub_strcasecmp (args[0], "enable") == 0) {
> +
> +	if (argc != 2)
> +	    return grub_error (GRUB_ERR_BAD_ARGUMENT,
> +			       N_("efi-watchdog enable <timeout>"));
> +
> +	input = grub_strtol (args[1], 0, 0);
> +
> +	if (input >= 0) {
> +	    timeout = input;
> +	} else {
> +	    return grub_error (GRUB_ERR_BAD_ARGUMENT,
> +			       N_("<timeout> must be non-negative"));
> +	}
> +
> +    } else if (grub_strcasecmp (args[0], "disable") == 0) {
> +
> +	if (argc != 1)
> +	    return grub_error (GRUB_ERR_BAD_ARGUMENT,
> +			       N_("efi-watchdog disable"));
> +	timeout = 0;
> +
> +    } else {
> +	return grub_error (GRUB_ERR_BAD_ARGUMENT,
> +	    N_("efi-watchdog (enable|disable) <timeout>"));
> +    }
> +
> +    status = efi_call_4 (grub_efi_system_table->boot_services->set_watchdog_timer,
> +			 timeout, 0, sizeof(L"GRUB"), L"GRUB");
> +
> +    if (status != GRUB_EFI_SUCCESS)
> +	return grub_error (GRUB_ERR_BUG,
> +			   N_("EFI SetWatchdogTimer() bug"));
> +    else
> +	return GRUB_ERR_NONE;
> +}
> +
>  void
>  grub_efi_init (void)
>  {
> @@ -39,10 +92,10 @@ grub_efi_init (void)
>    /* Initialize the memory management system.  */
>    grub_efi_mm_init ();
>  
> -  efi_call_4 (grub_efi_system_table->boot_services->set_watchdog_timer,
> -	      0, 0, 0, NULL);
> -
>    grub_efidisk_init ();
> +
> +  cmd_list = grub_register_command ("efi-watchdog", grub_cmd_efi_watchdog, 0,
> +				    N_("Enable/Disable system's watchdog timer."));
>  }
>  
>  void (*grub_efi_net_config) (grub_efi_handle_t hnd, 
> @@ -77,4 +130,5 @@ grub_efi_fini (void)
>  {
>    grub_efidisk_fini ();
>    grub_console_fini ();
> +  grub_unregister_command (cmd_list);
>  }
> 
> 
> 
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 213 bytes --]

  reply	other threads:[~2015-09-08 16:42 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-01 14:51 [PATCH] Remove unconditional disablement of the watchdog Arthur Mesh
2015-09-08 16:42 ` Vladimir 'φ-coder/phcoder' Serbinenko [this message]
2015-09-09 15:53   ` Arthur Mesh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55EF0FE0.4060207@gmail.com \
    --to=phcoder@gmail.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.