*** empty log message ***
[arla.git] / lwp / process.rios.S
blob3fc1add9420b9ee9fe199715c38ae88adcbb8250
1 /* $Id$ */
3 /*
4 ****************************************************************************
5 *        Copyright IBM Corporation 1988, 1989 - All Rights Reserved        *
6 *                                                                          *
7 * Permission to use, copy, modify, and distribute this software and its    *
8 * documentation for any purpose and without fee is hereby granted,         *
9 * provided that the above copyright notice appear in all copies and        *
10 * that both that copyright notice and this permission notice appear in     *
11 * supporting documentation, and that the name of IBM not be used in        *
12 * advertising or publicity pertaining to distribution of the software      *
13 * without specific, written prior permission.                              *
14 *                                                                          *
15 * IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL *
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL IBM *
17 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY      *
18 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER  *
19 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING   *
20 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.    *
21 ****************************************************************************
24 #include <config.h>
26 #undef RCSID
28 /* lws 92.11.18    I don't know if we have to save the TOC (R2) or not...
29  *                 Note that stack-frame is supposed to be aligned on 
30  *                 a double-word boundary.
31  *                 For details about RIOS calling conventions
32  *                 see the Assembler manual and /usr/include/sys/asdef.s
33  */
37  * savecontext(f, area1, newsp)
38  *     int (*f)(); struct savearea *area1; char *newsp;
39  */
40         .set    topstack, 0
41         .set    cr0, 0
42         .set    toc, 2
43         .set    r0, 0
44         .set    r1, 1
45         .set    r2, 2
46         .set    r3, 3
47         .set    r4, 4
48         .set    r5, 5
49         .set    r6, 6
50         .set    r7, 7
51         .set    r12, 12
52         .set    a_f, r3
53         .set    a_area1, r4
54         .set    a_newsp, r5
56         .set    argarea,  32
57         .set    linkarea, 24
58         .set    nfprs,    18
59         .set    ngprs,    20
60         .set    szdsa,    8*nfprs+4*ngprs+linkarea+argarea
62         .csect .savecontext[PR]
63         .globl .savecontext[PR]
65         mflr    r0                      # save link register
66                 
68  *  save floating point registers.  Interleave some other stuff for
69  *  timing reasons.  Set up conditions and registers for branches
70  *  early, so that processor can prefetch instructions.
71  */
72         stfd  14, -144(1)
73         stfd  15, -136(1)
75         mfcr    r12                     # save CR
77         stfd  16, -128(1)
78         stfd  17, -120(1)
80         l       11, 0(a_f)              # r11 <- *(a_f)
82         stfd  18, -112(1)
83         stfd  19, -104(1)
85         cmpi    cr0, a_newsp, 0         # cr0 <- (a_newsp :: 0)
87         stfd  20, -96(1)
88         stfd  21, -88(1)
89         stfd  22, -80(1)
91         mtlr    11                      # set up lr early so prefetch works
93         stfd  23, -72(1)
94         stfd  24, -64(1)
95         stfd  25, -56(1)
97         st      r0, 8(r1)               # save return addr
99         stfd  26, -48(1)
100         stfd  27, -40(1)
101         stfd  28, -32(1)
103         st      12, 4(r1)               # save CR
105         stfd  29, -24(1)
106         stfd  30, -16(1)
107         stfd  31, -8(1)
110  *  save general-purpose registers
111  */
112         stm     12, -8*nfprs-4*ngprs(r1)# save the general-purpose regs
113         stu     r1, -szdsa(r1)          # dec SP and save back chain
115         l       r7,  PRE_Block.S(toc)   # r7 <- &PRE_Block
116         cal     r6, 1(r0)               # r6 <- #1
117         st      r6, 0(r7)               # r6 -> PRE_Block
119         st      r1, topstack(a_area1)   # save old SP
120         
121         beq    L1                       # if (a_newsp == 0) goto L1
123         mr      r1, r5                  # r1 <- a_newsp -- load new SP
125 L1:     brl                             # pc <- lr      -- (*a_f)()
128  * returnto(area2)   This is a little jumbled, I tried to interleave 
129  * memory accesses with simple instructions for speed, and I tried to 
130  * set up the link register and condition register reasonably early
131  * so that processor instruction prefetching might help us out a little.
132  */
133         .set    a_area2, r3
135         .csect  .returnto[PR]
136         .globl  .returnto[PR]
138         l       r1, topstack(a_area2)   # r1 <- a_area2->topstack
139         cal     r1,  szdsa(r1)          # pop off frame
140         l       r7, PRE_Block.S(toc)    # r7 <- &PRE_Block
142         l       8, 8(1)                 # restore lr
143         mtlr    8                       # do it early so prefetch works
145         lm      12,  -8*nfprs-4*ngprs(r1)
146         cal     r6, 0(r0)               # r6 <- #0
147         mtcrf   0x38, 12                # put back cr
148         st      r6, 0(r7)               # r6 -> PRE_Block
151  * restore FPRs here!
152  */
153         lfd  14, -144(1)
154         lfd  15, -136(1)
155         lfd  16, -128(1)
156         lfd  17, -120(1)
157         lfd  18, -112(1)
158         lfd  19, -104(1)
159         lfd  20, -96(1)
160         lfd  21, -88(1)
161         lfd  22, -80(1)
162         lfd  23, -72(1)
163         lfd  24, -64(1)
164         lfd  25, -56(1)
165         lfd  26, -48(1)
166         lfd  27, -40(1)
167         lfd  28, -32(1)
168         lfd  29, -24(1)
169         lfd  30, -16(1)
170         lfd  31, -8(1)
172         brl                             # pc <- lr      -- return
174         .toc
176 PRE_Block.S:
177         .tc     PRE_Block[tc], PRE_Block[ua]
178         .extern PRE_Block[ua]