Re: [PATCH] alpha: Add extra switch_stack frames in exit, exec, and kernel threads
From: Eric W. Biederman <hidden>
Date: 2021-06-16 16:33:58
Also in:
linux-alpha, linux-m68k, lkml
Linus Torvalds [off-list ref] writes:
On Tue, Jun 15, 2021 at 12:36 PM Eric W. Biederman [off-list ref] wrote:quoted
I looked and there nothing I can do that is not arch specific, so whack the moles with a minimal backportable fix. This change survives boot testing on qemu-system-alpha.So as mentioned in the other thread, I think this patch is exactly right. However, the need for this partquoted
@@ -785,6 +785,7 @@ ret_from_kernel_thread: mov $9, $27 mov $10, $16 jsr $26, ($9) + lda $sp, SWITCH_STACK_SIZE($sp) br $31, ret_to_user .end ret_from_kernel_threadobviously eluded me in my "how about something like this", and I had to really try to figure out why we'd ever return. Which is why I came to that "oooh - kernel_execve()" realization. It might be good to comment on that somewhere. And if you can think of some other case, that should be mentioned too. Anyway, thanks for looking into this odd case. And if you have a test-case for this all, it really would be a good thing. Yes, it should only affect a couple of odd-ball architectures, but still... It would also be good to hear that you actually did verify the behavior of this patch wrt that ptrace-of-io-worker-threads case..
*Grumble* So just going through and looking to see what it takes to instrument and put in warnings when things go wrong I have found another issue. Today there exists: PTRACE_EVENT_FORK PTRACE_EVENT_VFORK PTRACE_EVENT_CLONE Which happens after the actual fork operation in the kernel. The following code wraps those operations in arch/alpha/kernel/entry.S .macro fork_like name .align 4 .globl alpha_\name .ent alpha_\name alpha_\name: .prologue 0 bsr $1, do_switch_stack jsr $26, sys_\name ldq $26, 56($sp) lda $sp, SWITCH_STACK_SIZE($sp) ret .end alpha_\name .endm The code in the kernel when calls in fork.c calls ptrace_event_pid which ultimately calls ptrace_stop. So userspace can reasonably expect to stop the process and change it's registers. With unconditionally popping the switch stack any of those registers that are modified are lost. So I will update my changes to handle that case as well. Eric