1*5c48b108SAl Viro #include <errno.h> 2*5c48b108SAl Viro #include <linux/unistd.h> 3*5c48b108SAl Viro 4*5c48b108SAl Viro #include <sys/syscall.h> 5*5c48b108SAl Viro #include <unistd.h> 6*5c48b108SAl Viro 7*5c48b108SAl Viro #include "sysdep/tls.h" 8*5c48b108SAl Viro 9*5c48b108SAl Viro /* Checks whether host supports TLS, and sets *tls_min according to the value 10*5c48b108SAl Viro * valid on the host. 11*5c48b108SAl Viro * i386 host have it == 6; x86_64 host have it == 12, for i386 emulation. */ 12*5c48b108SAl Viro void check_host_supports_tls(int *supports_tls, int *tls_min) { 13*5c48b108SAl Viro /* Values for x86 and x86_64.*/ 14*5c48b108SAl Viro int val[] = {GDT_ENTRY_TLS_MIN_I386, GDT_ENTRY_TLS_MIN_X86_64}; 15*5c48b108SAl Viro int i; 16*5c48b108SAl Viro 17*5c48b108SAl Viro for (i = 0; i < ARRAY_SIZE(val); i++) { 18*5c48b108SAl Viro user_desc_t info; 19*5c48b108SAl Viro info.entry_number = val[i]; 20*5c48b108SAl Viro 21*5c48b108SAl Viro if (syscall(__NR_get_thread_area, &info) == 0) { 22*5c48b108SAl Viro *tls_min = val[i]; 23*5c48b108SAl Viro *supports_tls = 1; 24*5c48b108SAl Viro return; 25*5c48b108SAl Viro } else { 26*5c48b108SAl Viro if (errno == EINVAL) 27*5c48b108SAl Viro continue; 28*5c48b108SAl Viro else if (errno == ENOSYS) 29*5c48b108SAl Viro *supports_tls = 0; 30*5c48b108SAl Viro return; 31*5c48b108SAl Viro } 32*5c48b108SAl Viro } 33*5c48b108SAl Viro 34*5c48b108SAl Viro *supports_tls = 0; 35*5c48b108SAl Viro } 36