[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAJZ5v0hWpp2M-uDGEpM-gzRSbtGGoBfJk6PVbT71iLsovTdxTg@mail.gmail.com>
Date: Tue, 27 Jan 2026 22:05:49 +0100
From: "Rafael J. Wysocki" <rafael@...nel.org>
To: Armin Wolf <W_Armin@....de>
Cc: linux-acpi@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2] ACPI: OSL: Panic when encountering a fatal ACPI error
On Tue, Jan 27, 2026 at 7:32 AM Armin Wolf <W_Armin@....de> wrote:
>
> The ACPI spec states that the operating system should respond
> to a fatal ACPI error by "performing a controlled OS shutdown in
> a timely fashion". Windows complies with this requirement by entering
> a BSOD upon executing the "Fatal()" ASL opcode, a implementation
> detail that is used by some firmware implementations for signaling
> fatal hardware errors.
>
> Comply with the ACPI specification by triggering a kernel panic
> when ACPICA signals a fatal ACPI error.
I'm not sure if a kernel panic really counts as "a controlled OS shutdown".
Shouldn't this be treated in a similar way to crossing a critical
thermal trip point?
Also, is there a reason beyond "follow Windows" to do this?
> Users can still disable
> this behavior by using the acpi.panic_on_fatal kernel option to
> work around firmware bugs.
This is not enough. You are talking about throwing away user data if
the firmware asks the kernel to do so.
> Link: https://uefi.org/specs/ACPI/6.6/19_ASL_Reference.html#fatal-fatal-error-check
> Signed-off-by: Armin Wolf <W_Armin@....de>
> ---
> Changes since v1:
> - use IS_ENABLED() for checking the presence of CONFIG_ACPI_PANIC_ON_FATAL
> ---
> .../admin-guide/kernel-parameters.txt | 9 +++++++++
> drivers/acpi/Kconfig | 11 +++++++++++
> drivers/acpi/osl.c | 19 ++++++++++++++++++-
> 3 files changed, 38 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
> index 1058f2a6d6a8..140bb239857f 100644
> --- a/Documentation/admin-guide/kernel-parameters.txt
> +++ b/Documentation/admin-guide/kernel-parameters.txt
> @@ -187,6 +187,15 @@ Kernel parameters
> unusable. The "log_buf_len" parameter may be useful
> if you need to capture more output.
>
> + acpi.panic_on_fatal= [ACPI]
> + {0 | 1}
> + Causes the kernel to panic when the ACPI bytecode signals
> + a fatal error. The default value of this setting can
> + be configured using CONFIG_ACPI_PANIC_ON_FATAL.
> + Overriding this value should only be done for diagnosing
> + ACPI firmware problems, as some firmware implementations
> + use this mechanism to signal fatal hardware errors.
> +
> acpi_enforce_resources= [ACPI]
> { strict | lax | no }
> Check for resource conflicts between native drivers
> diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
> index df0ff0764d0d..7139e7d8ac25 100644
> --- a/drivers/acpi/Kconfig
> +++ b/drivers/acpi/Kconfig
> @@ -65,6 +65,17 @@ config ACPI_THERMAL_LIB
> depends on THERMAL
> bool
>
> +config ACPI_PANIC_ON_FATAL
> + bool "Panic on fatal ACPI error"
> + default y
> + help
> + The ACPI bytecode can signal that a fatal error has occurred using the Fatal()
> + ASL operator, normaly causing a kernel panic. Disabling this option causes such
> + a condition to be treated like a ordinary ACPI error.
> +
> + This setting can also be overridden during boot using the acpi.panic_on_fatal
> + kernel parameter.
> +
> config ACPI_DEBUGGER
> bool "AML debugger interface"
> select ACPI_DEBUG
> diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
> index 05393a7315fe..6375db6d22ea 100644
> --- a/drivers/acpi/osl.c
> +++ b/drivers/acpi/osl.c
> @@ -11,7 +11,9 @@
>
> #define pr_fmt(fmt) "ACPI: OSL: " fmt
>
> +#include <linux/kconfig.h>
> #include <linux/module.h>
> +#include <linux/panic.h>
> #include <linux/kernel.h>
> #include <linux/slab.h>
> #include <linux/mm.h>
> @@ -70,6 +72,10 @@ static bool acpi_os_initialized;
> unsigned int acpi_sci_irq = INVALID_ACPI_IRQ;
> bool acpi_permanent_mmap = false;
>
> +static bool panic_on_fatal = IS_ENABLED(CONFIG_ACPI_PANIC_ON_FATAL);
> +module_param(panic_on_fatal, bool, 0);
> +MODULE_PARM_DESC(panic_on_fatal, "Trigger a kernel panic when encountering a fatal ACPI error");
> +
> /*
> * This list of permanent mappings is for memory that may be accessed from
> * interrupt context, where we can't do the ioremap().
> @@ -1381,9 +1387,20 @@ acpi_status acpi_os_notify_command_complete(void)
>
> acpi_status acpi_os_signal(u32 function, void *info)
> {
> + struct acpi_signal_fatal_info *fatal_info;
> +
> switch (function) {
> case ACPI_SIGNAL_FATAL:
> - pr_err("Fatal opcode executed\n");
> + fatal_info = info;
> + if (panic_on_fatal) {
> + panic("Fatal ACPI BIOS error (type 0x%X code 0x%X argument 0x%X)",
> + fatal_info->type, fatal_info->code, fatal_info->argument);
> + } else {
> + pr_emerg("Fatal ACPI BIOS error (type 0x%X code 0x%X argument 0x%X)\n",
> + fatal_info->type, fatal_info->code, fatal_info->argument);
> + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
> + }
> +
> break;
> case ACPI_SIGNAL_BREAKPOINT:
> /*
> --
> 2.39.5
>
>
Powered by blists - more mailing lists