]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/powerpc/aim/swtch.S
This commit was generated by cvs2svn to compensate for changes in r82367,
[FreeBSD/FreeBSD.git] / sys / powerpc / aim / swtch.S
1 /* $FreeBSD$ */
2 /* $NetBSD: locore.S,v 1.24 2000/05/31 05:09:17 thorpej Exp $ */
3
4 /*
5  * Copyright (C) 2001 Benno Rice
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28 /*
29  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
30  * Copyright (C) 1995, 1996 TooLs GmbH.
31  * All rights reserved.
32  *
33  * Redistribution and use in source and binary forms, with or without
34  * modification, are permitted provided that the following conditions
35  * are met:
36  * 1. Redistributions of source code must retain the above copyright
37  *    notice, this list of conditions and the following disclaimer.
38  * 2. Redistributions in binary form must reproduce the above copyright
39  *    notice, this list of conditions and the following disclaimer in the
40  *    documentation and/or other materials provided with the distribution.
41  * 3. All advertising materials mentioning features or use of this software
42  *    must display the following acknowledgement:
43  *      This product includes software developed by TooLs GmbH.
44  * 4. The name of TooLs GmbH may not be used to endorse or promote products
45  *    derived from this software without specific prior written permission.
46  *
47  * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
48  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
50  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
51  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
52  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
53  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
54  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
55  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
56  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57  */
58
59 #include "assym.s"
60
61 #include <sys/syscall.h>
62
63 #include <machine/trap.h>
64 #include <machine/param.h>
65 #include <machine/pmap.h>
66 #include <machine/psl.h>
67 #include <machine/asm.h>
68
69 /*
70  * Some instructions gas doesn't understand (yet?)
71  */
72 #define bdneq   bdnzf 2,
73
74 /*
75  * No processes are runnable, so loop waiting for one.
76  * Separate label here for accounting purposes.
77  */
78 #if 0 /* XXX: I think this is now unneeded.  Leaving it in just in case. */
79 ASENTRY(Idle)
80         mfmsr   3
81         andi.   3,3,~PSL_EE@l           /* disable interrupts while
82                                            manipulating runque */
83         mtmsr   3
84
85         lis     8,sched_whichqs@ha
86         lwz     9,sched_whichqs@l(8)
87
88         or.     9,9,9
89         bne-    .Lsw1                   /* at least one queue non-empty */
90         
91         ori     3,3,PSL_EE@l            /* reenable ints again */
92         mtmsr   3
93         isync
94
95 /* Check if we can use power saving mode */
96         lis     8,powersave@ha
97         lwz     9,powersave@l(8)
98
99         or.     9,9,9
100         beq     1f
101
102         sync
103         oris    3,3,PSL_POW@h           /* enter power saving mode */
104         mtmsr   3
105         isync
106 1:
107         b       _ASM_LABEL(Idle)
108 #endif /* XXX */
109
110 /*
111  * switchexit gets called from cpu_exit to complete the exit procedure.
112  */
113 ENTRY(switchexit)
114 /* First switch to the idle pcb/kernel stack */
115 #if 0 /* XXX */
116         lis     6,idle_u@ha
117         lwz     6,idle_u@l(6)
118         mfsprg  7,0
119         stw     6,GD_CURPCB(7)
120 #endif
121         addi    1,6,USPACE-16           /* 16 bytes are reserved at stack top */
122         /*
123          * Schedule the vmspace and stack to be freed (the proc arg is
124          * already in r3).
125          */
126         bl      sys_exit
127
128 /* Fall through to cpu_switch to actually select another proc */
129         li      3,0                     /* indicate exited process */
130
131 /*
132  * void cpu_switch(struct proc *p)
133  * Find a runnable process and switch to it.
134  */
135 /* XXX noprofile?  --thorpej@netbsd.org */
136 ENTRY(cpu_switch)
137         mflr    0                       /* save lr */
138         stw     0,4(1)
139         stwu    1,-16(1)
140         stw     31,12(1)
141         stw     30,8(1)
142
143         mr      30,3
144         mfsprg  3,0
145         xor     31,31,31
146         stw     31,GD_CURPROC(3)        /* Zero to not accumulate cpu time */
147         mfsprg  3,0
148         lwz     31,GD_CURPCB(3)
149
150         xor     3,3,3
151 #if 0 /* XXX */
152         bl      lcsplx
153 #endif
154         stw     3,PCB_SPL(31)           /* save spl */
155
156 /* Find a new process */
157         bl      chooseproc
158
159 1:
160         /* record new process */
161         mfsprg  4,0
162         stw     3,GD_CURPROC(4)
163
164         cmpl    0,31,30                 /* is it the same process? */
165         beq     switch_return
166
167         or.     30,30,30                /* old process was exiting? */
168         beq     switch_exited
169
170         mfsr    10,USER_SR              /* save USER_SR for copyin/copyout */
171         mfcr    11                      /* save cr */
172         mr      12,2                    /* save r2 */
173         stwu    1,-SFRAMELEN(1)         /* still running on old stack */
174         stmw    10,8(1)
175         lwz     3,P_ADDR(30)
176         stw     1,PCB_SP(3)             /* save SP */
177
178 switch_exited:
179         mfmsr   3
180         andi.   3,3,~PSL_EE@l           /* disable interrupts while
181                                            actually switching */
182         mtmsr   3
183
184         /* indicate new pcb */
185         lwz     4,P_ADDR(31)
186         mfsprg  5,0
187         stw     4,GD_CURPCB(5)
188
189 #if 0 /* XXX */
190         /* save real pmap pointer for spill fill */
191         lwz     5,PCB_PMR(4)
192         lis     6,curpm@ha
193         stwu    5,curpm@l(6)
194         stwcx.  5,0,6                   /* clear possible reservation */
195 #endif
196
197         addic.  5,5,64
198         li      6,0
199         mfsr    8,KERNEL_SR             /* save kernel SR */
200 1:
201         addis   6,6,-0x10000000@ha      /* set new procs segment registers */
202         or.     6,6,6                   /* This is done from the real
203                                            address pmap */
204         lwzu    7,-4(5)                 /* so we don't have to worry */
205         mtsrin  7,6                     /* about accessibility */
206         bne     1b
207         mtsr    KERNEL_SR,8             /* restore kernel SR */
208         isync
209
210         lwz     1,PCB_SP(4)             /* get new procs SP */
211
212         ori     3,3,PSL_EE@l            /* interrupts are okay again */
213         mtmsr   3
214
215         lmw     10,8(1)                 /* get other regs */
216         lwz     1,0(1)                  /* get saved SP */
217         mr      2,12                    /* get saved r2 */
218         mtcr    11                      /* get saved cr */
219         isync
220         mtsr    USER_SR,10              /* get saved USER_SR */
221         isync
222
223 switch_return:
224         mr      30,7                    /* save proc pointer */
225         lwz     3,PCB_SPL(4)
226 #if 0 /* XXX */
227         bl      lcsplx
228 #endif
229
230         mr      3,30                    /* get curproc for special fork
231                                            returns */
232
233         lwz     31,12(1)
234         lwz     30,8(1)
235         addi    1,1,16
236         lwz     0,4(1)
237         mtlr    0
238         blr
239
240 /*
241  * Fake savectx for the time being.
242  */
243 ENTRY(savectx)
244         blr