Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/alpha/alpha - Give lwp0 the same kernel thread back...
details: https://anonhg.NetBSD.org/src/rev/bfd92fd4c96e
branches: trunk
changeset: 938881:bfd92fd4c96e
user: thorpej <thorpej%NetBSD.org@localhost>
date: Fri Sep 18 00:11:31 2020 +0000
description:
- Give lwp0 the same kernel thread backstop as all of the others get
in cpu_lwp_fork().
- Add a bunch of comments to lwp_trampoline() to explain what's going on.
- In alpha_softint_switchto() tweak how we save the RA in the stack frame.
diffstat:
sys/arch/alpha/alpha/locore.s | 39 +++++++++++++++++++++++++--------------
1 files changed, 25 insertions(+), 14 deletions(-)
diffs (95 lines):
diff -r 19c1bd98bf41 -r bfd92fd4c96e sys/arch/alpha/alpha/locore.s
--- a/sys/arch/alpha/alpha/locore.s Fri Sep 18 00:09:29 2020 +0000
+++ b/sys/arch/alpha/alpha/locore.s Fri Sep 18 00:11:31 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.s,v 1.134 2020/09/17 00:48:56 thorpej Exp $ */
+/* $NetBSD: locore.s,v 1.135 2020/09/18 00:11:31 thorpej Exp $ */
/*-
* Copyright (c) 1999, 2000, 2019 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
#include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: locore.s,v 1.134 2020/09/17 00:48:56 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locore.s,v 1.135 2020/09/18 00:11:31 thorpej Exp $");
#include "assym.h"
@@ -159,8 +159,17 @@
/*
* All ready to go! Call main()!
+ *
+ * We're going to play a little trick there, though. We are
+ * going to fake our return address as the kthread backstop.
+ * Hitting the backstop will trigger a panic, and we want lwp0
+ * to work like other kthreads in that regard. We will still
+ * leep the "main returned" backstop here in case something
+ * goes horribly wrong.
*/
- CALL(main)
+ lda ra, alpha_kthread_backstop
+ jsr s0, main
+ ldgp gp, 0(s0)
/* This should never happen. */
PANIC("main() returned",Lmain_returned_pmsg)
@@ -669,7 +678,7 @@
ldq a3, L_PCB(a0) /* a3 = from->l_pcb */
lda sp, -16(sp) /* set up stack frame */
- stq ra, (16-8)(sp) /* save ra */
+ stq ra, 0(sp) /* save ra */
/*
* Step 1: Save the current LWP's context. We don't
@@ -727,7 +736,7 @@
SET_CURLWP(s0) /* clobbers a0, v0, t0, t8..t11 */
ldq sp, PCB_HWPCB_KSP(a3) /* restore sp */
ldq s0, PCB_CONTEXT+(0 * 8)(a3) /* restore s0 */
- ldq ra, (16-8)(sp) /* restore ra */
+ ldq ra, 0(sp) /* restore ra */
lda sp, 16(sp) /* pop stack frame */
RET
END(alpha_softint_switchto)
@@ -746,7 +755,7 @@
* Step 2: Pop alpha_softint_switchto()'s stack frame
* and return.
*/
- ldq ra, (16-8)(sp) /* restore ra */
+ ldq ra, 0(sp) /* restore ra */
lda sp, 16(sp) /* pop stack frame */
RET
END(alpha_softint_return)
@@ -851,20 +860,22 @@
/*
* lwp_trampoline()
*
- * Arrange for a function to be invoked neatly, after a cpu_lwp_fork().
+ * Arrange for a function to be invoked neatly, after a cpu_lwp_fork(),
+ * which has set up our pcb_context for us. But we actually *get here*
+ * via cpu_switchto(), which returns the LWP we switched away from in v0.
*
* Invokes the function specified by the s0 register with the return
* address specified by the s1 register and with one argument specified
* by the s2 register.
*/
LEAF_NOPROFILE(lwp_trampoline, 0)
- mov v0, a0
- mov s3, a1
- CALL(lwp_startup)
- mov s0, pv
- mov s1, ra
- mov s2, a0
- jmp zero, (pv)
+ mov v0, a0 /* a0 = prev_lwp (from cpu_switchto()) */
+ mov s3, a1 /* a1 = new_lwp (that's us!) */
+ CALL(lwp_startup) /* lwp_startup(prev_lwp, new_lwp); */
+ mov s0, pv /* pv = func */
+ mov s1, ra /* ra = (probably exception_return()) */
+ mov s2, a0 /* a0 = arg */
+ jmp zero, (pv) /* func(arg) */
END(lwp_trampoline)
/**************************************************************************/
Home |
Main Index |
Thread Index |
Old Index