Blame


1 cfa37a7b 2004-04-10 devnull .TH SETJMP 3
2 cfa37a7b 2004-04-10 devnull .SH NAME
3 cfa37a7b 2004-04-10 devnull setjmp, longjmp, notejmp \- non-local goto
4 cfa37a7b 2004-04-10 devnull .SH SYNOPSIS
5 cfa37a7b 2004-04-10 devnull .B #include <u.h>
6 cfa37a7b 2004-04-10 devnull .br
7 cfa37a7b 2004-04-10 devnull .B #include <libc.h>
8 cfa37a7b 2004-04-10 devnull .PP
9 cfa37a7b 2004-04-10 devnull .ta \w'\fLvoid 'u
10 cfa37a7b 2004-04-10 devnull .B
11 cfa37a7b 2004-04-10 devnull int setjmp(jmp_buf env)
12 cfa37a7b 2004-04-10 devnull .PP
13 cfa37a7b 2004-04-10 devnull .B
14 cfa37a7b 2004-04-10 devnull void longjmp(jmp_buf env, int val)
15 cfa37a7b 2004-04-10 devnull .PP
16 cfa37a7b 2004-04-10 devnull .B
17 cfa37a7b 2004-04-10 devnull void notejmp(void *uregs, jmp_buf env, int val)
18 cfa37a7b 2004-04-10 devnull .SH DESCRIPTION
19 cfa37a7b 2004-04-10 devnull These routines are useful for dealing with errors
20 cfa37a7b 2004-04-10 devnull and interrupts encountered in
21 cfa37a7b 2004-04-10 devnull a low-level subroutine of a program.
22 cfa37a7b 2004-04-10 devnull .PP
23 cfa37a7b 2004-04-10 devnull .I Setjmp
24 cfa37a7b 2004-04-10 devnull saves its stack environment in
25 cfa37a7b 2004-04-10 devnull .I env
26 cfa37a7b 2004-04-10 devnull for later use by
27 cfa37a7b 2004-04-10 devnull .IR longjmp .
28 cfa37a7b 2004-04-10 devnull It returns value 0.
29 cfa37a7b 2004-04-10 devnull .PP
30 cfa37a7b 2004-04-10 devnull .I Longjmp
31 cfa37a7b 2004-04-10 devnull restores the environment saved by the last call of
32 cfa37a7b 2004-04-10 devnull .IR setjmp .
33 cfa37a7b 2004-04-10 devnull It then causes execution to
34 cfa37a7b 2004-04-10 devnull continue as if the call of
35 cfa37a7b 2004-04-10 devnull .I setjmp
36 cfa37a7b 2004-04-10 devnull had just returned with value
37 cfa37a7b 2004-04-10 devnull .IR val .
38 cfa37a7b 2004-04-10 devnull The invoker of
39 cfa37a7b 2004-04-10 devnull .I setjmp
40 cfa37a7b 2004-04-10 devnull must not itself have returned in the interim.
41 cfa37a7b 2004-04-10 devnull All accessible data have values as of the time
42 cfa37a7b 2004-04-10 devnull .I longjmp
43 cfa37a7b 2004-04-10 devnull was called.
44 cfa37a7b 2004-04-10 devnull .PP
45 cfa37a7b 2004-04-10 devnull .I Notejmp
46 cfa37a7b 2004-04-10 devnull is the same as
47 cfa37a7b 2004-04-10 devnull .I longjmp
48 cfa37a7b 2004-04-10 devnull except that it is to be called from within a note handler (see
49 bf8a59fa 2004-04-11 devnull .IR notify (3)).
50 cfa37a7b 2004-04-10 devnull The
51 cfa37a7b 2004-04-10 devnull .I uregs
52 cfa37a7b 2004-04-10 devnull argument should be the first argument passed to the note handler.
53 cfa37a7b 2004-04-10 devnull .PP
54 cfa37a7b 2004-04-10 devnull .I Setjmp
55 cfa37a7b 2004-04-10 devnull and
56 cfa37a7b 2004-04-10 devnull .I longjmp
57 cfa37a7b 2004-04-10 devnull can also be used to switch stacks.
58 cfa37a7b 2004-04-10 devnull Defined in
59 cfa37a7b 2004-04-10 devnull .B </$objtype/u.h>
60 cfa37a7b 2004-04-10 devnull are several macros that can be used to build
61 cfa37a7b 2004-04-10 devnull .B jmp_bufs
62 cfa37a7b 2004-04-10 devnull by hand. The following code establishes a
63 cfa37a7b 2004-04-10 devnull .B jmp_buf
64 cfa37a7b 2004-04-10 devnull .i label
65 cfa37a7b 2004-04-10 devnull that may be called by
66 cfa37a7b 2004-04-10 devnull .I longjmp
67 cfa37a7b 2004-04-10 devnull to begin execution in a function
68 cfa37a7b 2004-04-10 devnull .BR f
69 cfa37a7b 2004-04-10 devnull with 1024 bytes of stack:
70 cfa37a7b 2004-04-10 devnull .IP
71 cfa37a7b 2004-04-10 devnull .EX
72 cfa37a7b 2004-04-10 devnull #include <u.h>
73 cfa37a7b 2004-04-10 devnull #include <libc.h>
74 cfa37a7b 2004-04-10 devnull
75 cfa37a7b 2004-04-10 devnull jmp_buf label;
76 cfa37a7b 2004-04-10 devnull #define NSTACK 1024
77 cfa37a7b 2004-04-10 devnull char stack[NSTACK];
78 cfa37a7b 2004-04-10 devnull
79 cfa37a7b 2004-04-10 devnull void
80 cfa37a7b 2004-04-10 devnull setlabel(void)
81 cfa37a7b 2004-04-10 devnull {
82 cfa37a7b 2004-04-10 devnull label[JMPBUFPC] = ((ulong)f+JMPBUFDPC);
83 cfa37a7b 2004-04-10 devnull /* -2 leaves room for old pc and new pc in frame */
84 cfa37a7b 2004-04-10 devnull label[JMPBUFSP =
85 cfa37a7b 2004-04-10 devnull (ulong)(&stack[NSTACK-2*sizeof(ulong*)]);
86 cfa37a7b 2004-04-10 devnull }
87 cfa37a7b 2004-04-10 devnull .EE
88 cfa37a7b 2004-04-10 devnull .SH SOURCE
89 058b0118 2005-01-03 devnull .B /usr/local/plan9/src/lib9/jmp.c
90 cfa37a7b 2004-04-10 devnull .SH SEE ALSO
91 bf8a59fa 2004-04-11 devnull .IR notify (3)
92 cfa37a7b 2004-04-10 devnull .SH BUGS
93 cfa37a7b 2004-04-10 devnull .PP
94 cfa37a7b 2004-04-10 devnull .I Notejmp
95 cfa37a7b 2004-04-10 devnull cannot recover from an address trap or bus error (page fault) on the 680x0
96 cfa37a7b 2004-04-10 devnull architectures.