|
|
1.1 root 1: /*-
2: * Copyright (c) 1990 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * the Systems Programming Group of the University of Utah Computer
7: * Science Department.
8: *
9: * Redistribution and use in source and binary forms are permitted
10: * provided that: (1) source distributions retain this entire copyright
11: * notice and comment, and (2) distributions including binaries display
12: * the following acknowledgement: ``This product includes software
13: * developed by the University of California, Berkeley and its contributors''
14: * in the documentation or other materials provided with the distribution
15: * and in all advertising materials mentioning features or use of this
16: * software. Neither the name of the University nor the names of its
17: * contributors may be used to endorse or promote products derived
18: * from this software without specific prior written permission.
19: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
20: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
21: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22: */
23:
24: #if defined(LIBC_SCCS) && !defined(lint)
25: .asciz "@(#)_setjmp.s 5.1 (Berkeley) 5/12/90"
26: #endif /* LIBC_SCCS and not lint */
27:
28: /*
29: * C library -- _setjmp, _longjmp
30: *
31: * _longjmp(a,v)
32: * will generate a "return(v)" from
33: * the last call to
34: * _setjmp(a)
35: * by restoring registers from the stack,
36: * The previous signal state is NOT restored.
37: */
38:
39: #include "DEFS.h"
40:
41: ENTRY(_setjmp)
42: movl sp@(4),a0 /* save area pointer */
43: clrl a0@+ /* no old onstack */
44: clrl a0@+ /* no old sigmask */
45: movl sp,a0@+ /* save old SP */
46: movl a6,a0@+ /* save old FP */
47: clrl a0@+ /* no old AP */
48: movl sp@,a0@+ /* save old PC */
49: clrl a0@+ /* clear PS */
50: moveml #0x3CFC,a0@ /* save other non-scratch regs */
51: clrl d0 /* return zero */
52: rts
53:
54: ENTRY(_longjmp)
55: movl sp@(4),a0 /* save area pointer */
56: addql #8,a0 /* skip onstack/sigmask */
57: tstl a0@ /* ensure non-zero SP */
58: jeq botch /* oops! */
59: movl sp@(8),d0 /* grab return value */
60: jne ok /* non-zero ok */
61: moveq #1,d0 /* else make non-zero */
62: ok:
63: movl a0@+,sp /* restore SP */
64: movl a0@+,a6 /* restore FP */
65: addql #4,a0 /* skip AP */
66: movl a0@+,sp@ /* restore PC */
67: moveml a0@(4),#0x3CFC /* restore non-scratch regs */
68: rts
69:
70: botch:
71: jsr _longjmperror
72: stop #0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.