tls.c 824 B

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