diff options
Diffstat (limited to 'sys/powerpc/aim/swtch.S')
-rw-r--r-- | sys/powerpc/aim/swtch.S | 249 |
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 |