added concrete implementations of putc(), getc(), getchar() and gets()
[tangerine.git] / arch / .unmaintained / m68k-pp-native / clib / longjmp.s
blob93303f098ddffd67d12c45018dd7fc5657779613
1 /*
2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: longjmp
6 Lang: english
7 */
9 /******************************************************************************
11 NAME
12 #include <setjmp.h>
14 void longjmp (jmp_buf env, int val);
16 FUNCTION
17 Save the current context so that you can return to it later.
19 INPUTS
20 env - The context/environment to restore
21 val - This value is returned by setjmp() when you return to the
22 saved context. You cannot return 0. If val is 0, then
23 setjmp() returns with 1.
25 RESULT
26 This function doesn't return.
28 NOTES
30 EXAMPLE
31 jmp_buf env;
33 ... some code ...
35 if (!setjmp (env))
37 ... this code is executed after setjmp() returns ...
39 // This is no good example on how to use this function
40 // You should not do that
41 if (error)
42 longjmp (env, 5);
44 ... some code ...
46 else
48 ... this code is executed if you call longjmp(env) ...
51 BUGS
53 SEE ALSO
54 setjmp()
56 INTERNALS
58 HISTORY
60 ******************************************************************************/
62 #include "../include/aros/machine.i"
64 .text
65 .balign 4
66 .globl longjmp
68 .set FirstArg, 4 /* Skip Return-Adress */
69 .set env, FirstArg
70 .set val, env+4
71 .set retaddr, 0
72 longjmp:
73 #ifdef OLDJMP
74 move.l env(%sp),%a0 /* save area pointer */
75 move.l val(%sp),%d0
76 jne okret
77 moveq.l #1,%d0 /* make sure it isn't 0 */
78 okret:
79 move.l 4(%a0),%sp /* restore SP */
80 move.l 0(%a0),(%sp) /* restore PC */
81 movem.l 8(%a0),%d2-%d7/%a2-%a6 /* restore remaining non-scratch regs */
82 rts
83 #else
84 /* New version adapted from libnix instead of ixemul.
85 * Note the slightly different register save order.
87 addq.w #4,%sp /* returns to other address */
88 move.l (%sp)+,%a0 /* get address of jmp_buf */
89 move.l (%sp)+,%d0 /* get return code */
90 jne .okret
91 moveq.l #1,%d0 /* make sure it isn't 0 */
92 .okret:
93 move.l 48(%a0),%sp /* restore sp */
94 move.l (%a0)+,(%sp) /* set return address */
95 movem.l (%a0),%d2-%d7/%a2-%a6 /* restore all registers except scratch and sp */
96 rts
97 #endif
100 The jmp_buf is filled as follows (d0/d1/a0/a1 are not saved):
102 _jmp_buf offset contents
103 [0] 0 old pc
104 [1] 4 d2
105 [2] 8 d3
106 [3] 12 d4
107 [4] 16 d5
108 [5] 20 d6
109 [6] 24 d7
110 [7] 28 a2
111 [8] 32 a3
112 [9] 36 a4
113 [10] 40 a5
114 [11] 44 a6
115 [12] 48 old sp