refresh patches
This commit is contained in:
33
debian/patches/patchset-zen/fixes/0001-arch-Kconfig-Default-to-maximum-amount-of-ASLR-bits.patch
vendored
Normal file
33
debian/patches/patchset-zen/fixes/0001-arch-Kconfig-Default-to-maximum-amount-of-ASLR-bits.patch
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
From 6dada600ab3579296c9b2b57cf41b95792f021ed Mon Sep 17 00:00:00 2001
|
||||
From: "Jan Alexander Steffens (heftig)" <heftig@archlinux.org>
|
||||
Date: Sat, 13 Jan 2024 15:29:25 +0100
|
||||
Subject: arch/Kconfig: Default to maximum amount of ASLR bits
|
||||
|
||||
To mitigate CVE-2024-26621 and improve randomization quality further. Do
|
||||
this with a patch to avoid having to enable `CONFIG_EXPERT`.
|
||||
|
||||
Cherry-picked-for: https://zolutal.github.io/aslrnt/
|
||||
---
|
||||
arch/Kconfig | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/Kconfig
|
||||
+++ b/arch/Kconfig
|
||||
@@ -1137,7 +1137,7 @@ config ARCH_MMAP_RND_BITS
|
||||
int "Number of bits to use for ASLR of mmap base address" if EXPERT
|
||||
range ARCH_MMAP_RND_BITS_MIN ARCH_MMAP_RND_BITS_MAX
|
||||
default ARCH_MMAP_RND_BITS_DEFAULT if ARCH_MMAP_RND_BITS_DEFAULT
|
||||
- default ARCH_MMAP_RND_BITS_MIN
|
||||
+ default ARCH_MMAP_RND_BITS_MAX
|
||||
depends on HAVE_ARCH_MMAP_RND_BITS
|
||||
help
|
||||
This value can be used to select the number of bits to use to
|
||||
@@ -1171,7 +1171,7 @@ config ARCH_MMAP_RND_COMPAT_BITS
|
||||
int "Number of bits to use for ASLR of mmap base address for compatible applications" if EXPERT
|
||||
range ARCH_MMAP_RND_COMPAT_BITS_MIN ARCH_MMAP_RND_COMPAT_BITS_MAX
|
||||
default ARCH_MMAP_RND_COMPAT_BITS_DEFAULT if ARCH_MMAP_RND_COMPAT_BITS_DEFAULT
|
||||
- default ARCH_MMAP_RND_COMPAT_BITS_MIN
|
||||
+ default ARCH_MMAP_RND_COMPAT_BITS_MAX
|
||||
depends on HAVE_ARCH_MMAP_RND_COMPAT_BITS
|
||||
help
|
||||
This value can be used to select the number of bits to use to
|
@@ -1,162 +0,0 @@
|
||||
From 3c32c0d457a2c4b2817f57e1e2c9cbba4624639e Mon Sep 17 00:00:00 2001
|
||||
From: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Date: Fri, 22 Nov 2024 11:33:05 -0800
|
||||
Subject: futex: improve user space accesses
|
||||
|
||||
Josh Poimboeuf reports that he got a "will-it-scale.per_process_ops 1.9%
|
||||
improvement" report for his patch that changed __get_user() to use
|
||||
pointer masking instead of the explicit speculation barrier. However,
|
||||
that patch doesn't actually work in the general case, because some (very
|
||||
bad) architecture-specific code actually depends on __get_user() also
|
||||
working on kernel addresses.
|
||||
|
||||
A profile showed that the offending __get_user() was the futex code,
|
||||
which really should be fixed up to not use that horrid legacy case.
|
||||
Rewrite futex_get_value_locked() to use the modern user acccess helpers,
|
||||
and inline it so that the compiler not only avoids the function call for
|
||||
a few instructions, but can do CSE on the address masking.
|
||||
|
||||
It also turns out the x86 futex functions have unnecessary barriers in
|
||||
other places, so let's fix those up too.
|
||||
|
||||
Link: https://lore.kernel.org/all/20241115230653.hfvzyf3aqqntgp63@jpoimboe/
|
||||
Reported-by: Josh Poimboeuf <jpoimboe@kernel.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
arch/x86/include/asm/futex.h | 8 +++--
|
||||
kernel/futex/core.c | 22 --------------
|
||||
kernel/futex/futex.h | 59 ++++++++++++++++++++++++++++++++++--
|
||||
3 files changed, 63 insertions(+), 26 deletions(-)
|
||||
|
||||
--- a/arch/x86/include/asm/futex.h
|
||||
+++ b/arch/x86/include/asm/futex.h
|
||||
@@ -48,7 +48,9 @@ do { \
|
||||
static __always_inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
|
||||
u32 __user *uaddr)
|
||||
{
|
||||
- if (!user_access_begin(uaddr, sizeof(u32)))
|
||||
+ if (can_do_masked_user_access())
|
||||
+ uaddr = masked_user_access_begin(uaddr);
|
||||
+ else if (!user_access_begin(uaddr, sizeof(u32)))
|
||||
return -EFAULT;
|
||||
|
||||
switch (op) {
|
||||
@@ -84,7 +86,9 @@ static inline int futex_atomic_cmpxchg_i
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
- if (!user_access_begin(uaddr, sizeof(u32)))
|
||||
+ if (can_do_masked_user_access())
|
||||
+ uaddr = masked_user_access_begin(uaddr);
|
||||
+ else if (!user_access_begin(uaddr, sizeof(u32)))
|
||||
return -EFAULT;
|
||||
asm volatile("\n"
|
||||
"1:\t" LOCK_PREFIX "cmpxchgl %3, %2\n"
|
||||
--- a/kernel/futex/core.c
|
||||
+++ b/kernel/futex/core.c
|
||||
@@ -451,28 +451,6 @@ struct futex_q *futex_top_waiter(struct
|
||||
return NULL;
|
||||
}
|
||||
|
||||
-int futex_cmpxchg_value_locked(u32 *curval, u32 __user *uaddr, u32 uval, u32 newval)
|
||||
-{
|
||||
- int ret;
|
||||
-
|
||||
- pagefault_disable();
|
||||
- ret = futex_atomic_cmpxchg_inatomic(curval, uaddr, uval, newval);
|
||||
- pagefault_enable();
|
||||
-
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
-int futex_get_value_locked(u32 *dest, u32 __user *from)
|
||||
-{
|
||||
- int ret;
|
||||
-
|
||||
- pagefault_disable();
|
||||
- ret = __get_user(*dest, from);
|
||||
- pagefault_enable();
|
||||
-
|
||||
- return ret ? -EFAULT : 0;
|
||||
-}
|
||||
-
|
||||
/**
|
||||
* wait_for_owner_exiting - Block until the owner has exited
|
||||
* @ret: owner's current futex lock status
|
||||
--- a/kernel/futex/futex.h
|
||||
+++ b/kernel/futex/futex.h
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <linux/rtmutex.h>
|
||||
#include <linux/sched/wake_q.h>
|
||||
#include <linux/compat.h>
|
||||
+#include <linux/uaccess.h>
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
#include <linux/rcuwait.h>
|
||||
@@ -225,10 +226,64 @@ extern bool __futex_wake_mark(struct fut
|
||||
extern void futex_wake_mark(struct wake_q_head *wake_q, struct futex_q *q);
|
||||
|
||||
extern int fault_in_user_writeable(u32 __user *uaddr);
|
||||
-extern int futex_cmpxchg_value_locked(u32 *curval, u32 __user *uaddr, u32 uval, u32 newval);
|
||||
-extern int futex_get_value_locked(u32 *dest, u32 __user *from);
|
||||
extern struct futex_q *futex_top_waiter(struct futex_hash_bucket *hb, union futex_key *key);
|
||||
|
||||
+static inline int futex_cmpxchg_value_locked(u32 *curval, u32 __user *uaddr, u32 uval, u32 newval)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ pagefault_disable();
|
||||
+ ret = futex_atomic_cmpxchg_inatomic(curval, uaddr, uval, newval);
|
||||
+ pagefault_enable();
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * This does a plain atomic user space read, and the user pointer has
|
||||
+ * already been verified earlier by get_futex_key() to be both aligned
|
||||
+ * and actually in user space, just like futex_atomic_cmpxchg_inatomic().
|
||||
+ *
|
||||
+ * We still want to avoid any speculation, and while __get_user() is
|
||||
+ * the traditional model for this, it's actually slower then doing
|
||||
+ * this manually these days.
|
||||
+ *
|
||||
+ * We could just have a per-architecture special function for it,
|
||||
+ * the same way we do futex_atomic_cmpxchg_inatomic(), but rather
|
||||
+ * than force everybody to do that, write it out long-hand using
|
||||
+ * the low-level user-access infrastructure.
|
||||
+ *
|
||||
+ * This looks a bit overkill, but generally just results in a couple
|
||||
+ * of instructions.
|
||||
+ */
|
||||
+static __always_inline int futex_read_inatomic(u32 *dest, u32 __user *from)
|
||||
+{
|
||||
+ u32 val;
|
||||
+
|
||||
+ if (can_do_masked_user_access())
|
||||
+ from = masked_user_access_begin(from);
|
||||
+ else if (!user_read_access_begin(from, sizeof(*from)))
|
||||
+ return -EFAULT;
|
||||
+ unsafe_get_user(val, from, Efault);
|
||||
+ user_access_end();
|
||||
+ *dest = val;
|
||||
+ return 0;
|
||||
+Efault:
|
||||
+ user_access_end();
|
||||
+ return -EFAULT;
|
||||
+}
|
||||
+
|
||||
+static inline int futex_get_value_locked(u32 *dest, u32 __user *from)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ pagefault_disable();
|
||||
+ ret = futex_read_inatomic(dest, from);
|
||||
+ pagefault_enable();
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
extern void __futex_unqueue(struct futex_q *q);
|
||||
extern void __futex_queue(struct futex_q *q, struct futex_hash_bucket *hb,
|
||||
struct task_struct *task);
|
@@ -0,0 +1,85 @@
|
||||
From 5ac90c5aed97728c8f4f64c02d75334c84a801ef Mon Sep 17 00:00:00 2001
|
||||
From: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Date: Thu, 19 May 2022 14:40:07 +0200
|
||||
Subject: drivers/firmware: skip simpledrm if nvidia-drm.modeset=1 is set
|
||||
|
||||
The Nvidia proprietary driver has some bugs that leads to issues if used
|
||||
with the simpledrm driver. The most noticeable is that does not register
|
||||
an emulated fbdev device.
|
||||
|
||||
It just relies on a fbdev to be registered by another driver, that could
|
||||
be that could be attached to the framebuffer console. On UEFI machines,
|
||||
this is the efifb driver.
|
||||
|
||||
This means that disabling the efifb driver will cause virtual consoles to
|
||||
not be present in the system when using the Nvidia driver. Legacy BIOS is
|
||||
not affected just because fbcon is not used there, but instead vgacon.
|
||||
|
||||
Unless a VGA mode is specified using the vga= kernel command line option,
|
||||
in that case the vesafb driver is used instead and its fbdev attached to
|
||||
the fbcon.
|
||||
|
||||
This is a problem because with CONFIG_SYSFB_SIMPLEFB=y, the sysfb platform
|
||||
code attempts to register a "simple-framebuffer" platform device (that is
|
||||
matched against simpledrm) and only registers either an "efi-framebuffer"
|
||||
or "vesa-framebuffer" if this fails to be registered due the video modes
|
||||
not being compatible.
|
||||
|
||||
The Nvidia driver relying on another driver to register the fbdev is quite
|
||||
fragile, since it can't really assume those will stick around. For example
|
||||
there are patches posted to remove the EFI and VESA platform devices once
|
||||
a real DRM or fbdev driver probes.
|
||||
|
||||
But in any case, moving to a simpledrm + emulated fbdev only breaks this
|
||||
assumption and causes users to not have VT if the Nvidia driver is used.
|
||||
|
||||
So to prevent this, let's add a workaround and make the sysfb to skip the
|
||||
"simple-framebuffer" registration when nvidia-drm.modeset=1 option is set.
|
||||
|
||||
This is quite horrible, but honestly I can't think of any other approach.
|
||||
|
||||
For this to work, the CONFIG_FB_EFI and CONFIG_FB_VESA config options must
|
||||
be enabled besides CONFIG_DRM_SIMPLEDRM.
|
||||
|
||||
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Source: https://gitlab.com/cki-project/kernel-ark/-/merge_requests/1788
|
||||
Cherry-picked-for: https://bugs.archlinux.org/task/73720
|
||||
Cherry-picked-for: https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/issues/94
|
||||
---
|
||||
drivers/firmware/sysfb.c | 18 +++++++++++++++++-
|
||||
1 file changed, 17 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/firmware/sysfb.c
|
||||
+++ b/drivers/firmware/sysfb.c
|
||||
@@ -35,6 +35,22 @@
|
||||
#include <linux/screen_info.h>
|
||||
#include <linux/sysfb.h>
|
||||
|
||||
+static int skip_simpledrm;
|
||||
+
|
||||
+static int __init simpledrm_disable(char *opt)
|
||||
+{
|
||||
+ if (!opt)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ get_option(&opt, &skip_simpledrm);
|
||||
+
|
||||
+ if (skip_simpledrm)
|
||||
+ pr_info("The simpledrm driver will not be probed\n");
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+early_param("nvidia-drm.modeset", simpledrm_disable);
|
||||
+
|
||||
static struct platform_device *pd;
|
||||
static DEFINE_MUTEX(disable_lock);
|
||||
static bool disabled;
|
||||
@@ -164,7 +180,7 @@ static __init int sysfb_init(void)
|
||||
|
||||
/* try to create a simple-framebuffer device */
|
||||
compatible = sysfb_parse_mode(si, &mode);
|
||||
- if (compatible) {
|
||||
+ if (compatible && !skip_simpledrm) {
|
||||
pd = sysfb_create_simplefb(si, &mode, parent);
|
||||
if (!IS_ERR(pd))
|
||||
goto put_device;
|
56
debian/patches/patchset-zen/fixes/0003-EDAC-igen6-Fix-the-flood-of-invalid-error-reports.patch
vendored
Normal file
56
debian/patches/patchset-zen/fixes/0003-EDAC-igen6-Fix-the-flood-of-invalid-error-reports.patch
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
From 69907adec3041a6a89d192441a61481d80ee5806 Mon Sep 17 00:00:00 2001
|
||||
From: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
|
||||
Date: Wed, 12 Feb 2025 16:33:54 +0800
|
||||
Subject: EDAC/igen6: Fix the flood of invalid error reports
|
||||
|
||||
The ECC_ERROR_LOG register of certain SoCs may contain the invalid value
|
||||
~0, which results in a flood of invalid error reports in polling mode.
|
||||
|
||||
Fix the flood of invalid error reports by skipping the invalid ECC error
|
||||
log value ~0.
|
||||
|
||||
Fixes: e14232afa944 ("EDAC/igen6: Add polling support")
|
||||
Reported-by: Ramses <ramses@well-founded.dev>
|
||||
Closes: https://lore.kernel.org/all/OISL8Rv--F-9@well-founded.dev/
|
||||
Tested-by: Ramses <ramses@well-founded.dev>
|
||||
Reported-by: John <therealgraysky@proton.me>
|
||||
Closes: https://lore.kernel.org/all/p5YcxOE6M3Ncxpn2-Ia_wCt61EM4LwIiN3LroQvT_-G2jMrFDSOW5k2A9D8UUzD2toGpQBN1eI0sL5dSKnkO8iteZegLoQEj-DwQaMhGx4A=@proton.me/
|
||||
Tested-by: John <therealgraysky@proton.me>
|
||||
Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
|
||||
Signed-off-by: Tony Luck <tony.luck@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250212083354.31919-1-qiuxu.zhuo@intel.com
|
||||
---
|
||||
drivers/edac/igen6_edac.c | 21 +++++++++++++++------
|
||||
1 file changed, 15 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/edac/igen6_edac.c
|
||||
+++ b/drivers/edac/igen6_edac.c
|
||||
@@ -785,13 +785,22 @@ static u64 ecclog_read_and_clear(struct
|
||||
{
|
||||
u64 ecclog = readq(imc->window + ECC_ERROR_LOG_OFFSET);
|
||||
|
||||
- if (ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)) {
|
||||
- /* Clear CE/UE bits by writing 1s */
|
||||
- writeq(ecclog, imc->window + ECC_ERROR_LOG_OFFSET);
|
||||
- return ecclog;
|
||||
- }
|
||||
+ /*
|
||||
+ * Quirk: The ECC_ERROR_LOG register of certain SoCs may contain
|
||||
+ * the invalid value ~0. This will result in a flood of invalid
|
||||
+ * error reports in polling mode. Skip it.
|
||||
+ */
|
||||
+ if (ecclog == ~0)
|
||||
+ return 0;
|
||||
|
||||
- return 0;
|
||||
+ /* Neither a CE nor a UE. Skip it.*/
|
||||
+ if (!(ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)))
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Clear CE/UE bits by writing 1s */
|
||||
+ writeq(ecclog, imc->window + ECC_ERROR_LOG_OFFSET);
|
||||
+
|
||||
+ return ecclog;
|
||||
}
|
||||
|
||||
static void errsts_clear(struct igen6_imc *imc)
|
Reference in New Issue
Block a user