summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/aim/swtch.S
diff options
context:
space:
mode:
Diffstat (limited to 'sys/powerpc/aim/swtch.S')
-rw-r--r--sys/powerpc/aim/swtch.S249
1 files changed, 249 insertions, 0 deletions
diff --git a/sys/powerpc/aim/swtch.S b/sys/powerpc/aim/swtch.S
new file mode 100644
index 0000000..34bdb85
--- /dev/null
+++ b/sys/powerpc/aim/swtch.S
@@ -0,0 +1,249 @@
+/* $FreeBSD$ */
+/* $NetBSD: locore.S,v 1.24 2000/05/31 05:09:17 thorpej Exp $ */
+
+/*
+ * Copyright (C) 2001 Benno Rice
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * Copyright (C) 1995, 1996 Wolfgang Solfrank.
+ * Copyright (C) 1995, 1996 TooLs GmbH.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by TooLs GmbH.
+ * 4. The name of TooLs GmbH may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "assym.s"
+
+#include <sys/syscall.h>
+
+#include <machine/trap.h>
+#include <machine/param.h>
+#include <machine/pmap.h>
+#include <machine/psl.h>
+#include <machine/asm.h>
+
+/*
+ * Some instructions gas doesn't understand (yet?)
+ */
+#define bdneq bdnzf 2,
+
+/*
+ * No processes are runnable, so loop waiting for one.
+ * Separate label here for accounting purposes.
+ */
+#if 0 /* XXX: I think this is now unneeded. Leaving it in just in case. */
+ASENTRY(Idle)
+ mfmsr 3
+ andi. 3,3,~PSL_EE@l /* disable interrupts while
+ manipulating runque */
+ mtmsr 3
+
+ lis 8,sched_whichqs@ha
+ lwz 9,sched_whichqs@l(8)
+
+ or. 9,9,9
+ bne- .Lsw1 /* at least one queue non-empty */
+
+ ori 3,3,PSL_EE@l /* reenable ints again */
+ mtmsr 3
+ isync
+
+/* Check if we can use power saving mode */
+ lis 8,powersave@ha
+ lwz 9,powersave@l(8)
+
+ or. 9,9,9
+ beq 1f
+
+ sync
+ oris 3,3,PSL_POW@h /* enter power saving mode */
+ mtmsr 3
+ isync
+1:
+ b _ASM_LABEL(Idle)
+#endif /* XXX */
+
+/*
+ * switchexit gets called from cpu_exit to complete the exit procedure.
+ */
+ENTRY(switchexit)
+/* First switch to the idle pcb/kernel stack */
+#if 0 /* XXX */
+ lis 6,idle_u@ha
+ lwz 6,idle_u@l(6)
+ mfsprg 7,0
+ stw 6,GD_CURPCB(7)
+#endif
+ addi 1,6,USPACE-16 /* 16 bytes are reserved at stack top */
+ /*
+ * Schedule the vmspace and stack to be freed (the proc arg is
+ * already in r3).
+ */
+ bl sys_exit
+
+/* Fall through to cpu_switch to actually select another proc */
+ li 3,0 /* indicate exited process */
+
+/*
+ * void cpu_switch(struct proc *p)
+ * Find a runnable process and switch to it.
+ */
+/* XXX noprofile? --thorpej@netbsd.org */
+ENTRY(cpu_switch)
+ mflr 0 /* save lr */
+ stw 0,4(1)
+ stwu 1,-16(1)
+ stw 31,12(1)
+ stw 30,8(1)
+
+ mr 30,3
+ mfsprg 3,0
+ xor 31,31,31
+ stw 31,GD_CURPROC(3) /* Zero to not accumulate cpu time */
+ mfsprg 3,0
+ lwz 31,GD_CURPCB(3)
+
+ xor 3,3,3
+#if 0 /* XXX */
+ bl lcsplx
+#endif
+ stw 3,PCB_SPL(31) /* save spl */
+
+/* Find a new process */
+ bl chooseproc
+
+1:
+ /* just did this resched thing */
+ xor 3,3,3
+ lis 4,want_resched@ha
+ stw 3,want_resched@l(4)
+
+ /* record new process */
+ mfsprg 4,0
+ stw 3,GD_CURPROC(4)
+
+ cmpl 0,31,30 /* is it the same process? */
+ beq switch_return
+
+ or. 30,30,30 /* old process was exiting? */
+ beq switch_exited
+
+ mfsr 10,USER_SR /* save USER_SR for copyin/copyout */
+ mfcr 11 /* save cr */
+ mr 12,2 /* save r2 */
+ stwu 1,-SFRAMELEN(1) /* still running on old stack */
+ stmw 10,8(1)
+ lwz 3,P_ADDR(30)
+ stw 1,PCB_SP(3) /* save SP */
+
+switch_exited:
+ mfmsr 3
+ andi. 3,3,~PSL_EE@l /* disable interrupts while
+ actually switching */
+ mtmsr 3
+
+ /* indicate new pcb */
+ lwz 4,P_ADDR(31)
+ mfsprg 5,0
+ stw 4,GD_CURPCB(5)
+
+#if 0 /* XXX */
+ /* save real pmap pointer for spill fill */
+ lwz 5,PCB_PMR(4)
+ lis 6,curpm@ha
+ stwu 5,curpm@l(6)
+ stwcx. 5,0,6 /* clear possible reservation */
+#endif
+
+ addic. 5,5,64
+ li 6,0
+ mfsr 8,KERNEL_SR /* save kernel SR */
+1:
+ addis 6,6,-0x10000000@ha /* set new procs segment registers */
+ or. 6,6,6 /* This is done from the real
+ address pmap */
+ lwzu 7,-4(5) /* so we don't have to worry */
+ mtsrin 7,6 /* about accessibility */
+ bne 1b
+ mtsr KERNEL_SR,8 /* restore kernel SR */
+ isync
+
+ lwz 1,PCB_SP(4) /* get new procs SP */
+
+ ori 3,3,PSL_EE@l /* interrupts are okay again */
+ mtmsr 3
+
+ lmw 10,8(1) /* get other regs */
+ lwz 1,0(1) /* get saved SP */
+ mr 2,12 /* get saved r2 */
+ mtcr 11 /* get saved cr */
+ isync
+ mtsr USER_SR,10 /* get saved USER_SR */
+ isync
+
+switch_return:
+ mr 30,7 /* save proc pointer */
+ lwz 3,PCB_SPL(4)
+#if 0 /* XXX */
+ bl lcsplx
+#endif
+
+ mr 3,30 /* get curproc for special fork
+ returns */
+
+ lwz 31,12(1)
+ lwz 30,8(1)
+ addi 1,1,16
+ lwz 0,4(1)
+ mtlr 0
+ blr
+
+/*
+ * Fake savectx for the time being.
+ */
+ENTRY(savectx)
+ blr
OpenPOWER on IntegriCloud