160 lines
3.7 KiB
C
160 lines
3.7 KiB
C
|
#ifdef _SYSDEP_H
|
||
|
#define _SYSDEP_H 1
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#ifdef __i386__
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
void *tcb;
|
||
|
dtv_t *dtv;
|
||
|
void *self;
|
||
|
int multiple_threads;
|
||
|
uintptr_t sysinfo;
|
||
|
uintptr_t stack_guard;
|
||
|
uintptr_t pointer_guard;
|
||
|
int gscope_flag;
|
||
|
int private_futex;
|
||
|
} tcbhead_t;
|
||
|
|
||
|
# ifdef FOR_GLIBC_2_6_AND_LATER
|
||
|
# define PTR_MANGLE(var) asm ("xorl %%gs:%c2, %0\n" \
|
||
|
"roll $9, %0" \
|
||
|
: "=r" (var) \
|
||
|
: "0" (var), \
|
||
|
"i" (offsetof (tcbhead_t, \
|
||
|
pointer_guard)))
|
||
|
# define PTR_DEMANGLE(var) asm ("rorl $9, %0" \
|
||
|
"xorl %%gs:%c2, %0" \
|
||
|
: "=r" (var) \
|
||
|
: "0" (var), \
|
||
|
"i" (offsetof (tcbhead_t, \
|
||
|
pointer_guard)))
|
||
|
# else
|
||
|
# define PTR_MANGLE(var) asm ("xorl %%gs:%c2, %0" \
|
||
|
: "=r" (var) \
|
||
|
: "0" (var), \
|
||
|
"i" (offsetof (tcbhead_t, \
|
||
|
pointer_guard)))
|
||
|
# define PTR_DEMANGLE(var) asm ("xorl %%gs:%c2, %0" \
|
||
|
: "=r" (var) \
|
||
|
: "0" (var), \
|
||
|
"i" (offsetof (tcbhead_t, \
|
||
|
pointer_guard)))
|
||
|
# endif
|
||
|
|
||
|
#elif defined __x86_64__
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
void *tcb;
|
||
|
void *dtv;
|
||
|
void *self;
|
||
|
int multiple_threads;
|
||
|
int gscope_flag;
|
||
|
uintptr_t sysinfo;
|
||
|
uintptr_t stack_guard;
|
||
|
uintptr_t pointer_guard;
|
||
|
unsigned long int vgetcpu_cache[2];
|
||
|
int private_futex;
|
||
|
int __pad1;
|
||
|
void *__private_tm[5];
|
||
|
} tcbhead_t;
|
||
|
|
||
|
# ifdef FOR_GLIBC_2_6_AND_LATER
|
||
|
# define PTR_MANGLE(var) asm ("xorq %%fs:%c2, %0\n" \
|
||
|
"rolq $17, %0" \
|
||
|
: "=r" (var) \
|
||
|
: "0" (var), \
|
||
|
"i" (offsetof (tcbhead_t, \
|
||
|
pointer_guard)))
|
||
|
# define PTR_DEMANGLE(var) asm ("rorq $17, %0" \
|
||
|
"xorq %%fs:%c2, %0" \
|
||
|
: "=r" (var) \
|
||
|
: "0" (var), \
|
||
|
"i" (offsetof (tcbhead_t, \
|
||
|
pointer_guard)))
|
||
|
# else
|
||
|
# define PTR_MANGLE(var) asm ("xorq %%fs:%c2, %0" \
|
||
|
: "=r" (var) \
|
||
|
: "0" (var), \
|
||
|
"i" (offsetof (tcbhead_t, \
|
||
|
pointer_guard)))
|
||
|
# define PTR_DEMANGLE(var) asm ("xorq %%fs:%c2, %0" \
|
||
|
: "=r" (var) \
|
||
|
: "0" (var), \
|
||
|
"i" (offsetof (tcbhead_t, \
|
||
|
pointer_guard)))
|
||
|
# endif
|
||
|
|
||
|
#elif defined __powerpc__ || defined __powerpc64__
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
uintptr_t pointer_guard;
|
||
|
uintptr_t stack_guard;
|
||
|
void *dtv;
|
||
|
} tcbhead_t;
|
||
|
|
||
|
# ifndef __powerpc64__
|
||
|
register void *__thread_register __asm__ ("r2");
|
||
|
# else
|
||
|
register void *__thread_register __asm__ ("r13");
|
||
|
# endif
|
||
|
|
||
|
# define TLS_TCB_OFFSET 0x7000
|
||
|
|
||
|
# define THREAD_GET_POINTER_GUARD() \
|
||
|
(((tcbhead_t *) ((char *) __thread_register \
|
||
|
- TLS_TCB_OFFSET))[-1].pointer_guard)
|
||
|
|
||
|
# define PTR_MANGLE(var) \
|
||
|
(var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
|
||
|
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||
|
|
||
|
#elif defined __IA_64__
|
||
|
|
||
|
register void *__thread_self __asm__("r13");
|
||
|
|
||
|
#define THREAD_GET_POINTER_GUARD() \
|
||
|
(((uintptr_t *) __thread_self)[-2])
|
||
|
|
||
|
# define PTR_MANGLE(var) \
|
||
|
(var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
|
||
|
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||
|
|
||
|
#elif defined __s390__ || defined __s390x__
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
void *tcb;
|
||
|
void *dtv;
|
||
|
void *self;
|
||
|
int multiple_threads;
|
||
|
uintptr_t sysinfo;
|
||
|
uintptr_t stack_guard;
|
||
|
int gscope_flag;
|
||
|
int private_futex;
|
||
|
} tcbhead_t;
|
||
|
|
||
|
# define THREAD_SELF ((tcbhead_t *) __builtin_thread_pointer ())
|
||
|
|
||
|
#define THREAD_GETMEM(descr, member) \
|
||
|
descr->member
|
||
|
|
||
|
#define THREAD_GET_POINTER_GUARD() \
|
||
|
THREAD_GETMEM (THREAD_SELF, stack_guard)
|
||
|
|
||
|
# define PTR_MANGLE(var) \
|
||
|
(var) = (__typeof (var)) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
|
||
|
# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
||
|
|
||
|
#else
|
||
|
|
||
|
# error "missing support for this architecture"
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif
|