~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/um/os-Linux/tls.c

Version: ~ [ linux-5.11 ] ~ [ linux-5.10.17 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.99 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.176 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.221 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.257 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.257 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 #include <errno.h>
  3 #include <linux/unistd.h>
  4 
  5 #include <sys/ptrace.h>
  6 #include <sys/syscall.h>
  7 #include <unistd.h>
  8 
  9 #include <sysdep/tls.h>
 10 
 11 #ifndef PTRACE_GET_THREAD_AREA
 12 #define PTRACE_GET_THREAD_AREA 25
 13 #endif
 14 
 15 #ifndef PTRACE_SET_THREAD_AREA
 16 #define PTRACE_SET_THREAD_AREA 26
 17 #endif
 18 
 19 /* Checks whether host supports TLS, and sets *tls_min according to the value
 20  * valid on the host.
 21  * i386 host have it == 6; x86_64 host have it == 12, for i386 emulation. */
 22 void check_host_supports_tls(int *supports_tls, int *tls_min)
 23 {
 24         /* Values for x86 and x86_64.*/
 25         int val[] = {GDT_ENTRY_TLS_MIN_I386, GDT_ENTRY_TLS_MIN_X86_64};
 26         int i;
 27 
 28         for (i = 0; i < ARRAY_SIZE(val); i++) {
 29                 user_desc_t info;
 30                 info.entry_number = val[i];
 31 
 32                 if (syscall(__NR_get_thread_area, &info) == 0) {
 33                         *tls_min = val[i];
 34                         *supports_tls = 1;
 35                         return;
 36                 } else {
 37                         if (errno == EINVAL)
 38                                 continue;
 39                         else if (errno == ENOSYS)
 40                                 *supports_tls = 0;
 41                         return;
 42                 }
 43         }
 44 
 45         *supports_tls = 0;
 46 }
 47 
 48 int os_set_thread_area(user_desc_t *info, int pid)
 49 {
 50         int ret;
 51 
 52         ret = ptrace(PTRACE_SET_THREAD_AREA, pid, info->entry_number,
 53                      (unsigned long) info);
 54         if (ret < 0)
 55                 ret = -errno;
 56         return ret;
 57 }
 58 
 59 int os_get_thread_area(user_desc_t *info, int pid)
 60 {
 61         int ret;
 62 
 63         ret = ptrace(PTRACE_GET_THREAD_AREA, pid, info->entry_number,
 64                      (unsigned long) info);
 65         if (ret < 0)
 66                 ret = -errno;
 67         return ret;
 68 }
 69 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp