public inbox for linux-m68k@lists.linux-m68k.org
 help / color / mirror / Atom feed
* [PATCH RFC v2 0/8] m68k v4.4 backport fixes
@ 2024-02-05  2:32 Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 1/8] m68k/mm: Adjust VM area to be unmapped by gap size for __iounmap() Michael Schmitz
                   ` (7 more replies)
  0 siblings, 8 replies; 16+ messages in thread
From: Michael Schmitz @ 2024-02-05  2:32 UTC (permalink / raw)
  To: linux-m68k; +Cc: geert, uli, fthain, viro

CIP v4.4 backport patches for m68k. Basically everything needed
to make v4.4 work on my Falcon. This includes my iounmap() fix,
Al Viro's signal handling and uaccess page fault fixes, my 030
buserr_c fix for exception handling during page faults, and Finn's
030 signal frame fix. 

Patch 1 should be applied to v4.4-cip, or else ioremap / iounmap
has no chance to work on 030 processors.

Patches 2 and 3 have been applied to v4.4-cip.

Patches 4-6 are a prerequisite for patch 8, Finn Thain's 'm68k:
Move signal frame following exception on 68020/030' patch which
had been applied but failed to compile (see error reported in
https://lore.kernel.org/oe-kbuild-all/202401310920.sBSI4BHj-lkp@intel.com/
which has gone away with patches 4-6 in place).

Patch 7 is another page fault handling fix which should be applied
(though I have found no test case for it, and cannot say how common
that livelock issue is on m68k).

All patches as RFC version to give Geert and Al a chance to yell
at me in case I got details of these patches wrong. I don't claim
to understand signal handling in anywhere near the required level
of detail.

Tested on my 68030 Atari Falcon.

Cheers,

   Michael


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH RFC v2 1/8] m68k/mm: Adjust VM area to be unmapped by gap size for __iounmap()
  2024-02-05  2:32 [PATCH RFC v2 0/8] m68k v4.4 backport fixes Michael Schmitz
@ 2024-02-05  2:32 ` Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 2/8] m68k: Only force 030 bus error if PC not in exception table Michael Schmitz
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 16+ messages in thread
From: Michael Schmitz @ 2024-02-05  2:32 UTC (permalink / raw)
  To: linux-m68k; +Cc: geert, uli, fthain, viro, Michael Schmitz, stable

If 020/030 support is enabled, get_io_area() leaves an IO_SIZE gap
between mappings which is added to the vm_struct representing the
mapping.  __ioremap() uses the actual requested size (after alignment),
while __iounmap() is passed the size from the vm_struct.

On 020/030, early termination descriptors are used to set up mappings of
extent 'size', which are validated on unmapping. The unmapped gap of
size IO_SIZE defeats the sanity check of the pmd tables, causing
__iounmap() to loop forever on 030.

On 040/060, unmapping of page table entries does not check for a valid
mapping, so the umapping loop always completes there.

Adjust size to be unmapped by the gap that had been added in the
vm_struct prior.

This fixes the hang in atari_platform_init() reported a long time ago,
and a similar one reported by Finn recently (addressed by removing
ioremap() use from the SWIM driver.

Tested on my Falcon in 030 mode - untested but should work the same on
040/060 (the extra page tables cleared there would never have been set
up anyway).

Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
[geert: Minor commit description improvements]
[geert: This was fixed in 2.4.23, but not in 2.5.x]
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: stable@vger.kernel.org
---
 arch/m68k/mm/kmap.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/m68k/mm/kmap.c b/arch/m68k/mm/kmap.c
index 6e4955bc542b..fcd52cefee29 100644
--- a/arch/m68k/mm/kmap.c
+++ b/arch/m68k/mm/kmap.c
@@ -88,7 +88,8 @@ static inline void free_io_area(void *addr)
 	for (p = &iolist ; (tmp = *p) ; p = &tmp->next) {
 		if (tmp->addr == addr) {
 			*p = tmp->next;
-			__iounmap(tmp->addr, tmp->size);
+			/* remove gap added in get_io_area() */
+			__iounmap(tmp->addr, tmp->size - IO_SIZE);
 			kfree(tmp);
 			return;
 		}
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH RFC v2 2/8] m68k: Only force 030 bus error if PC not in exception table
  2024-02-05  2:32 [PATCH RFC v2 0/8] m68k v4.4 backport fixes Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 1/8] m68k/mm: Adjust VM area to be unmapped by gap size for __iounmap() Michael Schmitz
@ 2024-02-05  2:32 ` Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 3/8] m68k: include module.h to make use of exception handling in traps.c Michael Schmitz
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 16+ messages in thread
From: Michael Schmitz @ 2024-02-05  2:32 UTC (permalink / raw)
  To: linux-m68k; +Cc: geert, uli, fthain, viro, Michael Schmitz

__get_kernel_nofault() does copy data in supervisor mode when
forcing a task backtrace log through /proc/sysrq_trigger.
This is expected cause a bus error exception on e.g. NULL
pointer dereferencing when logging a kernel task has no
workqueue associated. This bus error ought to be ignored.

Our 030 bus error handler is ill equipped to deal with this:

Whenever ssw indicates a kernel mode access on a data fault,
we don't even attempt to handle the fault and instead always
send a SEGV signal (or panic). As a result, the check
for exception handling at the fault PC (buried in
send_sig_fault() which gets called from do_page_fault()
eventually) is never used.

In contrast, both 040 and 060 access error handlers do not
care whether a fault happened on supervisor mode access,
and will call do_page_fault() on those, ultimately honoring
the exception table.

Add a check in bus_error030 to call do_page_fault() in case
we do have an entry for the fault PC in our exception table.

I had attempted a fix for this earlier in 2019 that did rely
on testing pagefault_disabled() (see link below) to achieve
the same thing, but this patch should be more generic.

Tested on 030 Atari Falcon.

Reported-by: Eero Tamminen <oak@helsinkinet.fi>
Link: https://lore.kernel.org/r/alpine.LNX.2.21.1904091023540.25@nippy.intranet
Link: https://lore.kernel.org/r/63130691-1984-c423-c1f2-73bfd8d3dcd3@gmail.com
Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
Link: https://lore.kernel.org/r/20230301021107.26307-1-schmitzmic@gmail.com
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
 arch/m68k/kernel/traps.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c
index 6c9ca24830e9..c547140b8325 100644
--- a/arch/m68k/kernel/traps.c
+++ b/arch/m68k/kernel/traps.c
@@ -29,6 +29,7 @@
 #include <linux/init.h>
 #include <linux/ptrace.h>
 #include <linux/kallsyms.h>
+#include <linux/extable.h>
 
 #include <asm/setup.h>
 #include <asm/fpu.h>
@@ -549,7 +550,8 @@ static inline void bus_error030 (struct frame *fp)
 			errorcode |= 2;
 
 		if (mmusr & (MMU_I | MMU_WP)) {
-			if (ssw & 4) {
+			/* We might have an exception table for this PC */
+			if (ssw & 4 && !search_exception_tables(fp->ptregs.pc)) {
 				pr_err("Data %s fault at %#010lx in %s (pc=%#lx)\n",
 				       ssw & RW ? "read" : "write",
 				       fp->un.fmtb.daddr,
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH RFC v2 3/8] m68k: include module.h to make use of exception handling in traps.c
  2024-02-05  2:32 [PATCH RFC v2 0/8] m68k v4.4 backport fixes Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 1/8] m68k/mm: Adjust VM area to be unmapped by gap size for __iounmap() Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 2/8] m68k: Only force 030 bus error if PC not in exception table Michael Schmitz
@ 2024-02-05  2:32 ` Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly Michael Schmitz
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 16+ messages in thread
From: Michael Schmitz @ 2024-02-05  2:32 UTC (permalink / raw)
  To: linux-m68k; +Cc: geert, uli, fthain, viro, Michael Schmitz, cip-dev

Backporting commit 513138a14063760e (m68k: Only force 030
bus error if PC not in exception table) to v4.4 by the CIP
project revealed a build error due to extable.h not yet
available.

extable.h was split off module.h in v4.8 (commit
0ef7653797addea8) so amend 513138a14063760e accordingly.

Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202401302324.d3o6tgup-lkp@intel.com/
Cc: <cip-dev@lists.cip-project.org> # 4.4
Cc: Ulrich Hecht <uli@fpond.eu>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
---
 arch/m68k/kernel/traps.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c
index c547140b8325..2209214cf91c 100644
--- a/arch/m68k/kernel/traps.c
+++ b/arch/m68k/kernel/traps.c
@@ -29,7 +29,7 @@
 #include <linux/init.h>
 #include <linux/ptrace.h>
 #include <linux/kallsyms.h>
-#include <linux/extable.h>
+#include <linux/module.h>
 
 #include <asm/setup.h>
 #include <asm/fpu.h>
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly
  2024-02-05  2:32 [PATCH RFC v2 0/8] m68k v4.4 backport fixes Michael Schmitz
                   ` (2 preceding siblings ...)
  2024-02-05  2:32 ` [PATCH RFC v2 3/8] m68k: include module.h to make use of exception handling in traps.c Michael Schmitz
@ 2024-02-05  2:32 ` Michael Schmitz
  2024-02-05  8:10   ` Geert Uytterhoeven
  2024-02-05  2:32 ` [PATCH RFC v2 5/8] m68k: Update ->thread.esp0 before calling syscall_trace() in ret_from_signal Michael Schmitz
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 16+ messages in thread
From: Michael Schmitz @ 2024-02-05  2:32 UTC (permalink / raw)
  To: linux-m68k; +Cc: geert, uli, fthain, viro, Michael Schmitz

From: Al Viro <viro@zeniv.linux.org.uk>

When we have several pending signals, have entered with the kernel
with large exception frame *and* have already built at least one
sigframe, regs->stkadj is going to be non-zero and regs->format/sr/pc
are going to be junk - the real values are in shifted exception stack
frame we'd built when putting together the first sigframe.

If that happens, subsequent sigframes are going to be garbage.
Not hard to fix - just need to find the "adjusted" frame first
and look for format/vector/sr/pc in it.

MSch: Minor v4.4 backport merge conflict fixes.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
Reviewed-by: Michael Schmitz <schmitzmic@gmail.com>
Tested-by: Finn Thain <fthain@linux-m68k.org>
Link: https://lore.kernel.org/r/YP2dBIAPTaVvHiZ6@zeniv-ca.linux.org.uk
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
---
 arch/m68k/kernel/signal.c | 100 +++++++++++++++++---------------------
 1 file changed, 45 insertions(+), 55 deletions(-)

diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c
index af1c4f330aef..644c2ddc8aac 100644
--- a/arch/m68k/kernel/signal.c
+++ b/arch/m68k/kernel/signal.c
@@ -465,7 +465,7 @@ static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs)
 
 	if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) {
 		fpu_version = sc->sc_fpstate[0];
-		if (CPU_IS_020_OR_030 &&
+		if (CPU_IS_020_OR_030 && !regs->stkadj &&
 		    regs->vector >= (VEC_FPBRUC * 4) &&
 		    regs->vector <= (VEC_FPNAN * 4)) {
 			/* Clear pending exception in 68882 idle frame */
@@ -528,7 +528,7 @@ static inline int rt_save_fpu_state(struct ucontext __user *uc, struct pt_regs *
 		if (!(CPU_IS_060 || CPU_IS_COLDFIRE))
 			context_size = fpstate[1];
 		fpu_version = fpstate[0];
-		if (CPU_IS_020_OR_030 &&
+		if (CPU_IS_020_OR_030 && !regs->stkadj &&
 		    regs->vector >= (VEC_FPBRUC * 4) &&
 		    regs->vector <= (VEC_FPNAN * 4)) {
 			/* Clear pending exception in 68882 idle frame */
@@ -788,18 +788,24 @@ badframe:
 	return 0;
 }
 
+static inline struct pt_regs *rte_regs(struct pt_regs *regs)
+{
+	return (void *)regs + regs->stkadj;
+}
+
 static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
 			     unsigned long mask)
 {
+	struct pt_regs *tregs = rte_regs(regs);
 	sc->sc_mask = mask;
 	sc->sc_usp = rdusp();
 	sc->sc_d0 = regs->d0;
 	sc->sc_d1 = regs->d1;
 	sc->sc_a0 = regs->a0;
 	sc->sc_a1 = regs->a1;
-	sc->sc_sr = regs->sr;
-	sc->sc_pc = regs->pc;
-	sc->sc_formatvec = regs->format << 12 | regs->vector;
+	sc->sc_sr = tregs->sr;
+	sc->sc_pc = tregs->pc;
+	sc->sc_formatvec = tregs->format << 12 | tregs->vector;
 	save_a5_state(sc, regs);
 	save_fpu_state(sc, regs);
 }
@@ -807,6 +813,7 @@ static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
 static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *regs)
 {
 	struct switch_stack *sw = (struct switch_stack *)regs - 1;
+	struct pt_regs *tregs = rte_regs(regs);
 	greg_t __user *gregs = uc->uc_mcontext.gregs;
 	int err = 0;
 
@@ -827,9 +834,9 @@ static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *
 	err |= __put_user(sw->a5, &gregs[13]);
 	err |= __put_user(sw->a6, &gregs[14]);
 	err |= __put_user(rdusp(), &gregs[15]);
-	err |= __put_user(regs->pc, &gregs[16]);
-	err |= __put_user(regs->sr, &gregs[17]);
-	err |= __put_user((regs->format << 12) | regs->vector, &uc->uc_formatvec);
+	err |= __put_user(tregs->pc, &gregs[16]);
+	err |= __put_user(tregs->sr, &gregs[17]);
+	err |= __put_user((tregs->format << 12) | tregs->vector, &uc->uc_formatvec);
 	err |= rt_save_fpu_state(uc, regs);
 	return err;
 }
@@ -846,15 +853,14 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
 			struct pt_regs *regs)
 {
 	struct sigframe __user *frame;
-	int fsize = frame_extra_sizes(regs->format);
+	struct pt_regs *tregs = rte_regs(regs);
+	int fsize = frame_extra_sizes(tregs->format);
 	struct sigcontext context;
 	int err = 0, sig = ksig->sig;
 
 	if (fsize < 0) {
-#ifdef DEBUG
-		printk ("setup_frame: Unknown frame format %#x\n",
-			regs->format);
-#endif
+		pr_debug("setup_frame: Unknown frame format %#x\n",
+			 tregs->format);
 		return -EFAULT;
 	}
 
@@ -865,7 +871,7 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
 
 	err |= __put_user(sig, &frame->sig);
 
-	err |= __put_user(regs->vector, &frame->code);
+	err |= __put_user(tregs->vector, &frame->code);
 	err |= __put_user(&frame->sc, &frame->psc);
 
 	if (_NSIG_WORDS > 1)
@@ -890,36 +896,28 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
 
 	push_cache ((unsigned long) &frame->retcode);
 
-	/*
-	 * Set up registers for signal handler.  All the state we are about
-	 * to destroy is successfully copied to sigframe.
-	 */
-	wrusp ((unsigned long) frame);
-	regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
-	adjustformat(regs);
-
 	/*
 	 * This is subtle; if we build more than one sigframe, all but the
 	 * first one will see frame format 0 and have fsize == 0, so we won't
 	 * screw stkadj.
 	 */
-	if (fsize)
+	if (fsize) {
 		regs->stkadj = fsize;
-
-	/* Prepare to skip over the extra stuff in the exception frame.  */
-	if (regs->stkadj) {
-		struct pt_regs *tregs =
-			(struct pt_regs *)((ulong)regs + regs->stkadj);
-#ifdef DEBUG
-		printk("Performing stackadjust=%04x\n", regs->stkadj);
-#endif
-		/* This must be copied with decreasing addresses to
-                   handle overlaps.  */
+		tregs = rte_regs(regs);
+		pr_debug("Performing stackadjust=%04lx\n", regs->stkadj);
 		tregs->vector = 0;
 		tregs->format = 0;
-		tregs->pc = regs->pc;
 		tregs->sr = regs->sr;
 	}
+
+	/*
+	 * Set up registers for signal handler.  All the state we are about
+	 * to destroy is successfully copied to sigframe.
+	 */
+	wrusp ((unsigned long) frame);
+	tregs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+	adjustformat(regs);
+
 	return 0;
 }
 
@@ -927,7 +925,8 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
 			   struct pt_regs *regs)
 {
 	struct rt_sigframe __user *frame;
-	int fsize = frame_extra_sizes(regs->format);
+	struct pt_regs *tregs = rte_regs(regs);
+	int fsize = frame_extra_sizes(tregs->format);
 	int err = 0, sig = ksig->sig;
 
 	if (fsize < 0) {
@@ -978,36 +977,27 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
 
 	push_cache ((unsigned long) &frame->retcode);
 
-	/*
-	 * Set up registers for signal handler.  All the state we are about
-	 * to destroy is successfully copied to sigframe.
-	 */
-	wrusp ((unsigned long) frame);
-	regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
-	adjustformat(regs);
-
 	/*
 	 * This is subtle; if we build more than one sigframe, all but the
 	 * first one will see frame format 0 and have fsize == 0, so we won't
 	 * screw stkadj.
 	 */
-	if (fsize)
+	if (fsize) {
 		regs->stkadj = fsize;
-
-	/* Prepare to skip over the extra stuff in the exception frame.  */
-	if (regs->stkadj) {
-		struct pt_regs *tregs =
-			(struct pt_regs *)((ulong)regs + regs->stkadj);
-#ifdef DEBUG
-		printk("Performing stackadjust=%04x\n", regs->stkadj);
-#endif
-		/* This must be copied with decreasing addresses to
-                   handle overlaps.  */
+		tregs = rte_regs(regs);
+		pr_debug("Performing stackadjust=%04lx\n", regs->stkadj);
 		tregs->vector = 0;
 		tregs->format = 0;
-		tregs->pc = regs->pc;
 		tregs->sr = regs->sr;
 	}
+
+	/*
+	 * Set up registers for signal handler.  All the state we are about
+	 * to destroy is successfully copied to sigframe.
+	 */
+	wrusp ((unsigned long) frame);
+	tregs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+	adjustformat(regs);
 	return 0;
 }
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH RFC v2 5/8] m68k: Update ->thread.esp0 before calling syscall_trace() in ret_from_signal
  2024-02-05  2:32 [PATCH RFC v2 0/8] m68k v4.4 backport fixes Michael Schmitz
                   ` (3 preceding siblings ...)
  2024-02-05  2:32 ` [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly Michael Schmitz
@ 2024-02-05  2:32 ` Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 6/8] m68k: Leave stack mangling to asm wrapper of sigreturn() Michael Schmitz
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 16+ messages in thread
From: Michael Schmitz @ 2024-02-05  2:32 UTC (permalink / raw)
  To: linux-m68k; +Cc: geert, uli, fthain, viro

From: Al Viro <viro@zeniv.linux.org.uk>

We get there when sigreturn has performed obscene acts on kernel stack;
in particular, the location of pt_regs has shifted.  We are about to call
syscall_trace(), which might stop for tracer.  If that happens, we'd better
have task_pt_regs() returning correct result...

Fucked-up-by: Al Viro <viro@zeniv.linux.org.uk>
Fixes: bd6f56a75bb2 ("m68k: Missing syscall_trace() on sigreturn")
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
Reviewed-by: Michael Schmitz <schmitzmic@gmail.com>
Tested-by: Finn Thain <fthain@linux-m68k.org>
Link: https://lore.kernel.org/r/YP2dMWeV1LkHiOpr@zeniv-ca.linux.org.uk
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
 arch/m68k/kernel/entry.S | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S
index b54ac7aba850..dbeba043b703 100644
--- a/arch/m68k/kernel/entry.S
+++ b/arch/m68k/kernel/entry.S
@@ -173,6 +173,8 @@ ENTRY(ret_from_signal)
 	movel	%curptr@(TASK_STACK),%a1
 	tstb	%a1@(TINFO_FLAGS+2)
 	jge	1f
+	lea	%sp@(SWITCH_STACK_SIZE),%a1
+	movel	%a1,%curptr@(TASK_THREAD+THREAD_ESP0)
 	jbsr	syscall_trace
 1:	RESTORE_SWITCH_STACK
 	addql	#4,%sp
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH RFC v2 6/8] m68k: Leave stack mangling to asm wrapper of sigreturn()
  2024-02-05  2:32 [PATCH RFC v2 0/8] m68k v4.4 backport fixes Michael Schmitz
                   ` (4 preceding siblings ...)
  2024-02-05  2:32 ` [PATCH RFC v2 5/8] m68k: Update ->thread.esp0 before calling syscall_trace() in ret_from_signal Michael Schmitz
@ 2024-02-05  2:32 ` Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 7/8] m68k: fix livelock in uaccess Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 8/8] m68k: Move signal frame following exception on 68020/030 Michael Schmitz
  7 siblings, 0 replies; 16+ messages in thread
From: Michael Schmitz @ 2024-02-05  2:32 UTC (permalink / raw)
  To: linux-m68k; +Cc: geert, uli, fthain, viro, Michael Schmitz

From: Al Viro <viro@zeniv.linux.org.uk>

sigreturn has to deal with an unpleasant problem - exception stack frames
have different sizes, depending upon the exception (and processor model, as
well) and variable-sized part of exception frame may contain information
needed for instruction restart.  So when signal handler terminates and calls
sigreturn to resume the execution at the place where we'd been when we caught
the signal, it has to rearrange the frame at the bottom of kernel stack.
Worse, it might need to open a gap in the kernel stack, shifting pt_regs
towards lower addresses.

Doing that from C is insane - we'd need to shift stack frames (return addresses,
local variables, etc.) of C call chain, right under the nose of compiler and
hope it won't fall apart horribly.  What had been actually done is only slightly
less insane - an inline asm in mangle_kernel_stack() moved the stuff around,
then reset stack pointer and jumped to label in asm glue.

However, we can avoid all that mess if the asm wrapper we have to use anyway
would reserve some space on the stack between switch_stack and the C stack
frame of do_{rt_,}sigreturn().   Then C part can simply memmove() pt_regs +
switch_stack, memcpy() the variable part of exception frame into the opened
gap - all of that without inline asm, buggering C call chain, magical jumps
to asm labels, etc.

Asm wrapper would need to know where the moved switch_stack has ended up -
it might have been shifted into the gap we'd reserved before do_rt_sigreturn()
call.  That's where it needs to set the stack pointer to.  So let the C part
return just that and be done with that.

While we are at it, the call of berr_040cleanup() we need to do when
returning via 68040 bus error exception frame can be moved into C part
as well.

MSch: Minor v4.4 backport merge conflict and compile errors fixed.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
Reviewed-by: Michael Schmitz <schmitzmic@gmail.com>
Tested-by: Finn Thain <fthain@linux-m68k.org>
Link: https://lore.kernel.org/r/YP2dTQPm1wGPWFgD@zeniv-ca.linux.org.uk
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
---
 arch/m68k/68000/entry.S       |   3 -
 arch/m68k/coldfire/entry.S    |   3 -
 arch/m68k/include/asm/traps.h |   4 ++
 arch/m68k/kernel/entry.S      |  49 +++++++-------
 arch/m68k/kernel/signal.c     | 118 ++++++++++++----------------------
 5 files changed, 72 insertions(+), 105 deletions(-)

diff --git a/arch/m68k/68000/entry.S b/arch/m68k/68000/entry.S
index 259b3661b614..cce465e850fe 100644
--- a/arch/m68k/68000/entry.S
+++ b/arch/m68k/68000/entry.S
@@ -25,7 +25,6 @@
 .globl system_call
 .globl resume
 .globl ret_from_exception
-.globl ret_from_signal
 .globl sys_call_table
 .globl bad_interrupt
 .globl inthandler1
@@ -59,8 +58,6 @@ do_trace:
 	subql	#4,%sp			/* dummy return address */
 	SAVE_SWITCH_STACK
 	jbsr	syscall_trace_leave
-
-ret_from_signal:
 	RESTORE_SWITCH_STACK
 	addql	#4,%sp
 	jra	ret_from_exception
diff --git a/arch/m68k/coldfire/entry.S b/arch/m68k/coldfire/entry.S
index 52d312d5b4d4..1a75c1015847 100644
--- a/arch/m68k/coldfire/entry.S
+++ b/arch/m68k/coldfire/entry.S
@@ -51,7 +51,6 @@ sw_usp:
 .globl system_call
 .globl resume
 .globl ret_from_exception
-.globl ret_from_signal
 .globl sys_call_table
 .globl inthandler
 
@@ -98,8 +97,6 @@ ENTRY(system_call)
 	subql	#4,%sp			/* dummy return address */
 	SAVE_SWITCH_STACK
 	jbsr	syscall_trace_leave
-
-ret_from_signal:
 	RESTORE_SWITCH_STACK
 	addql	#4,%sp
 
diff --git a/arch/m68k/include/asm/traps.h b/arch/m68k/include/asm/traps.h
index 4aff3358fbaf..a9d5c1c870d3 100644
--- a/arch/m68k/include/asm/traps.h
+++ b/arch/m68k/include/asm/traps.h
@@ -267,6 +267,10 @@ struct frame {
     } un;
 };
 
+#ifdef CONFIG_M68040
+asmlinkage void berr_040cleanup(struct frame *fp);
+#endif
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* _M68K_TRAPS_H */
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S
index dbeba043b703..9a79733b20db 100644
--- a/arch/m68k/kernel/entry.S
+++ b/arch/m68k/kernel/entry.S
@@ -71,14 +71,38 @@ ENTRY(__sys_vfork)
 
 ENTRY(sys_sigreturn)
 	SAVE_SWITCH_STACK
+	movel	%sp,%a1			  	| switch_stack pointer
+	lea	%sp@(SWITCH_STACK_SIZE),%a0	| pt_regs pointer
+	lea     %sp@(-84),%sp			| leave a gap
+	movel	%a1,%sp@-
+	movel	%a0,%sp@-
 	jbsr	do_sigreturn
-	RESTORE_SWITCH_STACK
-	rts
+	jra	1f				| shared with rt_sigreturn()
 
 ENTRY(sys_rt_sigreturn)
 	SAVE_SWITCH_STACK
+	movel	%sp,%a1			  	| switch_stack pointer
+	lea	%sp@(SWITCH_STACK_SIZE),%a0	| pt_regs pointer
+	lea     %sp@(-84),%sp			| leave a gap
+	movel	%a1,%sp@-
+	movel	%a0,%sp@-
+	| stack contents:
+	|   [original pt_regs address] [original switch_stack address]
+	|   [gap] [switch_stack] [pt_regs] [exception frame]
 	jbsr	do_rt_sigreturn
+
+1:
+	| stack contents now:
+	|   [original pt_regs address] [original switch_stack address]
+	|   [unused part of the gap] [moved switch_stack] [moved pt_regs]
+	|   [replacement exception frame]
+	| return value of do_{rt_,}sigreturn() points to moved switch_stack.
+
+	movel	%d0,%sp				| discard the leftover junk
 	RESTORE_SWITCH_STACK
+	| stack contents now is just [syscall return address] [pt_regs] [frame]
+	| return pt_regs.d0
+	movel	%sp@(PT_OFF_D0+4),%d0
 	rts
 
 ENTRY(buserr)
@@ -169,27 +193,6 @@ do_trace_exit:
 	addql	#4,%sp
 	jra	.Lret_from_exception
 
-ENTRY(ret_from_signal)
-	movel	%curptr@(TASK_STACK),%a1
-	tstb	%a1@(TINFO_FLAGS+2)
-	jge	1f
-	lea	%sp@(SWITCH_STACK_SIZE),%a1
-	movel	%a1,%curptr@(TASK_THREAD+THREAD_ESP0)
-	jbsr	syscall_trace
-1:	RESTORE_SWITCH_STACK
-	addql	#4,%sp
-/* on 68040 complete pending writebacks if any */
-#ifdef CONFIG_M68040
-	bfextu	%sp@(PT_OFF_FORMATVEC){#0,#4},%d0
-	subql	#7,%d0				| bus error frame ?
-	jbne	1f
-	movel	%sp,%sp@-
-	jbsr	berr_040cleanup
-	addql	#4,%sp
-1:
-#endif
-	jra	.Lret_from_exception
-
 ENTRY(system_call)
 	SAVE_ALL_SYS
 
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c
index 644c2ddc8aac..8fb8ee804b3a 100644
--- a/arch/m68k/kernel/signal.c
+++ b/arch/m68k/kernel/signal.c
@@ -594,57 +594,35 @@ static inline int rt_save_fpu_state(struct ucontext __user *uc, struct pt_regs *
 static int mangle_kernel_stack(struct pt_regs *regs, int formatvec,
 			       void __user *fp)
 {
-	int fsize = frame_extra_sizes(formatvec >> 12);
-	if (fsize < 0) {
+	int extra = frame_extra_sizes(formatvec >> 12);
+	char buf[sizeof(((struct frame *)0)->un)];
+
+	if (extra < 0) {
 		/*
 		 * user process trying to return with weird frame format
 		 */
-#ifdef DEBUG
-		printk("user process returning with weird frame format\n");
-#endif
-		return 1;
+		pr_debug("user process returning with weird frame format\n");
+		return -1;
 	}
-	if (!fsize) {
-		regs->format = formatvec >> 12;
-		regs->vector = formatvec & 0xfff;
-	} else {
-		struct switch_stack *sw = (struct switch_stack *)regs - 1;
-		unsigned long buf[fsize / 2]; /* yes, twice as much */
-
-		/* that'll make sure that expansion won't crap over data */
-		if (copy_from_user(buf + fsize / 4, fp, fsize))
-			return 1;
-
-		/* point of no return */
-		regs->format = formatvec >> 12;
-		regs->vector = formatvec & 0xfff;
-#define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack))
-		__asm__ __volatile__ (
-#ifdef CONFIG_COLDFIRE
-			 "   movel %0,%/sp\n\t"
-			 "   bra ret_from_signal\n"
-#else
-			 "   movel %0,%/a0\n\t"
-			 "   subl %1,%/a0\n\t"     /* make room on stack */
-			 "   movel %/a0,%/sp\n\t"  /* set stack pointer */
-			 /* move switch_stack and pt_regs */
-			 "1: movel %0@+,%/a0@+\n\t"
-			 "   dbra %2,1b\n\t"
-			 "   lea %/sp@(%c3),%/a0\n\t" /* add offset of fmt */
-			 "   lsrl  #2,%1\n\t"
-			 "   subql #1,%1\n\t"
-			 /* copy to the gap we'd made */
-			 "2: movel %4@+,%/a0@+\n\t"
-			 "   dbra %1,2b\n\t"
-			 "   bral ret_from_signal\n"
+	if (extra && copy_from_user(buf, fp, extra))
+		return -1;
+	regs->format = formatvec >> 12;
+	regs->vector = formatvec & 0xfff;
+	if (extra) {
+		void *p = (struct switch_stack *)regs - 1;
+		struct frame *new = (void *)regs - extra;
+		int size = sizeof(struct pt_regs)+sizeof(struct switch_stack);
+
+		memmove(p - extra, p, size);
+		memcpy(p - extra + size, buf, extra);
+		current->thread.esp0 = (unsigned long)&new->ptregs;
+#ifdef CONFIG_M68040
+		/* on 68040 complete pending writebacks if any */
+		if (new->ptregs.format == 7) // bus error frame
+			berr_040cleanup(new);
 #endif
-			 : /* no outputs, it doesn't ever return */
-			 : "a" (sw), "d" (fsize), "d" (frame_offset/4-1),
-			   "n" (frame_offset), "a" (buf + fsize/4)
-			 : "a0");
-#undef frame_offset
 	}
-	return 0;
+	return extra;
 }
 
 static inline int
@@ -652,14 +630,13 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __u
 {
 	int formatvec;
 	struct sigcontext context;
-	int err = 0;
 
 	/* Always make any pending restarted system calls return -EINTR */
 	current->restart_block.fn = do_no_restart_syscall;
 
 	/* get previous context */
 	if (copy_from_user(&context, usc, sizeof(context)))
-		goto badframe;
+		return -1;
 
 	/* restore passed registers */
 	regs->d0 = context.sc_d0;
@@ -672,15 +649,10 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __u
 	wrusp(context.sc_usp);
 	formatvec = context.sc_formatvec;
 
-	err = restore_fpu_state(&context);
-
-	if (err || mangle_kernel_stack(regs, formatvec, fp))
-		goto badframe;
-
-	return 0;
+	if (restore_fpu_state(&context))
+		return -1;
 
-badframe:
-	return 1;
+	return mangle_kernel_stack(regs, formatvec, fp);
 }
 
 static inline int
@@ -697,7 +669,7 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
 
 	err = __get_user(temp, &uc->uc_mcontext.version);
 	if (temp != MCONTEXT_VERSION)
-		goto badframe;
+		return -1;
 	/* restore passed registers */
 	err |= __get_user(regs->d0, &gregs[0]);
 	err |= __get_user(regs->d1, &gregs[1]);
@@ -726,24 +698,17 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
 	err |= restore_altstack(&uc->uc_stack);
 
 	if (err)
-		goto badframe;
-
-	if (mangle_kernel_stack(regs, temp, &uc->uc_extra))
-		goto badframe;
+		return -1;
 
-	return 0;
-
-badframe:
-	return 1;
+	return mangle_kernel_stack(regs, temp, &uc->uc_extra);
 }
 
-asmlinkage int do_sigreturn(unsigned long __unused)
+asmlinkage void *do_sigreturn(struct pt_regs *regs, struct switch_stack *sw)
 {
-	struct switch_stack *sw = (struct switch_stack *) &__unused;
-	struct pt_regs *regs = (struct pt_regs *) (sw + 1);
 	unsigned long usp = rdusp();
 	struct sigframe __user *frame = (struct sigframe __user *)(usp - 4);
 	sigset_t set;
+	int size;
 
 	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
 		goto badframe;
@@ -755,22 +720,22 @@ asmlinkage int do_sigreturn(unsigned long __unused)
 
 	set_current_blocked(&set);
 
-	if (restore_sigcontext(regs, &frame->sc, frame + 1))
+	size = restore_sigcontext(regs, &frame->sc, frame + 1);
+	if (size < 0)
 		goto badframe;
-	return regs->d0;
+	return (void *)sw - size;
 
 badframe:
 	force_sig(SIGSEGV, current);
-	return 0;
+	return sw;
 }
 
-asmlinkage int do_rt_sigreturn(unsigned long __unused)
+asmlinkage void *do_rt_sigreturn(struct pt_regs *regs, struct switch_stack *sw)
 {
-	struct switch_stack *sw = (struct switch_stack *) &__unused;
-	struct pt_regs *regs = (struct pt_regs *) (sw + 1);
 	unsigned long usp = rdusp();
 	struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(usp - 4);
 	sigset_t set;
+	int size;
 
 	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
 		goto badframe;
@@ -779,13 +744,14 @@ asmlinkage int do_rt_sigreturn(unsigned long __unused)
 
 	set_current_blocked(&set);
 
-	if (rt_restore_ucontext(regs, sw, &frame->uc))
+	size = rt_restore_ucontext(regs, sw, &frame->uc);
+	if (size < 0)
 		goto badframe;
-	return regs->d0;
+	return (void *)sw - size;
 
 badframe:
 	force_sig(SIGSEGV, current);
-	return 0;
+	return sw;
 }
 
 static inline struct pt_regs *rte_regs(struct pt_regs *regs)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH RFC v2 7/8] m68k: fix livelock in uaccess
  2024-02-05  2:32 [PATCH RFC v2 0/8] m68k v4.4 backport fixes Michael Schmitz
                   ` (5 preceding siblings ...)
  2024-02-05  2:32 ` [PATCH RFC v2 6/8] m68k: Leave stack mangling to asm wrapper of sigreturn() Michael Schmitz
@ 2024-02-05  2:32 ` Michael Schmitz
  2024-02-05  2:32 ` [PATCH RFC v2 8/8] m68k: Move signal frame following exception on 68020/030 Michael Schmitz
  7 siblings, 0 replies; 16+ messages in thread
From: Michael Schmitz @ 2024-02-05  2:32 UTC (permalink / raw)
  To: linux-m68k; +Cc: geert, uli, fthain, viro, Michael Schmitz

From: Al Viro <viro@zeniv.linux.org.uk>

m68k equivalent of 26178ec11ef3 "x86: mm: consolidate VM_FAULT_RETRY handling"
If e.g. get_user() triggers a page fault and a fatal signal is caught, we might
end up with handle_mm_fault() returning VM_FAULT_RETRY and not doing anything
to page tables.  In such case we must *not* return to the faulting insn -
that would repeat the entire thing without making any progress; what we need
instead is to treat that as failed (user) memory access.

MSch: v4.4 backport compile errors fixes.

Tested-by: Finn Thain <fthain@linux-m68k.org>
Tested-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
---
 arch/m68k/mm/fault.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c
index 6a94cdd0c830..f94df64c3784 100644
--- a/arch/m68k/mm/fault.c
+++ b/arch/m68k/mm/fault.c
@@ -139,8 +139,11 @@ good_area:
 	fault = handle_mm_fault(mm, vma, address, flags);
 	pr_debug("handle_mm_fault returns %d\n", fault);
 
-	if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
+	if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) {
+		if (!user_mode(regs))
+			goto no_context;
 		return 0;
+	}
 
 	if (unlikely(fault & VM_FAULT_ERROR)) {
 		if (fault & VM_FAULT_OOM)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH RFC v2 8/8] m68k: Move signal frame following exception on 68020/030
  2024-02-05  2:32 [PATCH RFC v2 0/8] m68k v4.4 backport fixes Michael Schmitz
                   ` (6 preceding siblings ...)
  2024-02-05  2:32 ` [PATCH RFC v2 7/8] m68k: fix livelock in uaccess Michael Schmitz
@ 2024-02-05  2:32 ` Michael Schmitz
  7 siblings, 0 replies; 16+ messages in thread
From: Michael Schmitz @ 2024-02-05  2:32 UTC (permalink / raw)
  To: linux-m68k
  Cc: geert, uli, fthain, viro, Michael Schmitz, Andreas Schwab, stable

From: Finn Thain <fthain@linux-m68k.org>

On 68030/020, an instruction such as, moveml %a2-%a3/%a5,%sp@- may cause
a stack page fault during instruction execution (i.e. not at an
instruction boundary) and produce a format 0xB exception frame.

In this situation, the value of USP will be unreliable.  If a signal is
to be delivered following the exception, this USP value is used to
calculate the location for a signal frame.  This can result in a
corrupted user stack.

The corruption was detected in dash (actually in glibc) where it showed
up as an intermittent "stack smashing detected" message and crash
following signal delivery for SIGCHLD.

It was hard to reproduce that failure because delivery of the signal
raced with the page fault and because the kernel places an unpredictable
gap of up to 7 bytes between the USP and the signal frame.

A format 0xB exception frame can be produced by a bus error or an
address error.  The 68030 Users Manual says that address errors occur
immediately upon detection during instruction prefetch.  The instruction
pipeline allows prefetch to overlap with other instructions, which means
an address error can arise during the execution of a different
instruction.  So it seems likely that this patch may help in the address
error case also.

Reported-and-tested-by: Stan Johnson <userm57@yahoo.com>
Link: https://lore.kernel.org/all/CAMuHMdW3yD22_ApemzW_6me3adq6A458u1_F0v-1EYwK_62jPA@mail.gmail.com/
Cc: Michael Schmitz <schmitzmic@gmail.com>
Cc: Andreas Schwab <schwab@linux-m68k.org>
Cc: stable@vger.kernel.org
Co-developed-by: Michael Schmitz <schmitzmic@gmail.com>
Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
Signed-off-by: Finn Thain <fthain@linux-m68k.org>
Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
Link: https://lore.kernel.org/r/9e66262a754fcba50208aa424188896cc52a1dd1.1683365892.git.fthain@linux-m68k.org
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
 arch/m68k/kernel/signal.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c
index 8fb8ee804b3a..de7c1bde62bc 100644
--- a/arch/m68k/kernel/signal.c
+++ b/arch/m68k/kernel/signal.c
@@ -808,11 +808,17 @@ static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *
 }
 
 static inline void __user *
-get_sigframe(struct ksignal *ksig, size_t frame_size)
+get_sigframe(struct ksignal *ksig, struct pt_regs *tregs, size_t frame_size)
 {
 	unsigned long usp = sigsp(rdusp(), ksig);
+	unsigned long gap = 0;
 
-	return (void __user *)((usp - frame_size) & -8UL);
+	if (CPU_IS_020_OR_030 && tregs->format == 0xb) {
+		/* USP is unreliable so use worst-case value */
+		gap = 256;
+	}
+
+	return (void __user *)((usp - gap - frame_size) & -8UL);
 }
 
 static int setup_frame(struct ksignal *ksig, sigset_t *set,
@@ -830,7 +836,7 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
 		return -EFAULT;
 	}
 
-	frame = get_sigframe(ksig, sizeof(*frame) + fsize);
+	frame = get_sigframe(ksig, tregs, sizeof(*frame) + fsize);
 
 	if (fsize)
 		err |= copy_to_user (frame + 1, regs + 1, fsize);
@@ -903,7 +909,7 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
 		return -EFAULT;
 	}
 
-	frame = get_sigframe(ksig, sizeof(*frame));
+	frame = get_sigframe(ksig, tregs, sizeof(*frame));
 
 	if (fsize)
 		err |= copy_to_user (&frame->uc.uc_extra, regs + 1, fsize);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly
  2024-02-05  2:32 ` [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly Michael Schmitz
@ 2024-02-05  8:10   ` Geert Uytterhoeven
  2024-02-05 10:15     ` Michael Schmitz
  0 siblings, 1 reply; 16+ messages in thread
From: Geert Uytterhoeven @ 2024-02-05  8:10 UTC (permalink / raw)
  To: Michael Schmitz; +Cc: linux-m68k, uli, fthain, viro

Hi Michael,

Thanks for your patch!

On Mon, Feb 5, 2024 at 3:32 AM Michael Schmitz <schmitzmic@gmail.com> wrote:
> From: Al Viro <viro@zeniv.linux.org.uk>

When submitting a backport, please add lines like

    commit 4bb0bd81ce5e97092dfda6a106d414b703ec0ee8 upstream.

> When we have several pending signals, have entered with the kernel
> with large exception frame *and* have already built at least one
> sigframe, regs->stkadj is going to be non-zero and regs->format/sr/pc
> are going to be junk - the real values are in shifted exception stack
> frame we'd built when putting together the first sigframe.
>
> If that happens, subsequent sigframes are going to be garbage.
> Not hard to fix - just need to find the "adjusted" frame first
> and look for format/vector/sr/pc in it.
>
> MSch: Minor v4.4 backport merge conflict fixes.

Please move this to "[MSch: ...] below...

>
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
> Tested-by: Michael Schmitz <schmitzmic@gmail.com>
> Reviewed-by: Michael Schmitz <schmitzmic@gmail.com>
> Tested-by: Finn Thain <fthain@linux-m68k.org>
> Link: https://lore.kernel.org/r/YP2dBIAPTaVvHiZ6@zeniv-ca.linux.org.uk
> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>

... i.e. here.

> Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>

Good.
Please add your SoB on all patches you handle, some lack it.

Thanks a lot for taking care of this!

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly
  2024-02-05  8:10   ` Geert Uytterhoeven
@ 2024-02-05 10:15     ` Michael Schmitz
  2024-02-08 11:53       ` Ulrich Hecht
  0 siblings, 1 reply; 16+ messages in thread
From: Michael Schmitz @ 2024-02-05 10:15 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linux-m68k, uli, fthain, viro

Hi Geert,

thanks for your feedback!

Am 05.02.2024 um 21:10 schrieb Geert Uytterhoeven:
> Hi Michael,
>
> Thanks for your patch!
>
> On Mon, Feb 5, 2024 at 3:32 AM Michael Schmitz <schmitzmic@gmail.com> wrote:
>> From: Al Viro <viro@zeniv.linux.org.uk>
>
> When submitting a backport, please add lines like
>
>     commit 4bb0bd81ce5e97092dfda6a106d414b703ec0ee8 upstream.

Will do. I did wonder how the original commit could be found to prevent 
duplicates...

On that note - Uli: would you prefer the entire backport series, or only 
those you do not already have?

>> When we have several pending signals, have entered with the kernel
>> with large exception frame *and* have already built at least one
>> sigframe, regs->stkadj is going to be non-zero and regs->format/sr/pc
>> are going to be junk - the real values are in shifted exception stack
>> frame we'd built when putting together the first sigframe.
>>
>> If that happens, subsequent sigframes are going to be garbage.
>> Not hard to fix - just need to find the "adjusted" frame first
>> and look for format/vector/sr/pc in it.
>>
>> MSch: Minor v4.4 backport merge conflict fixes.
>
> Please move this to "[MSch: ...] below...
>
>>
>> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
>> Tested-by: Michael Schmitz <schmitzmic@gmail.com>
>> Reviewed-by: Michael Schmitz <schmitzmic@gmail.com>
>> Tested-by: Finn Thain <fthain@linux-m68k.org>
>> Link: https://lore.kernel.org/r/YP2dBIAPTaVvHiZ6@zeniv-ca.linux.org.uk
>> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
>
> ... i.e. here.

OK.

>
>> Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
>
> Good.
> Please add your SoB on all patches you handle, some lack it.

That would have been the ones that did not need any extra handling. But 
I take your point ...

> Thanks a lot for taking care of this!

No matter!

Cheers,

	Michael

>
> Gr{oetje,eeting}s,
>
>                         Geert
>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly
  2024-02-05 10:15     ` Michael Schmitz
@ 2024-02-08 11:53       ` Ulrich Hecht
  2024-02-08 22:51         ` Finn Thain
  0 siblings, 1 reply; 16+ messages in thread
From: Ulrich Hecht @ 2024-02-08 11:53 UTC (permalink / raw)
  To: Michael Schmitz, Geert Uytterhoeven; +Cc: linux-m68k, fthain, viro


> On 02/05/2024 11:15 AM CET Michael Schmitz <schmitzmic@gmail.com> wrote:
> On that note - Uli: would you prefer the entire backport series, or only 
> those you do not already have?

I'd prefer to only get what's missing.

CU
Uli

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly
  2024-02-08 11:53       ` Ulrich Hecht
@ 2024-02-08 22:51         ` Finn Thain
  2024-02-12  0:48           ` Michael Schmitz
  2024-02-12 10:02           ` Ulrich Hecht
  0 siblings, 2 replies; 16+ messages in thread
From: Finn Thain @ 2024-02-08 22:51 UTC (permalink / raw)
  To: Ulrich Hecht, Al Viro; +Cc: Michael Schmitz, Geert Uytterhoeven, linux-m68k


On Thu, 8 Feb 2024, Ulrich Hecht wrote:

> 
> > On 02/05/2024 11:15 AM CET Michael Schmitz <schmitzmic@gmail.com> 
> > wrote: On that note - Uli: would you prefer the entire backport 
> > series, or only those you do not already have?
> 
> I'd prefer to only get what's missing.
> 

Ulrich, I imagine that you would normally receive fixes via the 
corresponding -stable trees. If Michael's series went into 
stable/linux-4.19.y you could cherry-pick from there for your v4.4.y tree 
and maybe avoid some merge conflicts that way. So perhaps we should ask 
the -stable maintainers to backport first (?)

Al, I see that the following commits are missing from stable/linux-v6.1 
and older trees, despite the word "fix" in the subject. Reading the merge 
commit 1a8d05a726dc "Merge tag 'pull-fixes' of 
git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs" suggests to me 
that these are old bugs...

bd75497a77cc m68k: fix livelock in uaccess
d835eb3a57de riscv: fix livelock in uaccess
0b92ed09cb9f hexagon: fix livelock in uaccess
15261678a8c2 parisc: fix livelock in uaccess
dce45493aff3 alpha: fix livelock in uaccess
79c54c97c773 sparc: fix livelock in uaccess
d088af1e221c ia64: fix livelock in uaccess
a1179ac743e8 microblaze: fix livelock in uaccess
e902e508c5b2 nios2: fix livelock in uaccess
caa82ae7ef52 openrisc: fix livelock in uaccess

In addition, stable/linux-v5.10 and the older trees lack the following 
commit, despite the Fixes tag.

50e43a573344 m68k: Update ->thread.esp0 before calling syscall_trace() in ret_from_signal

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly
  2024-02-08 22:51         ` Finn Thain
@ 2024-02-12  0:48           ` Michael Schmitz
  2024-02-12 10:02           ` Ulrich Hecht
  1 sibling, 0 replies; 16+ messages in thread
From: Michael Schmitz @ 2024-02-12  0:48 UTC (permalink / raw)
  To: Finn Thain, Ulrich Hecht, Al Viro; +Cc: Geert Uytterhoeven, linux-m68k


On 9/02/24 11:51, Finn Thain wrote:
> On Thu, 8 Feb 2024, Ulrich Hecht wrote:
>
>>> On 02/05/2024 11:15 AM CET Michael Schmitz <schmitzmic@gmail.com>
>>> wrote: On that note - Uli: would you prefer the entire backport
>>> series, or only those you do not already have?
>> I'd prefer to only get what's missing.
>>
> Ulrich, I imagine that you would normally receive fixes via the
> corresponding -stable trees. If Michael's series went into
> stable/linux-4.19.y you could cherry-pick from there for your v4.4.y tree
> and maybe avoid some merge conflicts that way. So perhaps we should ask
> the -stable maintainers to backport first (?)
>
> Al, I see that the following commits are missing from stable/linux-v6.1
> and older trees, despite the word "fix" in the subject. Reading the merge
> commit 1a8d05a726dc "Merge tag 'pull-fixes' of
> git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs" suggests to me
> that these are old bugs...

Only

bd75497a77cc m68k: fix livelock in uaccess, and

0d20abde987b m68k: Leave stack mangling to asm wrapper of sigreturn()

need changes to apply to v4.19. Only compile tested so far.

Happy to submit the adjusted patches to stable, and ask the stable 
maintainers to pick up the missing bits from Linus' or Geert's tree.

Would that be good enough?

Cheers,

Michael

>
> bd75497a77cc m68k: fix livelock in uaccess
> d835eb3a57de riscv: fix livelock in uaccess
> 0b92ed09cb9f hexagon: fix livelock in uaccess
> 15261678a8c2 parisc: fix livelock in uaccess
> dce45493aff3 alpha: fix livelock in uaccess
> 79c54c97c773 sparc: fix livelock in uaccess
> d088af1e221c ia64: fix livelock in uaccess
> a1179ac743e8 microblaze: fix livelock in uaccess
> e902e508c5b2 nios2: fix livelock in uaccess
> caa82ae7ef52 openrisc: fix livelock in uaccess
>
> In addition, stable/linux-v5.10 and the older trees lack the following
> commit, despite the Fixes tag.
>
> 50e43a573344 m68k: Update ->thread.esp0 before calling syscall_trace() in ret_from_signal

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly
  2024-02-08 22:51         ` Finn Thain
  2024-02-12  0:48           ` Michael Schmitz
@ 2024-02-12 10:02           ` Ulrich Hecht
  2024-02-13  5:05             ` Finn Thain
  1 sibling, 1 reply; 16+ messages in thread
From: Ulrich Hecht @ 2024-02-12 10:02 UTC (permalink / raw)
  To: Finn Thain, Al Viro; +Cc: Michael Schmitz, Geert Uytterhoeven, linux-m68k


> On 02/08/2024 11:51 PM CET Finn Thain <fthain@linux-m68k.org> wrote:
> Ulrich, I imagine that you would normally receive fixes via the 
> corresponding -stable trees. If Michael's series went into 
> stable/linux-4.19.y you could cherry-pick from there for your v4.4.y tree 
> and maybe avoid some merge conflicts that way.

That would work for me.

CU
Uli

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly
  2024-02-12 10:02           ` Ulrich Hecht
@ 2024-02-13  5:05             ` Finn Thain
  0 siblings, 0 replies; 16+ messages in thread
From: Finn Thain @ 2024-02-13  5:05 UTC (permalink / raw)
  To: Ulrich Hecht
  Cc: Al Viro, Michael Schmitz, Geert Uytterhoeven, linux-m68k, stable

[Cc: stable]

On Mon, 12 Feb 2024, Ulrich Hecht wrote:

> 
> > On 02/08/2024 11:51 PM CET Finn Thain <fthain@linux-m68k.org> wrote:
> > Ulrich, I imagine that you would normally receive fixes via the 
> > corresponding -stable trees. If Michael's series went into 
> > stable/linux-4.19.y you could cherry-pick from there for your v4.4.y tree 
> > and maybe avoid some merge conflicts that way.
> 
> That would work for me.
> 

OK. Here's the relevant commit. It fixes bd6f56a75bb2 which first appeared 
in v2.6.38-rc1. I believe this can be cherry-picked without any conflicts.

50e43a573344 m68k: Update ->thread.esp0 before calling syscall_trace() in ret_from_signal

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2024-02-13  5:05 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-05  2:32 [PATCH RFC v2 0/8] m68k v4.4 backport fixes Michael Schmitz
2024-02-05  2:32 ` [PATCH RFC v2 1/8] m68k/mm: Adjust VM area to be unmapped by gap size for __iounmap() Michael Schmitz
2024-02-05  2:32 ` [PATCH RFC v2 2/8] m68k: Only force 030 bus error if PC not in exception table Michael Schmitz
2024-02-05  2:32 ` [PATCH RFC v2 3/8] m68k: include module.h to make use of exception handling in traps.c Michael Schmitz
2024-02-05  2:32 ` [PATCH RFC v2 4/8] m68k: Handle arrivals of multiple signals correctly Michael Schmitz
2024-02-05  8:10   ` Geert Uytterhoeven
2024-02-05 10:15     ` Michael Schmitz
2024-02-08 11:53       ` Ulrich Hecht
2024-02-08 22:51         ` Finn Thain
2024-02-12  0:48           ` Michael Schmitz
2024-02-12 10:02           ` Ulrich Hecht
2024-02-13  5:05             ` Finn Thain
2024-02-05  2:32 ` [PATCH RFC v2 5/8] m68k: Update ->thread.esp0 before calling syscall_trace() in ret_from_signal Michael Schmitz
2024-02-05  2:32 ` [PATCH RFC v2 6/8] m68k: Leave stack mangling to asm wrapper of sigreturn() Michael Schmitz
2024-02-05  2:32 ` [PATCH RFC v2 7/8] m68k: fix livelock in uaccess Michael Schmitz
2024-02-05  2:32 ` [PATCH RFC v2 8/8] m68k: Move signal frame following exception on 68020/030 Michael Schmitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox