2 * Copyright (c) 2001 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * 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.
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.
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
34 /* Linux for S/390 (31 bit)
36 * Written by Neale Ferguson <Neale.Ferguson@SoftwareAG-usa.com>
38 * additional munging by Adam Thornton <adam@sinenomine.net>
43 .type savecontext,%function
45 * savecontext(f, area1, newsp)
46 * int (*f)() ; struct savearea *area1; char *newsp;
58 P_PRE: .long PRE_Block
62 stm %r7,%r15,28(%r15) /* Save our registers */
67 /* larl %r5,P_PRE /* Get A((PRE_Block)) */
68 bras %r5,.L0 /* Get A(A(PRE_Block)) */
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 */
78 br %r2 /* Call the routine */
80 /* Can't get here....*/
82 /* larl %r5,P_ABORT */
90 .size savecontext,.savecontext_end-savecontext
94 * struct savearea *area2;
100 .type returnto,%function
103 l %r15,0(%r2) /* New frame, to get correct pointer
105 /* larl %r5,P_PRE /* Get A((PRE_Block)) */
106 bras %r5,.L3 /* Get A(A(PRE_Block)) */
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 */
118 /* larl %r9,P_ABORT */
126 .size returnto,.returnto_end-returnto