1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
#if defined(__XTENSA_WINDOWED_ABI__)
#define TLS_GD(x) \
({ int *__l; \
__asm__ ("movi a8, " #x "@TLSFUNC\n\t" \
"movi a10, " #x "@TLSARG\n\t" \
"callx8.tls a8, " #x "@TLSCALL\n\t" \
"mov %0, a10\n\t" \
: "=r" (__l) \
: \
: "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15"); \
__l; })
#define TLS_LD(x) \
({ int *__l; \
__asm__ ("movi a8, _TLS_MODULE_BASE_@TLSFUNC\n\t" \
"movi a10, _TLS_MODULE_BASE_@TLSARG\n\t" \
"callx8.tls a8, _TLS_MODULE_BASE_@TLSCALL\n\t" \
"movi %0, " #x "@DTPOFF\n\t" \
"add %0, %0, a10\n\t" \
: "=r" (__l) \
: \
: "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15"); \
__l; })
#elif defined(__XTENSA_CALL0_ABI__)
#ifdef __FDPIC__
#define TLS_GD(x) \
({ int *__l; \
int __t; \
extern unsigned long _GLOBAL_OFFSET_TABLE_[]; \
__asm__ ("movi %[tmp], " #x "@GOTTLSDESC\n\t" \
".reloc ., R_XTENSA_TLS_ARG, " #x "\n\t" \
"add a2, %[tmp], %[got]\n\t" \
".reloc ., R_XTENSA_TLS_FUNCDESC, " #x "\n\t" \
"l32i %[tmp], a2, 0\n\t" \
"mov a12, a11\n\t" \
".reloc ., R_XTENSA_TLS_GOT, " #x "\n\t" \
"l32i a11, %[tmp], 4\n\t" \
".reloc ., R_XTENSA_TLS_FUNC, " #x "\n\t" \
"_l32i %[tmp], %[tmp], 0\n\t" \
".reloc ., R_XTENSA_TLS_CALL, " #x "\n\t" \
"callx0 %[tmp]\n\t" \
"mov a11, a12\n\t" \
"mov %[res], a2\n\t" \
: [res] "=r" (__l), [tmp] "=&r" (__t) \
: [got] "r" (_GLOBAL_OFFSET_TABLE_) \
: "a0", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a12");\
__l; })
#define TLS_LD(x) \
({ int *__l; \
int __t; \
extern unsigned long _GLOBAL_OFFSET_TABLE_[]; \
__asm__ ("movi %[tmp], _TLS_MODULE_BASE_@GOTTLSDESC\n\t" \
".reloc ., R_XTENSA_TLS_ARG, _TLS_MODULE_BASE_\n\t" \
"add a2, %[tmp], %[got]\n\t" \
".reloc ., R_XTENSA_TLS_FUNCDESC, _TLS_MODULE_BASE_\n\t"\
"l32i %[tmp], a2, 0\n\t" \
"mov a12, a11\n\t" \
".reloc ., R_XTENSA_TLS_GOT, _TLS_MODULE_BASE_\n\t" \
"l32i a11, %[tmp], 4\n\t" \
".reloc ., R_XTENSA_TLS_FUNC, _TLS_MODULE_BASE_\n\t" \
"_l32i %[tmp], %[tmp], 0\n\t" \
".reloc ., R_XTENSA_TLS_CALL, _TLS_MODULE_BASE_\n\t" \
"callx0 %[tmp]\n\t" \
"mov a11, a12\n\t" \
"movi %[res], " #x "@DTPOFF\n\t" \
"add %[res], %[res], a2\n\t" \
: [res] "=r" (__l), [tmp] "=&r" (__t) \
: [got] "r" (_GLOBAL_OFFSET_TABLE_) \
: "a0", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a12");\
__l; })
#define TLS_IE(x) \
({ int *__l; \
int __t; \
extern unsigned long _GLOBAL_OFFSET_TABLE_[]; \
__asm__ ("movi %[tmp], " #x "@GOTTPOFF\n\t" \
".reloc ., R_XTENSA_TLS_TPOFF_PTR, " #x "\n\t" \
"add %[tmp], %[tmp], %[got]\n\t" \
".reloc ., R_XTENSA_TLS_TPOFF_LOAD, " #x "\n\t" \
"l32i %[tmp], %[tmp], 0\n\t" \
"rur %[res], threadptr\n\t" \
"add %[res], %[res], %[tmp]\n\t" \
: [res] "=r" (__l), [tmp] "=&r" (__t) \
: [got] "r" (_GLOBAL_OFFSET_TABLE_)); \
__l; })
#define TLS_LE(x) \
({ int *__l; \
int __t; \
__asm__ ("rur %0, threadptr\n\t" \
"movi %1, " #x "@TPOFF\n\t" \
"add %0, %0, %1\n\t" \
: "=r" (__l), "=r" (__t) ); \
__l; })
#else
#define TLS_GD(x) \
({ int *__l; \
__asm__ ("movi a0, " #x "@TLSFUNC\n\t" \
"movi a2, " #x "@TLSARG\n\t" \
"callx0.tls a0, " #x "@TLSCALL\n\t" \
"mov %0, a2\n\t" \
: "=r" (__l) \
: \
: "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11");\
__l; })
#define TLS_LD(x) \
({ int *__l; \
__asm__ ("movi a0, _TLS_MODULE_BASE_@TLSFUNC\n\t" \
"movi a2, _TLS_MODULE_BASE_@TLSARG\n\t" \
"callx0.tls a0, _TLS_MODULE_BASE_@TLSCALL\n\t" \
"movi %0, " #x "@DTPOFF\n\t" \
"add %0, %0, a2\n\t" \
: "=r" (__l) \
: \
: "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11");\
__l; })
#endif
#else
#error Unsupported Xtensa ABI
#endif
#ifndef __FDPIC__
#define TLS_IE(x) TLS_LE(x)
#define TLS_LE(x) \
({ int *__l; \
int __t; \
__asm__ ("rur %0, threadptr\n\t" \
"movi %1, " #x "@TPOFF\n\t" \
"add %0, %0, %1\n\t" \
: "=r" (__l), "=r" (__t) ); \
__l; })
#endif
|