/* $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 #include #include #include #include #include /* * 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,_C_LABEL(sched_whichqs)@ha lwz 9,_C_LABEL(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,_C_LABEL(powersave)@ha lwz 9,_C_LABEL(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 _C_LABEL(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 _C_LABEL(lcsplx) #endif stw 3,PCB_SPL(31) /* save spl */ /* Find a new process */ bl _C_LABEL(chooseproc) 1: /* just did this resched thing */ xor 3,3,3 lis 4,_C_LABEL(want_resched)@ha stw 3,_C_LABEL(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,_C_LABEL(curpm)@ha stwu 5,_C_LABEL(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 _C_LABEL(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