#define SYSCALL_NO_TLS 1 #include #include "syscall.h" struct user_desc { uint32_t entry_number; uint32_t base_addr; uint32_t limit; uint32_t flags; }; static int entry_number = -1; int __set_thread_area_2(void *p) { struct user_desc desc = { entry_number, (uintptr_t)p, 0xfffff, 0x51 }; int r = __syscall(SYS_set_thread_area, &desc); if (!r) { entry_number = desc.entry_number; __asm__ __volatile__ ("mov %0,%%gs" : : "r"(3+8*desc.entry_number)); return 0; } desc.entry_number = 0; r = __syscall(SYS_modify_ldt, 1, &desc, 16); if (!r) { __asm__ __volatile__ ("mov %0,%%gs" : : "r"(7)); return 1; } return r; }