disable by default, set KASERVER_SUPPORT to enable
[arla.git] / lwp / process.s390.S
blob53e9854ceb78b85edc459f67bbde525c6a08ef04
1 /*
2  * Copyright (c) 2001 Kungliga Tekniska Högskolan
3  * (Royal Institute of Technology, Stockholm, Sweden).
4  * All rights reserved.
5  * 
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 
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  * 3. Neither the name of the Institute nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  * 
21  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
34 /* Linux for S/390 (31 bit)
35  *
36  * Written by Neale Ferguson <Neale.Ferguson@SoftwareAG-usa.com>
37  *
38  *  additional munging by Adam Thornton <adam@sinenomine.net>
39  */
40                 .file   "process.s"
42                 .globl savecontext
43                 .type  savecontext,%function
44         /*
45          * savecontext(f, area1, newsp)
46          *      int (*f)()      ;   struct savearea *area1; char *newsp;
47          * f     - r2
48          * area1 - r3
49          * newsp - r4
50          */
52          /*
53           * struct savearea {
54           *      char    *topstack;
55           * }
56           */
58 P_PRE:            .long   PRE_Block
59 P_ABORT:                .long   abort
61 savecontext:
62                 stm     %r7,%r15,28(%r15)       /* Save our registers */
63                 lr      %r1,%r15
64                 ahi     %r15,-96
65                 st      %r1,0(%r15)
67         /*        larl    %r5,P_PRE               /* Get A((PRE_Block)) */
68                 bras    %r5,.L0                 /* Get A(A(PRE_Block)) */
69                 .long   PRE_Block
70         .L0:
71                 l       %r5,0(%r5)              /* Get A(PRE_Block) */
72                 mvi     0(%r5),1                /* Set it */                    /* XXX should be a word */
73                 st      %r15,0(%r3)             /* Save stack pointer */
74                 ltr     %r4,%r4                 /* If new sp is 0 */
75                 jz      .L1                     /* ... don't change sp */
76                 lr      %r15,%r4                /* Set new stack pointer */
77         .L1:
78                 br      %r2                     /* Call the routine */
80                 /* Can't get here....*/
82         /*        larl    %r5,P_ABORT */
83                 bras    %r5,.L2
84                 .long   abort
85         .L2:
86                 l       %r5,0(%r5)
87                 basr    %r14,%r5
89         .savecontext_end:
90                 .size   savecontext,.savecontext_end-savecontext
92         /*
93          * returnto(area2)
94          *      struct savearea *area2;
95          *
96          * area2 - r2
97          */
99                 .globl  returnto
100                 .type   returnto,%function
102 returnto:
103                 l       %r15,0(%r2)             /* New frame, to get correct pointer
104         */
105         /*        larl    %r5,P_PRE               /* Get A((PRE_Block)) */
106                 bras    %r5,.L3                 /* Get A(A(PRE_Block)) */
107                 .long   PRE_Block
108         .L3:
109                 l       %r5,0(%r5)              /* Get A(PRE_Block) */
110                 mvi     0(%r5),0                /* Clear it */                          /* XXX should be a word */
111                 l       %r15,0(%r15)            /* Point to next stack frame */
112                 lm      %r7,%r15,28(%r15)       /* Restore registers */
113                 br      %r14                    /* Return */
115                 /* Can't happen */
117                 la      %r2,1234
118         /*        larl    %r9,P_ABORT */
119                 bras    %r9,.L4
120                 .long   abort
121         .L4:
122                 l       %r9,0(%r9)
123                 basr    %r14,%r9
125         .returnto_end:
126                 .size   returnto,.returnto_end-returnto
127