/* [<][>][^][v][top][bottom][index][help] */
1 #ifndef MTCP_HEADER_H
2 #define MTCP_HEADER_H
3
4 #include "ldt.h"
5
6 #ifdef __i386__
7 typedef unsigned short segreg_t;
8 #elif __x86_64__
9 typedef unsigned short segreg_t;
10 #elif __arm__
11 typedef unsigned int segreg_t;
12 #elif defined(__aarch64__)
13 typedef unsigned long int segreg_t;
14 #endif
15
16 /* TLS segment registers used differently in i386 and x86_64. - Gene */
17 #ifdef __i386__
18 # define TLSSEGREG gs
19 #elif __x86_64__
20 # define TLSSEGREG fs
21 #elif (__arm__ || __aarch64__)
22 /* FIXME: fs IS NOT AN arm REGISTER. BUT THIS IS USED ONLY AS A FIELD NAME.
23 * ARM uses a register in coprocessor 15 as the thread-pointer (TLS Register)
24 */
25 # define TLSSEGREG fs
26 #endif
27
28 #if defined(__x86_64__) || defined(__aarch64__)
29 # define MYINFO_GS_T unsigned long int
30 #else
31 # define MYINFO_GS_T unsigned int
32 #endif
33
34 typedef struct _ThreadTLSInfo {
35 segreg_t fs, gs; // thread local storage pointers
36 struct user_desc gdtentrytls[1];
37 } ThreadTLSInfo;
38
39 #define MTCP_SIGNATURE "MTCP_HEADER_v2.2\n"
40 #define MTCP_SIGNATURE_LEN 32
41 typedef union _MtcpHeader {
42 struct {
43 char signature[MTCP_SIGNATURE_LEN];
44 void *saved_brk;
45 void *restore_addr;
46 size_t restore_size;
47 void *vdsoStart;
48 void *vdsoEnd;
49 void *vvarStart;
50 void *vvarEnd;
51 void (*post_restart) ();
52 ThreadTLSInfo motherofall_tls_info;
53 int tls_pid_offset;
54 int tls_tid_offset;
55 MYINFO_GS_T myinfo_gs;
56 };
57
58 char _padding[4096];
59 } MtcpHeader;
60
61 #endif