| @@ -226,70 +226,80 @@ uptr ThreadSelfOffset() { | | | @@ -226,70 +226,80 @@ uptr ThreadSelfOffset() { |
226 | uptr ThreadSelf() { | | 226 | uptr ThreadSelf() { |
227 | uptr descr_addr; | | 227 | uptr descr_addr; |
228 | # if defined(__i386__) | | 228 | # if defined(__i386__) |
229 | asm("mov %%gs:%c1,%0" : "=r"(descr_addr) : "i"(kThreadSelfOffset)); | | 229 | asm("mov %%gs:%c1,%0" : "=r"(descr_addr) : "i"(kThreadSelfOffset)); |
230 | # elif defined(__x86_64__) | | 230 | # elif defined(__x86_64__) |
231 | asm("mov %%fs:%c1,%0" : "=r"(descr_addr) : "i"(kThreadSelfOffset)); | | 231 | asm("mov %%fs:%c1,%0" : "=r"(descr_addr) : "i"(kThreadSelfOffset)); |
232 | # else | | 232 | # else |
233 | # error "unsupported CPU arch" | | 233 | # error "unsupported CPU arch" |
234 | # endif | | 234 | # endif |
235 | return descr_addr; | | 235 | return descr_addr; |
236 | } | | 236 | } |
237 | #endif // (defined(__x86_64__) || defined(__i386__)) && SANITIZER_LINUX | | 237 | #endif // (defined(__x86_64__) || defined(__i386__)) && SANITIZER_LINUX |
238 | | | 238 | |
239 | #if SANITIZER_FREEBSD || SANITIZER_NETBSD | | 239 | #if SANITIZER_FREEBSD |
240 | static void **ThreadSelfSegbase() { | | 240 | static void **ThreadSelfSegbase() { |
241 | void **segbase = 0; | | 241 | void **segbase = 0; |
242 | # if defined(__i386__) | | 242 | # if defined(__i386__) |
243 | // sysarch(I386_GET_GSBASE, segbase); | | 243 | // sysarch(I386_GET_GSBASE, segbase); |
244 | __asm __volatile("mov %%gs:0, %0" : "=r" (segbase)); | | 244 | __asm __volatile("mov %%gs:0, %0" : "=r" (segbase)); |
245 | # elif defined(__x86_64__) | | 245 | # elif defined(__x86_64__) |
246 | // sysarch(AMD64_GET_FSBASE, segbase); | | 246 | // sysarch(AMD64_GET_FSBASE, segbase); |
247 | __asm __volatile("movq %%fs:0, %0" : "=r" (segbase)); | | 247 | __asm __volatile("movq %%fs:0, %0" : "=r" (segbase)); |
248 | # else | | 248 | # else |
249 | # error "unsupported CPU arch for FreeBSD platform" | | 249 | # error "unsupported CPU arch for FreeBSD platform" |
250 | # endif | | 250 | # endif |
251 | return segbase; | | 251 | return segbase; |
252 | } | | 252 | } |
253 | | | 253 | |
254 | uptr ThreadSelf() { | | 254 | uptr ThreadSelf() { |
255 | return (uptr)ThreadSelfSegbase()[2]; | | 255 | return (uptr)ThreadSelfSegbase()[2]; |
256 | } | | 256 | } |
257 | #endif // SANITIZER_FREEBSD || SANITIZER_NETBSD | | 257 | #endif // SANITIZER_FREEBSD |
| | | 258 | |
| | | 259 | #if SANITIZER_NETBSD |
| | | 260 | uptr ThreadSelf() { |
| | | 261 | return (uptr)pthread_self(); |
| | | 262 | } |
| | | 263 | #endif // SANITIZER_NETBSD |
258 | | | 264 | |
259 | static void GetTls(uptr *addr, uptr *size) { | | 265 | static void GetTls(uptr *addr, uptr *size) { |
260 | #if SANITIZER_LINUX | | 266 | #if SANITIZER_LINUX |
261 | # if defined(__x86_64__) || defined(__i386__) | | 267 | # if defined(__x86_64__) || defined(__i386__) |
262 | *addr = ThreadSelf(); | | 268 | *addr = ThreadSelf(); |
263 | *size = GetTlsSize(); | | 269 | *size = GetTlsSize(); |
264 | *addr -= *size; | | 270 | *addr -= *size; |
265 | *addr += ThreadDescriptorSize(); | | 271 | *addr += ThreadDescriptorSize(); |
266 | # else | | 272 | # else |
267 | *addr = 0; | | 273 | *addr = 0; |
268 | *size = 0; | | 274 | *size = 0; |
269 | # endif | | 275 | # endif |
270 | #elif SANITIZER_FREEBSD || SANITIZER_NETBSD | | 276 | #elif SANITIZER_FREEBSD |
271 | void** segbase = ThreadSelfSegbase(); | | 277 | void** segbase = ThreadSelfSegbase(); |
272 | *addr = 0; | | 278 | *addr = 0; |
273 | *size = 0; | | 279 | *size = 0; |
274 | if (segbase != 0) { | | 280 | if (segbase != 0) { |
275 | // tcbalign = 16 | | 281 | // tcbalign = 16 |
276 | // tls_size = round(tls_static_space, tcbalign); | | 282 | // tls_size = round(tls_static_space, tcbalign); |
277 | // dtv = segbase[1]; | | 283 | // dtv = segbase[1]; |
278 | // dtv[2] = segbase - tls_static_space; | | 284 | // dtv[2] = segbase - tls_static_space; |
279 | void **dtv = (void**) segbase[1]; | | 285 | void **dtv = (void**) segbase[1]; |
280 | *addr = (uptr) dtv[2]; | | 286 | *addr = (uptr) dtv[2]; |
281 | *size = (*addr == 0) ? 0 : ((uptr) segbase[0] - (uptr) dtv[2]); | | 287 | *size = (*addr == 0) ? 0 : ((uptr) segbase[0] - (uptr) dtv[2]); |
282 | } | | 288 | } |
| | | 289 | #elif SANITIZER_NETBSD |
| | | 290 | // XXX: for now |
| | | 291 | *addr = 0; |
| | | 292 | *size = 0; |
283 | #else | | 293 | #else |
284 | # error "Unknown OS" | | 294 | # error "Unknown OS" |
285 | #endif | | 295 | #endif |
286 | } | | 296 | } |
287 | | | 297 | |
288 | uptr GetTlsSize() { | | 298 | uptr GetTlsSize() { |
289 | #if SANITIZER_FREEBSD || SANITIZER_NETBSD | | 299 | #if SANITIZER_FREEBSD || SANITIZER_NETBSD |
290 | uptr addr, size; | | 300 | uptr addr, size; |
291 | GetTls(&addr, &size); | | 301 | GetTls(&addr, &size); |
292 | return size; | | 302 | return size; |
293 | #else | | 303 | #else |
294 | return g_tls_size; | | 304 | return g_tls_size; |
295 | #endif | | 305 | #endif |