aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorAl Viro <viro@ftp.linux.org.uk>2011-08-18 15:09:49 -0400
committerRichard Weinberger <richard@nod.at>2011-11-02 09:15:17 -0400
commit1bbd5f21f426d99660ea8120b79595a282e5ff8a (patch)
treef9980460722d4f89ca468c7af92502daa82d8c1a /arch/x86
parentc5cc32fe14ccbc19484202d20cf7d6bad45e3567 (diff)
um: merge os-Linux/tls.c into arch/x86/um/os-Linux/tls.c
it's i386-specific; moreover, analogs on other targets have incompatible interface - PTRACE_GET_THREAD_AREA does exist elsewhere, but struct user_desc does *not* Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/um/os-Linux/tls.c34
-rw-r--r--arch/x86/um/shared/sysdep/tls.h3
2 files changed, 36 insertions, 1 deletions
diff --git a/arch/x86/um/os-Linux/tls.c b/arch/x86/um/os-Linux/tls.c
index 281e83ecce3d..82276b6071af 100644
--- a/arch/x86/um/os-Linux/tls.c
+++ b/arch/x86/um/os-Linux/tls.c
@@ -1,15 +1,25 @@
1#include <errno.h> 1#include <errno.h>
2#include <linux/unistd.h> 2#include <linux/unistd.h>
3 3
4#include <sys/ptrace.h>
4#include <sys/syscall.h> 5#include <sys/syscall.h>
5#include <unistd.h> 6#include <unistd.h>
6 7
7#include "sysdep/tls.h" 8#include "sysdep/tls.h"
8 9
10#ifndef PTRACE_GET_THREAD_AREA
11#define PTRACE_GET_THREAD_AREA 25
12#endif
13
14#ifndef PTRACE_SET_THREAD_AREA
15#define PTRACE_SET_THREAD_AREA 26
16#endif
17
9/* Checks whether host supports TLS, and sets *tls_min according to the value 18/* Checks whether host supports TLS, and sets *tls_min according to the value
10 * valid on the host. 19 * valid on the host.
11 * i386 host have it == 6; x86_64 host have it == 12, for i386 emulation. */ 20 * i386 host have it == 6; x86_64 host have it == 12, for i386 emulation. */
12void check_host_supports_tls(int *supports_tls, int *tls_min) { 21void check_host_supports_tls(int *supports_tls, int *tls_min)
22{
13 /* Values for x86 and x86_64.*/ 23 /* Values for x86 and x86_64.*/
14 int val[] = {GDT_ENTRY_TLS_MIN_I386, GDT_ENTRY_TLS_MIN_X86_64}; 24 int val[] = {GDT_ENTRY_TLS_MIN_I386, GDT_ENTRY_TLS_MIN_X86_64};
15 int i; 25 int i;
@@ -33,3 +43,25 @@ void check_host_supports_tls(int *supports_tls, int *tls_min) {
33 43
34 *supports_tls = 0; 44 *supports_tls = 0;
35} 45}
46
47int os_set_thread_area(user_desc_t *info, int pid)
48{
49 int ret;
50
51 ret = ptrace(PTRACE_SET_THREAD_AREA, pid, info->entry_number,
52 (unsigned long) info);
53 if (ret < 0)
54 ret = -errno;
55 return ret;
56}
57
58int os_get_thread_area(user_desc_t *info, int pid)
59{
60 int ret;
61
62 ret = ptrace(PTRACE_GET_THREAD_AREA, pid, info->entry_number,
63 (unsigned long) info);
64 if (ret < 0)
65 ret = -errno;
66 return ret;
67}
diff --git a/arch/x86/um/shared/sysdep/tls.h b/arch/x86/um/shared/sysdep/tls.h
index db2ae9c12e23..f2f30bd67b9b 100644
--- a/arch/x86/um/shared/sysdep/tls.h
+++ b/arch/x86/um/shared/sysdep/tls.h
@@ -29,6 +29,9 @@ typedef struct user_desc user_desc_t;
29 29
30# endif /* __KERNEL__ */ 30# endif /* __KERNEL__ */
31 31
32extern int os_set_thread_area(user_desc_t *info, int pid);
33extern int os_get_thread_area(user_desc_t *info, int pid);
34
32#ifdef __i386__ 35#ifdef __i386__
33#define GDT_ENTRY_TLS_MIN_I386 6 36#define GDT_ENTRY_TLS_MIN_I386 6
34#define GDT_ENTRY_TLS_MIN_X86_64 12 37#define GDT_ENTRY_TLS_MIN_X86_64 12