From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1ZZpSw-0004pn-HH for mharc-grub-devel@gnu.org; Wed, 09 Sep 2015 20:11:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51868) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZpSs-0004p4-DF for grub-devel@gnu.org; Wed, 09 Sep 2015 20:11:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZZpSn-0005no-7Y for grub-devel@gnu.org; Wed, 09 Sep 2015 20:11:46 -0400 Received: from mail-bl2on0117.outbound.protection.outlook.com ([65.55.169.117]:2224 helo=na01-bl2-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZpSm-0005km-TD for grub-devel@gnu.org; Wed, 09 Sep 2015 20:11:41 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=amesh@juniper.net; Received: from juniper.net (66.129.239.11) by BY2PR05MB192.namprd05.prod.outlook.com (10.242.39.149) with Microsoft SMTP Server (TLS) id 15.1.262.15; Thu, 10 Sep 2015 00:11:38 +0000 Date: Wed, 9 Sep 2015 17:11:33 -0700 From: Arthur Mesh To: Subject: [PATCH] Make EFI watchdog behaviour configurable Message-ID: <20150910001133.GA35797@juniper.net> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="ReaqsoxgOBHFXBhH" Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Originating-IP: [66.129.239.11] X-ClientProxiedBy: BY1PR19CA0040.namprd19.prod.outlook.com (25.162.139.178) To BY2PR05MB192.namprd05.prod.outlook.com (10.242.39.149) X-Microsoft-Exchange-Diagnostics: 1; BY2PR05MB192; 2:pbVjeu9p7eycq1l26qbVWL4qIFh7+g+L9J/7og60AnGVWZ7jUToGeG9yoDEc1DpMdBFODF0THoOKDghSMrnPw4PnssSRdH922iw720w7TJyh/wzTjLOCOBWfiw8hpUchi6Jw7P97FmuJl1MVemzfzReoywD0Y06kRYa3aqIjcmQ=; 3:4KMDdpdXvJpFxpbUD7RyMhYzsNDfg5MNN6K9xtO2i3dRPnjvaOZTs3M4h1tbmYrt98giJqju9XU5LYea+ESyPMfCY2BWSPIlrllLv+YfQoc4/OrRzzpntWBaWxtGSL5pCGIxByHBwDKe6z5jskUWVw==; 25:VESVo+hD/8u+xLLe2Bx9SflcZdc9+0XeNh8nd/jBDXhLUfdVCKtGi0UyN35ZBUS6kKr9Uy4FYPD9Tq00u9IDaMo6mX7MddSxfuvqCuEVQFBU6OflPvbeblfxRJYDP9yv+QZdKz7lEKu7SCat/WNo3FxjMoPRlOXoeE1gTIZGIo/BEciUZPDk1cOro5DQplL8XXwR8QpZYV8CnXKDPUgr9PBuN4lU/gfgqQ84tEbFvCMY6wcLFjrgtc1Rq+Hxehv/DW4J5zktTYC/vFZYizzE5A== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR05MB192; X-Microsoft-Exchange-Diagnostics: 1; BY2PR05MB192; 20:+voZOitu69n2SXqM8ZzJIDaPIf79HT8ooNreUgoHihCB140QTr7TdIisLOYxnnOyN9gYvVlDUeKbQ1/4MzmivQyudM+MXasNOfINu6PEkhLsB5d6+DRUs4qKsoAzBj5k2GlH35cp6IVjtEims3bRccqeFMLAd01/o8iPZroHbt5Uw11R19oH/zW5B7xiIci5TCb7+YtFBvmFV24DNZGfvfEI+QdKHmEHtmRpG3ZlTrwr+/sSC1qe/pfvLuCn1z2W0XPA/Rc3PgCgdezkkjsKEObTlsnF4uNgrWX/PYkgRm7YMraAVSNOz0/gR/vVbKYqBBkLMuOyt0LjkjW39fs3C2ZojtAPYJAZkR3aAnewpPGSWINLU2xEZfMJmXKVbH9Utuwrsb321gHyfUEFCHS1lxsTDnmds37d0fQSWLEx8+nu7EihZseMljAleY22JN/yfsTsBOC1p25/F3+pZp17ybpXHaStN/kqJV8XfACb+P+nq2Sa5US0a+M4PU8tkZW/; 4:MXUr91i+5EigKeALeNAJV/xRigALTxhMuKcBJcc06sQDfIRfl5q/A1NAxDqJdLlWEbhX6a8d1l1ClvzlA2r8woM0GB7D0g6I0S04kMTT28SU5+blhk+2rZFIcK/NAdj+kpJVme3zCutTCvIwUmWhXteOkNRRFTTGgwrpL32QQI8bBm1ePN8FwpEd3LnuAVyXcyJLmENAbb2KMQv0NHe0RQX/QAnlNUUo/qHKOJmUfFMQmMqQPcYiofSwkuW4feyclVbY968UJrhP5wjbNghTQHZ0fB+bP93JS46K26KTVOkG1IyEKJBWnAJEIFeIm6DC X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(8121501046)(3002001); SRVR:BY2PR05MB192; BCL:0; PCL:0; RULEID:; SRVR:BY2PR05MB192; X-Forefront-PRVS: 06952FC175 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(189002)(199003)(62966003)(512954002)(5007970100001)(5001960100002)(106356001)(122386002)(36756003)(450100001)(5004730100002)(66066001)(40100003)(19580395003)(5001830100001)(110136002)(5001860100001)(189998001)(69596002)(84326002)(107886002)(575784001)(83506001)(77156002)(101416001)(21086003)(4001540100001)(92566002)(229853001)(81156007)(87976001)(54356999)(46102003)(105586002)(50986999)(97736004)(4001350100001)(2351001)(64706001)(33656002)(42186005)(86362001)(68736005)(77096005)(33026002)(2700100001); DIR:OUT; SFP:1102; SCL:1; SRVR:BY2PR05MB192; H:juniper.net; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: juniper.net does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR05MB192; 23:IKn3g5qokISfY39ytqLt16GcwxNxhg/1dwPr8pdi7M?= =?us-ascii?Q?NMd0Ej7VF6wb7eCOiLQZWAEU+XFgwu7XhIk5B3tFjGuSVOl7VsvjSt6sfCGi?= =?us-ascii?Q?a/R1PcBnq1yenuztT82lFbVfE49F6Tdz8VOcXxUEQKQYqVC0sKBRJIFgJP/+?= =?us-ascii?Q?AtnufU9E3X1PfC3K3sykTaq9h5kmISBsa+zeyRxDJ5Dd3pCW21rqY9sv8nnJ?= =?us-ascii?Q?0qr28zUyn1+sp+QCZVS3uFlkkqN7ogFeZvkJVVv4enOYp5vfhwvhBrEN6l0P?= =?us-ascii?Q?c7MP2c9yEO0spvLWJb/nWlbXk/DPjfp86/CHi6gNkq7micqRlgjxPXD/jev3?= =?us-ascii?Q?iqJlXI8empqX13cqWPJpqrity+BVXwTbYnBylGH9+nQvz0VQqWLCTTkWnE3B?= =?us-ascii?Q?N4dkTS/SK7itY/ELp8Dk1KkS+ofNUJs+8HgaFGrcTl01Af9dL15e0960rHZ7?= =?us-ascii?Q?qKMmjX+JWkCitmnXn+URfZ+LCzxIPTM/lPt+22XzBjByYYtpiprmzYNjH9ny?= =?us-ascii?Q?2Bvgr16/eIb3l4XwcpywcKBU0f49nRuRCGCchAMDNnZTA7JfmqmINUtJNqWs?= =?us-ascii?Q?16QkkIA00Mu1c6FDFCdQV/M8AzIXA36kMSOA+jB1HT1+gRy6UH5XhnQebVyW?= =?us-ascii?Q?m0BFDB+CYBqnC/Dd6/8YUF/wy0SiCBFXHxrBh/6A7guzKSKZBO6ZjArBXY+f?= =?us-ascii?Q?3ENlDwY3IqZCzkBUtYSecE+U/TAli9/BMuwFKVI4u05BKnl5bDrnItrtvoel?= =?us-ascii?Q?cbVhVj+Gk0rOl/8p9CrzCxxIshtBx3OIt95EorrHyx3IouJJamx/vcTiSWwp?= =?us-ascii?Q?0njFxCZJDVW7gWnwoWqvPx6udl/FFp83NXkP6DVxYbmmuwN5ywJ7f1WnNbXJ?= =?us-ascii?Q?5jRiHY/lAzZT6e7T1+Qs2/9MkaQCBfo8ZgK2A3GhClovZrb4Lv5N7H4hgamb?= =?us-ascii?Q?xn1+7IaTYad9yuS3r/WNTVPymS45Hg+H40lYWHfTUAWNA0GpnX15iliPSVnV?= =?us-ascii?Q?cUMaH2KniHBMNcZHb5Vs6wMnXP9X2pNeGjhPzytopIUJL+DMjeB0FPyJAoFT?= =?us-ascii?Q?EC2q36WuBKYuJrHktOfxcIHoIOlwNDYP7KgeUP1oxJY/A8GNatyFot4BJvGz?= =?us-ascii?Q?5+6j3Hm20J1vjY7xbnLmKFOMKyXcIUONY1D0HqOoQBhpGMx71SATJ9fAZwaS?= =?us-ascii?Q?Ue/BNNJhllwN67kTZWVu9rE7B3WoTmhBELuZXjfDtJs6A6AjXY5SEjWWx4gF?= =?us-ascii?Q?sltmUSJNIJA1UZfgoJYahnGZVWpP+ZBHB1SQUL?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR05MB192; 5:fyfOTggB57D1e7q4nVYfV9twhzQ4dQkjprY8t4p/Ulvdv/RpDs9FwJnInXNpu6jp3bHOl6Mp2EfLIsT5v3Wc6zStyPZ6jMMVM6DxFGU84Vd7xmXmMnDQtoZZ0RBax3029hitFit1BmVZyLeRNgG0vw==; 24:DfEZn5V7S6pUoFtxe3lpBGisiGfTQr+cA9M/AiP09uSrd91AYjD5SQ1tlOQDUMx6f20/H5XkLAeCDxT81WsCBbzhD6NilK+npD1Bzt/P1/A=; 20:qAzwNrK6T4YmJagkd2YuFkG5BEM6b7V11zUP+/2/owOsUqw5OreQJebBUHZxJPIIF8pLKwuA5yYxP3Tsw2vgWw== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: juniper.net X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Sep 2015 00:11:38.7650 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR05MB192 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 X-Received-From: 65.55.169.117 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Sep 2015 00:11:48 -0000 --ReaqsoxgOBHFXBhH Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Starting with d9a0c9413e81d3c0affc6383693bdd28dc863a5c, GRUB unconditionally disables watchdog on EFI platforms. This opens up a window (starting at GRU= B's grub_efi_init(), until OS re-enables it) when EFI system operates w/o watch= dog. If an EFI system gets stuck in that window, the chipset will never reset the system. Add `--enable-efi-watchdog' configure argument, which defaults to Off. When enabled, efi watchdog will not be disabled. Otherwise, efi watchdog will be disabled. Create a command line interface to enable/disable watchdog: efi-watchdog (enable|disable) --- configure.ac | 18 +++++++++++++- docs/grub.texi | 8 ++++++ grub-core/kern/efi/init.c | 59 +++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index c864311..91de439 100644 --- a/configure.ac +++ b/configure.ac @@ -211,7 +211,10 @@ esac case "$platform" in coreboot) machine_CPPFLAGS=3D"$machine_CPPFLAGS -DGRUB_MACHINE_COREBOOT= =3D1" ;; multiboot) machine_CPPFLAGS=3D"$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOO= T=3D1" ;; - efi) machine_CPPFLAGS=3D"$machine_CPPFLAGS -DGRUB_MACHINE_EFI=3D1" ;; + efi) machine_CPPFLAGS=3D"$machine_CPPFLAGS -DGRUB_MACHINE_EFI=3D1" + if test x"$enable_efi_watchdog" =3D xyes ; then + machine_CPPFLAGS=3D"$machine_CPPFLAGS -DEFI_WATCHDOG_LEAVE_ALONE=3D1" + fi ;; xen) machine_CPPFLAGS=3D"$machine_CPPFLAGS -DGRUB_MACHINE_XEN=3D1" ;; ieee1275) machine_CPPFLAGS=3D"$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275= =3D1" ;; uboot) machine_CPPFLAGS=3D"$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=3D1" ;; @@ -1705,6 +1708,10 @@ if test x"$enable_werror" !=3D xno ; then HOST_CFLAGS=3D"$HOST_CFLAGS -Werror" fi =20 +AC_ARG_ENABLE([efi-watchdog], + [AS_HELP_STRING([--enable-efi-watchdog], + [Do not explicitly disable EFI watchdog])]) + TARGET_CPP=3D"$TARGET_CC -E" TARGET_CCAS=3D$TARGET_CC =20 @@ -1899,6 +1906,15 @@ echo efiemu runtime: Yes else echo efiemu runtime: No "($efiemu_excuse)" fi + +if [ x"$platform" =3D xefi ]; then +if [ x"$enable_efi_watchdog" !=3D xyes ]; then +echo disable EFI watchdog: Yes +else +echo disable EFI watchdog: No +fi +fi + if [ x"$grub_mkfont_excuse" =3D x ]; then echo grub-mkfont: Yes else 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 @comman= d{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 follo= wed by any other character will print that character. @end deffn =20 +@node efi-watchdog +@subsection efi-watchdog + +@deffn Command efi-watchdog enable|disable +Enable or disable the system's watchdog timer. Only available in EFI targe= ted +GRUB. +@end deffn =20 @node eval @subsection eval diff --git a/grub-core/kern/efi/init.c b/grub-core/kern/efi/init.c index e9c85de..47053d2 100644 --- a/grub-core/kern/efi/init.c +++ b/grub-core/kern/efi/init.c @@ -25,9 +25,62 @@ #include #include #include +#include +#include =20 grub_addr_t grub_modbase; =20 +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) ")); + + if (grub_strcasecmp (args[0], "enable") =3D=3D 0) { + + if (argc !=3D 2) + return grub_error (GRUB_ERR_BAD_ARGUMENT, + N_("efi-watchdog enable ")); + + input =3D grub_strtol (args[1], 0, 0); + + if (input >=3D 0) { + timeout =3D input; + } else { + return grub_error (GRUB_ERR_BAD_ARGUMENT, + N_(" must be non-negative")); + } + + } else if (grub_strcasecmp (args[0], "disable") =3D=3D 0) { + + if (argc !=3D 1) + return grub_error (GRUB_ERR_BAD_ARGUMENT, + N_("efi-watchdog disable")); + timeout =3D 0; + + } else { + return grub_error (GRUB_ERR_BAD_ARGUMENT, + N_("efi-watchdog (enable|disable) ")); + } + + status =3D efi_call_4 (grub_efi_system_table->boot_services->set_watch= dog_timer, + timeout, 0, sizeof(L"GRUB"), L"GRUB"); + + if (status !=3D 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,15 @@ grub_efi_init (void) /* Initialize the memory management system. */ grub_efi_mm_init (); =20 +#ifndef EFI_WATCHDOG_LEAVE_ALONE efi_call_4 (grub_efi_system_table->boot_services->set_watchdog_timer, 0, 0, 0, NULL); +#endif =20 grub_efidisk_init (); + + cmd_list =3D grub_register_command ("efi-watchdog", grub_cmd_efi_watchdo= g, 0, + N_("Enable/Disable system's watchdog timer.")); } =20 void (*grub_efi_net_config) (grub_efi_handle_t hnd,=20 @@ -77,4 +135,5 @@ grub_efi_fini (void) { grub_efidisk_fini (); grub_console_fini (); + grub_unregister_command (cmd_list); } --=20 1.7.9.5 --ReaqsoxgOBHFXBhH Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQGcBAABCAAGBQJV8Mq1AAoJEAi6IWerhQY4jTkMALX+053NL+MSIHGhwDG1+eLz 5XZkWHVE2C+wRTvsGO3KlWNZIyHc1ZBypQn672lhe5Y1gh3hp5JGxVrAmiU/1IoE 7hFQqRrh4SX2xVsrq/FAs13so3IGzuItjCRaZBfF7Fg3NK55dJPwsXp9xcXQY5QI yfGy8UbsmyH85KY2+9lNdmHcVj1VX21GxfNypulet9d+a9R32hYn6w0FkP+43jTF GEHx75iWAln0TwyKeUeATn9Sook1s+SIQDIbObXzzahmn1W5Vm8R+DfE74PzuR+c LF9xRMRsgbDFaXOojoaBEWyDrIjpkcrrX8UhWOVyx9jEdT/JOnl1QYthJoE4mJvB 6rNcPqq66usVVlvlQDptYZqHWAMxFFBNbs36NnWNa3bh9bwVKEa7JGkvDwaVBZg3 Sc3Ac9YEfkCaXTm9W8wTas7Dsh1gNL+dBd6DQ/HSYXe0sFtQrhc5aq/QKn14dxov JHDYOcm5+xNAw0RanyHZfjA1CGtXiUkBHj0wALFh7A== =2McH -----END PGP SIGNATURE----- --ReaqsoxgOBHFXBhH--