#ifndef COSMOPOLITAN_LIBC_RUNTIME_FSGSBASE_H_ #define COSMOPOLITAN_LIBC_RUNTIME_FSGSBASE_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ void *_rdfsbase(void); void *_rdgsbase(void); void *_wrfsbase(void *); void *_wrgsbase(void *); int _have_fsgsbase(void); #if defined(__GNUC__) && !defined(__STRICT_ANSI__) && defined(__x86_64__) #define _rdfsbase() \ ({ \ void *_p; \ asm("rdfsbase\t%0" : "=r"(_p)); \ _p; \ }) #define _rdgsbase() \ ({ \ void *_p; \ asm("rdgsbase\t%0" : "=r"(_p)); \ _p; \ }) #define _wrfsbase(p) \ ({ \ void *_p = p; \ asm volatile("wrfsbase\t%0" \ : /* no outputs */ \ : "r"(_p) \ : "memory"); \ _p; \ }) #define _wrgsbase(p) \ ({ \ void *_p = p; \ asm volatile("wrgsbase\t%0" \ : /* no outputs */ \ : "r"(_p) \ : "memory"); \ _p; \ }) #endif /* GNUC && !ANSI */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_RUNTIME_FSGSBASE_H_ */