1*287433edSSergey Makeev /*
2*287433edSSergey Makeev Copyright (c) 2016 Richard Maxwell
3*287433edSSergey Makeev 
4*287433edSSergey Makeev Permission is hereby granted, free of charge, to any person obtaining a copy
5*287433edSSergey Makeev of this software and associated documentation files (the "Software"), to deal
6*287433edSSergey Makeev in the Software without restriction, including without limitation the rights
7*287433edSSergey Makeev to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8*287433edSSergey Makeev copies of the Software, and to permit persons to whom the Software is
9*287433edSSergey Makeev furnished to do so, subject to the following conditions:
10*287433edSSergey Makeev 
11*287433edSSergey Makeev The above copyright notice and this permission notice shall be included in all
12*287433edSSergey Makeev copies or substantial portions of the Software.
13*287433edSSergey Makeev 
14*287433edSSergey Makeev THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*287433edSSergey Makeev IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*287433edSSergey Makeev FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17*287433edSSergey Makeev AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18*287433edSSergey Makeev LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19*287433edSSergey Makeev OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20*287433edSSergey Makeev SOFTWARE.
21*287433edSSergey Makeev */
22*287433edSSergey Makeev 
23*287433edSSergey Makeev #ifndef FCONTEXT_H
24*287433edSSergey Makeev #define FCONTEXT_H
25*287433edSSergey Makeev 
26*287433edSSergey Makeev #include <stdint.h>
27*287433edSSergey Makeev // intptr_t
28*287433edSSergey Makeev 
29*287433edSSergey Makeev #include <stddef.h>
30*287433edSSergey Makeev // size_t
31*287433edSSergey Makeev 
32*287433edSSergey Makeev // -----------------------------------------------------------------------------
33*287433edSSergey Makeev #ifdef __cplusplus
34*287433edSSergey Makeev extern "C" {
35*287433edSSergey Makeev #endif
36*287433edSSergey Makeev // -----------------------------------------------------------------------------
37*287433edSSergey Makeev 
38*287433edSSergey Makeev typedef void* fcontext_t;
39*287433edSSergey Makeev 
40*287433edSSergey Makeev intptr_t jump_fcontext
41*287433edSSergey Makeev (
42*287433edSSergey Makeev       fcontext_t* ofc
43*287433edSSergey Makeev     , fcontext_t  nfc
44*287433edSSergey Makeev     , intptr_t    vp
45*287433edSSergey Makeev     , int         preserve_fpu
46*287433edSSergey Makeev );
47*287433edSSergey Makeev 
48*287433edSSergey Makeev fcontext_t make_fcontext
49*287433edSSergey Makeev (
50*287433edSSergey Makeev       void*  sp
51*287433edSSergey Makeev     , size_t size
52*287433edSSergey Makeev     , void  (*fn)(intptr_t)
53*287433edSSergey Makeev );
54*287433edSSergey Makeev // sp is the pointer to the _top_ of the stack (ie &stack_buffer[size]).
55*287433edSSergey Makeev 
56*287433edSSergey Makeev // -----------------------------------------------------------------------------
57*287433edSSergey Makeev #ifdef __cplusplus
58*287433edSSergey Makeev }
59*287433edSSergey Makeev #endif
60*287433edSSergey Makeev // -----------------------------------------------------------------------------
61*287433edSSergey Makeev 
62*287433edSSergey Makeev #endif
63