Module Name: src
Committed By: thorpej
Date: Wed Jan 17 05:41:57 UTC 2024
Modified Files:
src/sys/arch/m68k/m68k: switch_subr.s
Log Message:
cpu_switchto(): No need for the pmap_activate() dance here; it's
already done for us in mi_switch().
To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/m68k/m68k/switch_subr.s
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/m68k/m68k/switch_subr.s
diff -u src/sys/arch/m68k/m68k/switch_subr.s:1.36 src/sys/arch/m68k/m68k/switch_subr.s:1.37
--- src/sys/arch/m68k/m68k/switch_subr.s:1.36 Tue Sep 26 14:33:55 2023
+++ src/sys/arch/m68k/m68k/switch_subr.s Wed Jan 17 05:41:57 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: switch_subr.s,v 1.36 2023/09/26 14:33:55 tsutsui Exp $ */
+/* $NetBSD: switch_subr.s,v 1.37 2024/01/17 05:41:57 thorpej Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation.
@@ -88,7 +88,7 @@ GLOBAL(_Idle) /* For sun2/sun3's cloc
* Switch to the specific next LWP.
*/
ENTRY(cpu_switchto)
- movl 4(%sp),%a1 | fetch `current' lwp
+ movl 4(%sp),%a1 | fetch outgoing lwp
/*
* Save state of previous process in its pcb.
*/
@@ -133,78 +133,38 @@ ENTRY(cpu_switchto)
#endif /* !_M68K_CUSTOM_FPU_CTX */
movl 8(%sp),%a0 | get newlwp
- movl %a0,_C_LABEL(curlwp)
+ movl %a0,_C_LABEL(curlwp) | curlwp = new lwp
movl L_PCB(%a0),%a1 | get its pcb
- movl %a1,_C_LABEL(curpcb)
+ movl %a1,_C_LABEL(curpcb) | curpcb = new pcb
-#if defined(sun2) || defined(sun3)
- movl L_PROC(%a0),%a2
- movl P_VMSPACE(%a2),%a2 | vm = p->p_vmspace
-#if defined(DIAGNOSTIC) && !defined(sun2)
- tstl %a2 | vm == VM_MAP_NULL?
- jeq .Lcpu_switch_badsw | panic
-#endif
- pea (%a0) | save newlwp
-#if !defined(_SUN3X_) || defined(PMAP_DEBUG)
- movl VM_PMAP(%a2),-(%sp) | push vm->vm_map.pmap
- jbsr _C_LABEL(_pmap_switch) | _pmap_switch(pmap)
- addql #4,%sp
- movl _C_LABEL(curpcb),%a1 | restore curpcb
-| Note: _pmap_switch() will clear the cache if needed.
-#else
- /* Use this inline version on sun3x when not debugging the pmap. */
- lea _C_LABEL(kernel_crp),%a3 | our CPU Root Ptr. (CRP)
- movl VM_PMAP(%a2),%a2 | pmap = vm->vm_map.pmap
- movl PM_A_PHYS(%a2),%d0 | phys = pmap->pm_a_phys
- cmpl 4(%a3),%d0 | == kernel_crp.rp_addr ?
- jeq .Lsame_mmuctx | skip loadcrp/flush
- /* OK, it is a new MMU context. Load it up. */
- movl %d0,4(%a3)
- movl #CACHE_CLR,%d0
- movc %d0,%cacr | invalidate cache(s)
- pflusha | flush entire TLB
- pmove (%a3),%crp | load new user root pointer
-.Lsame_mmuctx:
-#endif /* !defined(_SUN3X_) || defined(PMAP_DEBUG) */
-#else /* !defined(sun2) && !defined(sun3) */
/*
- * Activate process's address space.
- * XXX Should remember the last USTP value loaded, and call this
- * XXX only of it has changed.
+ * Check for restartable atomic sequences (RAS)
*/
- pea (%a0) | push newlwp
- jbsr _C_LABEL(pmap_activate) | pmap_activate(newlwp)
- /* Note that newlwp will be popped off the stack later. */
-#endif
-
- /*
- * Check for restartable atomic sequences (RAS)
- */
- movl _C_LABEL(curlwp),%a0
movl L_PROC(%a0),%a2
- tstl P_RASLIST(%a2)
- jeq 1f
+ tstl P_RASLIST(%a2) | p->p_raslist == NULL?
+ jeq 2f | yes, skip it.
movl L_MD_REGS(%a0),%a1
- movl TF_PC(%a1),-(%sp)
- movl %a2,-(%sp)
- jbsr _C_LABEL(ras_lookup)
+ movl TF_PC(%a1),-(%sp) | push return PC
+ movl %a2,-(%sp) | push proc
+ jbsr _C_LABEL(ras_lookup) | a0 = ras_lookup(p, pc)
addql #8,%sp
movql #-1,%d0
- cmpl %a0,%d0
- jeq 1f
+ cmpl %a0,%d0 | a0 == -1?
+ jeq 1f | yes, skip it.
movl _C_LABEL(curlwp),%a1
movl L_MD_REGS(%a1),%a1
- movl %a0,TF_PC(%a1)
+ movl %a0,TF_PC(%a1) | fixup return PC
1:
- movl (%sp)+,%d0 | restore newlwp
- movl _C_LABEL(curpcb),%a1 | restore pcb
+ movl _C_LABEL(curlwp),%a0 | recover new lwp
+ movl _C_LABEL(curpcb),%a1 | recover new pcb
+2:
+ movl %a0,%d0 | free up %a0
+ movl 4(%sp),%d1 | get oldlwp for return value
+ lea _ASM_LABEL(tmpstk),%sp | switch to tmp stack in case of NMI
- movl 4(%sp),%d1 | restore oldlwp for a return value
- lea _ASM_LABEL(tmpstk),%sp | now goto a tmp stack for NMI
-
- moveml PCB_REGS(%a1),%d2-%d7/%a2-%a7 | and registers
+ moveml PCB_REGS(%a1),%d2-%d7/%a2-%a7 | restore registers
movl PCB_USP(%a1),%a0
- movl %a0,%usp | and USP
+ movl %a0,%usp | and USP
#ifdef _M68K_CUSTOM_FPU_CTX
moveml %d0/%d1,-(%sp)
@@ -245,14 +205,10 @@ ENTRY(cpu_switchto)
#endif /* !_M68K_CUSTOM_FPU_CTX */
.Lcpu_switch_nofprest:
- movl %d1,%d0
- movl %d0,%a0
+ movl %d1,%d0 | return outgoing lwp
+ movl %d0,%a0 | (in a0, too)
rts
-.Lcpu_switch_badsw:
- PANIC("switch")
- /*NOTREACHED*/
-
/*
* savectx(pcb)
* Update pcb, saving current processor state.