Skip to content

Commit 726fe05

Browse files
committed
use portable ucontext on linux/amd64
1 parent 5886824 commit 726fe05

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

asm.S

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@
2828
#endif
2929
#endif
3030

31+
#if defined(__linux__) && defined(__amd64__)
32+
#define NEEDAMD64CONTEXT 1
33+
#define SET setmcontext
34+
#define GET getmcontext
35+
#endif
36+
3137
#if defined(__linux__) && defined(__arm__)
3238
#define NEEDARMCONTEXT 1
3339
#define SET setmcontext

context.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
#define NEEDSWAPCONTEXT
2626
#endif
2727

28+
#if defined(__linux__) && defined(__amd64__)
29+
#define NEEDSWAPCONTEXT
30+
#define NEEDAMD64MAKECONTEXT
31+
#endif
32+
2833
#if defined(__linux__) && defined(__arm__)
2934
#define NEEDSWAPCONTEXT
3035
#define NEEDARMMAKECONTEXT

taskimpl.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
#define USE_UCONTEXT 0
1919
#endif
2020

21+
#if defined(__linux__) && defined(__amd64__)
22+
#define _UCONTEXT_H 1
23+
#define _SYS_UCONTEXT_H 1
24+
#undef USE_UCONTEXT
25+
#define USE_UCONTEXT 0
26+
#endif
27+
2128
#if defined(__APPLE__)
2229
#include <AvailabilityMacros.h>
2330
#if defined(MAC_OS_X_VERSION_10_5)
@@ -97,6 +104,22 @@ extern int swapcontext(ucontext_t*, const ucontext_t*);
97104
extern void makecontext(ucontext_t*, void(*)(), int, ...);
98105
#endif
99106

107+
#if defined(__linux__) && defined(__amd64__)
108+
typedef struct mcontext mcontext_t;
109+
typedef struct ucontext ucontext_t;
110+
extern int getmcontext(mcontext_t*);
111+
extern void setmcontext(const mcontext_t*);
112+
#define setcontext(u) setmcontext(&(u)->uc_mcontext)
113+
#define getcontext(u) getmcontext(&(u)->uc_mcontext)
114+
extern int swapcontext(ucontext_t*, const ucontext_t*);
115+
extern void makecontext(ucontext_t*, void(*)(), int, ...);
116+
# if defined(__i386__)
117+
# include "386-ucontext.h"
118+
# elif defined(__x86_64__)
119+
# include "amd64-ucontext.h"
120+
# endif
121+
#endif
122+
100123
#if defined(__APPLE__)
101124
# define mcontext libthread_mcontext
102125
# define mcontext_t libthread_mcontext_t

0 commit comments

Comments
 (0)