]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.0-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Dec 2022 16:03:00 +0000 (17:03 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Dec 2022 16:03:00 +0000 (17:03 +0100)
added patches:
rtc-cmos-fix-event-handler-registration-ordering-issue.patch
rtc-cmos-fix-wake-alarm-breakage.patch
x86-vdso-conditionally-export-__vdso_sgx_enter_enclave.patch

queue-6.0/rtc-cmos-fix-event-handler-registration-ordering-issue.patch [new file with mode: 0644]
queue-6.0/rtc-cmos-fix-wake-alarm-breakage.patch [new file with mode: 0644]
queue-6.0/x86-vdso-conditionally-export-__vdso_sgx_enter_enclave.patch [new file with mode: 0644]

diff --git a/queue-6.0/rtc-cmos-fix-event-handler-registration-ordering-issue.patch b/queue-6.0/rtc-cmos-fix-event-handler-registration-ordering-issue.patch
new file mode 100644 (file)
index 0000000..c76c79b
--- /dev/null
@@ -0,0 +1,118 @@
+From 4919d3eb2ec0ee364f7e3cf2d99646c1b224fae8 Mon Sep 17 00:00:00 2001
+From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
+Date: Wed, 12 Oct 2022 20:07:01 +0200
+Subject: rtc: cmos: Fix event handler registration ordering issue
+
+From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+
+commit 4919d3eb2ec0ee364f7e3cf2d99646c1b224fae8 upstream.
+
+Because acpi_install_fixed_event_handler() enables the event
+automatically on success, it is incorrect to call it before the
+handler routine passed to it is ready to handle events.
+
+Unfortunately, the rtc-cmos driver does exactly the incorrect thing
+by calling cmos_wake_setup(), which passes rtc_handler() to
+acpi_install_fixed_event_handler(), before cmos_do_probe(), because
+rtc_handler() uses dev_get_drvdata() to get to the cmos object
+pointer and the driver data pointer is only populated in
+cmos_do_probe().
+
+This leads to a NULL pointer dereference in rtc_handler() on boot
+if the RTC fixed event happens to be active at the init time.
+
+To address this issue, change the initialization ordering of the
+driver so that cmos_wake_setup() is always called after a successful
+cmos_do_probe() call.
+
+While at it, change cmos_pnp_probe() to call cmos_do_probe() after
+the initial if () statement used for computing the IRQ argument to
+be passed to cmos_do_probe() which is cleaner than calling it in
+each branch of that if () (local variable "irq" can be of type int,
+because it is passed to that function as an argument of type int).
+
+Note that commit 6492fed7d8c9 ("rtc: rtc-cmos: Do not check
+ACPI_FADT_LOW_POWER_S0") caused this issue to affect a larger number
+of systems, because previously it only affected systems with
+ACPI_FADT_LOW_POWER_S0 set, but it is present regardless of that
+commit.
+
+Fixes: 6492fed7d8c9 ("rtc: rtc-cmos: Do not check ACPI_FADT_LOW_POWER_S0")
+Fixes: a474aaedac99 ("rtc-cmos: move wake setup from ACPI glue into RTC driver")
+Link: https://lore.kernel.org/linux-acpi/20221010141630.zfzi7mk7zvnmclzy@techsingularity.net/
+Reported-by: Mel Gorman <mgorman@techsingularity.net>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Reviewed-by: Bjorn Helgaas <bhelgaas@google.com>
+Tested-by: Mel Gorman <mgorman@techsingularity.net>
+Link: https://lore.kernel.org/r/5629262.DvuYhMxLoT@kreacher
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/rtc/rtc-cmos.c |   29 +++++++++++++++++++----------
+ 1 file changed, 19 insertions(+), 10 deletions(-)
+
+--- a/drivers/rtc/rtc-cmos.c
++++ b/drivers/rtc/rtc-cmos.c
+@@ -1352,10 +1352,10 @@ static void cmos_check_acpi_rtc_status(s
+ static int cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
+ {
+-      cmos_wake_setup(&pnp->dev);
++      int irq, ret;
+       if (pnp_port_start(pnp, 0) == 0x70 && !pnp_irq_valid(pnp, 0)) {
+-              unsigned int irq = 0;
++              irq = 0;
+ #ifdef CONFIG_X86
+               /* Some machines contain a PNP entry for the RTC, but
+                * don't define the IRQ. It should always be safe to
+@@ -1364,13 +1364,17 @@ static int cmos_pnp_probe(struct pnp_dev
+               if (nr_legacy_irqs())
+                       irq = RTC_IRQ;
+ #endif
+-              return cmos_do_probe(&pnp->dev,
+-                              pnp_get_resource(pnp, IORESOURCE_IO, 0), irq);
+       } else {
+-              return cmos_do_probe(&pnp->dev,
+-                              pnp_get_resource(pnp, IORESOURCE_IO, 0),
+-                              pnp_irq(pnp, 0));
++              irq = pnp_irq(pnp, 0);
+       }
++
++      ret = cmos_do_probe(&pnp->dev, pnp_get_resource(pnp, IORESOURCE_IO, 0), irq);
++      if (ret)
++              return ret;
++
++      cmos_wake_setup(&pnp->dev);
++
++      return 0;
+ }
+ static void cmos_pnp_remove(struct pnp_dev *pnp)
+@@ -1454,10 +1458,9 @@ static inline void cmos_of_init(struct p
+ static int __init cmos_platform_probe(struct platform_device *pdev)
+ {
+       struct resource *resource;
+-      int irq;
++      int irq, ret;
+       cmos_of_init(pdev);
+-      cmos_wake_setup(&pdev->dev);
+       if (RTC_IOMAPPED)
+               resource = platform_get_resource(pdev, IORESOURCE_IO, 0);
+@@ -1467,7 +1470,13 @@ static int __init cmos_platform_probe(st
+       if (irq < 0)
+               irq = -1;
+-      return cmos_do_probe(&pdev->dev, resource, irq);
++      ret = cmos_do_probe(&pdev->dev, resource, irq);
++      if (ret)
++              return ret;
++
++      cmos_wake_setup(&pdev->dev);
++
++      return 0;
+ }
+ static int cmos_platform_remove(struct platform_device *pdev)
diff --git a/queue-6.0/rtc-cmos-fix-wake-alarm-breakage.patch b/queue-6.0/rtc-cmos-fix-wake-alarm-breakage.patch
new file mode 100644 (file)
index 0000000..d7a7c01
--- /dev/null
@@ -0,0 +1,86 @@
+From 0782b66ed2fbb035dda76111df0954515e417b24 Mon Sep 17 00:00:00 2001
+From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
+Date: Tue, 18 Oct 2022 18:09:31 +0200
+Subject: rtc: cmos: Fix wake alarm breakage
+
+From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+
+commit 0782b66ed2fbb035dda76111df0954515e417b24 upstream.
+
+Commit 4919d3eb2ec0 ("rtc: cmos: Fix event handler registration
+ordering issue") overlooked the fact that cmos_do_probe() depended
+on the preparations carried out by cmos_wake_setup() and the wake
+alarm stopped working after the ordering of them had been changed.
+
+Address this by partially reverting commit 4919d3eb2ec0 so that
+cmos_wake_setup() is called before cmos_do_probe() again and moving
+the rtc_wake_setup() invocation from cmos_wake_setup() directly to the
+callers of cmos_do_probe() where it will happen after a successful
+completion of the latter.
+
+Fixes: 4919d3eb2ec0 ("rtc: cmos: Fix event handler registration ordering issue")
+Reported-by: Zhang Rui <rui.zhang@intel.com>
+Reported-by: Todd Brandt <todd.e.brandt@linux.intel.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Link: https://lore.kernel.org/r/5887691.lOV4Wx5bFT@kreacher
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/rtc/rtc-cmos.c |   11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+--- a/drivers/rtc/rtc-cmos.c
++++ b/drivers/rtc/rtc-cmos.c
+@@ -1233,6 +1233,9 @@ static u32 rtc_handler(void *context)
+ static inline void rtc_wake_setup(struct device *dev)
+ {
++      if (acpi_disabled)
++              return;
++
+       acpi_install_fixed_event_handler(ACPI_EVENT_RTC, rtc_handler, dev);
+       /*
+        * After the RTC handler is installed, the Fixed_RTC event should
+@@ -1286,7 +1289,6 @@ static void cmos_wake_setup(struct devic
+       use_acpi_alarm_quirks();
+-      rtc_wake_setup(dev);
+       acpi_rtc_info.wake_on = rtc_wake_on;
+       acpi_rtc_info.wake_off = rtc_wake_off;
+@@ -1354,6 +1356,8 @@ static int cmos_pnp_probe(struct pnp_dev
+ {
+       int irq, ret;
++      cmos_wake_setup(&pnp->dev);
++
+       if (pnp_port_start(pnp, 0) == 0x70 && !pnp_irq_valid(pnp, 0)) {
+               irq = 0;
+ #ifdef CONFIG_X86
+@@ -1372,7 +1376,7 @@ static int cmos_pnp_probe(struct pnp_dev
+       if (ret)
+               return ret;
+-      cmos_wake_setup(&pnp->dev);
++      rtc_wake_setup(&pnp->dev);
+       return 0;
+ }
+@@ -1461,6 +1465,7 @@ static int __init cmos_platform_probe(st
+       int irq, ret;
+       cmos_of_init(pdev);
++      cmos_wake_setup(&pdev->dev);
+       if (RTC_IOMAPPED)
+               resource = platform_get_resource(pdev, IORESOURCE_IO, 0);
+@@ -1474,7 +1479,7 @@ static int __init cmos_platform_probe(st
+       if (ret)
+               return ret;
+-      cmos_wake_setup(&pdev->dev);
++      rtc_wake_setup(&pdev->dev);
+       return 0;
+ }
diff --git a/queue-6.0/x86-vdso-conditionally-export-__vdso_sgx_enter_enclave.patch b/queue-6.0/x86-vdso-conditionally-export-__vdso_sgx_enter_enclave.patch
new file mode 100644 (file)
index 0000000..6b36fee
--- /dev/null
@@ -0,0 +1,42 @@
+From 45be2ad007a9c6bea70249c4cf3e4905afe4caeb Mon Sep 17 00:00:00 2001
+From: Nathan Chancellor <nathan@kernel.org>
+Date: Tue, 8 Nov 2022 17:03:07 -0700
+Subject: x86/vdso: Conditionally export __vdso_sgx_enter_enclave()
+
+From: Nathan Chancellor <nathan@kernel.org>
+
+commit 45be2ad007a9c6bea70249c4cf3e4905afe4caeb upstream.
+
+Recently, ld.lld moved from '--undefined-version' to
+'--no-undefined-version' as the default, which breaks building the vDSO
+when CONFIG_X86_SGX is not set:
+
+  ld.lld: error: version script assignment of 'LINUX_2.6' to symbol '__vdso_sgx_enter_enclave' failed: symbol not defined
+
+__vdso_sgx_enter_enclave is only included in the vDSO when
+CONFIG_X86_SGX is set. Only export it if it will be present in the final
+object, which clears up the error.
+
+Fixes: 8466436952017 ("x86/vdso: Implement a vDSO for Intel SGX enclave call")
+Signed-off-by: Nathan Chancellor <nathan@kernel.org>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
+Link: https://github.com/ClangBuiltLinux/linux/issues/1756
+Link: https://lore.kernel.org/r/20221109000306.1407357-1-nathan@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/entry/vdso/vdso.lds.S |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/arch/x86/entry/vdso/vdso.lds.S
++++ b/arch/x86/entry/vdso/vdso.lds.S
+@@ -27,7 +27,9 @@ VERSION {
+               __vdso_time;
+               clock_getres;
+               __vdso_clock_getres;
++#ifdef CONFIG_X86_SGX
+               __vdso_sgx_enter_enclave;
++#endif
+       local: *;
+       };
+ }