(nnpfs_block_open): better cleanup on failure
[arla.git] / lwp / process.ibm032.S
blobd08d884c928b5968a398d1cf362c55407156563d
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
29 |       Information Technology Center
30 |       Carnegie-Mellon University
33         .data
34         .globl  .oVncs
35         .set            .oVncs,0
37         .globl  _savecontext
38 _savecontext:
39         .long           _.savecontext
41         .globl  _returnto
42 _returnto:
43         .long           _.returnto
46 |       Process assembly language assist for Sailboats.
49         .text
50         .align 2
53 | struct savearea {
54 |       char    *topstack;
55 | }
58 | Offsets of fields
59 .set topstack,0
61 | Stuff to allow saving/restoring registers
62 .set regspace,64
63 .set freg,0
66 | savecontext(f, area1, newsp)
67 |    int (*f)(); struct savearea *area1; char *newsp;
70         .globl  _.savecontext
71 _.savecontext:
72         ai      sp,sp,-regspace         | Save frame pointer & ...
73                                         | ... allocate space for 16 registers
74 | Save registers
75         stm     r0,0(sp)                        | Change this if save fewer regs.
76 | Set preemption semaphore
77         get     r6,$1
78         get     r7,$_PRE_Block
79         put     r6,0(r7)                        | PRE_Block = 1
80 | r3 = base of savearea
81         put     sp,topstack(r3)         | area1->topstack = sp
82 | New sp is in r4.
83         cis     r4,0
84         be      L1                      | If newsp == 0, no stack switch
85         cas     sp,r4,r0                        | Switch to new stack
86 L1:
87         get     r6,0(r2)                        | r2 = _f
88         balrx   r15,r6                  | f()
89         cas     r0,r2,r0
92 | returnto(area2)
93 |     struct savearea *area2;
96         .globl _.returnto
97 _.returnto:
98         get     sp,topstack(r2)
99 | Now in the context of the savecontext stack to be restored.
100 | Start with the registers...
101 | Clear preemption semaphore
102         get     r6,$0
103         get     r7,$_PRE_Block
104         put     r6,0(r7)                        | PRE_Block = 0
105         lm      r0,0(sp)                | Change if saving fewer regs.
106         brx     r15             | Return to previous process
107         ai      sp,sp,regspace
108  .data
109  .ltorg