diff options
Diffstat (limited to 'arch/um')
-rw-r--r-- | arch/um/include/os.h | 7 | ||||
-rw-r--r-- | arch/um/include/sysdep-i386/tls.h | 28 | ||||
-rw-r--r-- | arch/um/include/sysdep-x86_64/tls.h | 29 | ||||
-rw-r--r-- | arch/um/os-Linux/tls.c | 15 |
4 files changed, 68 insertions, 11 deletions
diff --git a/arch/um/include/os.h b/arch/um/include/os.h index e9e1db1e08d0..1b780b5dacbe 100644 --- a/arch/um/include/os.h +++ b/arch/um/include/os.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #include "kern_util.h" | 13 | #include "kern_util.h" |
14 | #include "skas/mm_id.h" | 14 | #include "skas/mm_id.h" |
15 | #include "irq_user.h" | 15 | #include "irq_user.h" |
16 | #include "sysdep/tls.h" | ||
16 | 17 | ||
17 | #define OS_TYPE_FILE 1 | 18 | #define OS_TYPE_FILE 1 |
18 | #define OS_TYPE_DIR 2 | 19 | #define OS_TYPE_DIR 2 |
@@ -238,10 +239,10 @@ extern int helper_wait(int pid); | |||
238 | 239 | ||
239 | 240 | ||
240 | /* tls.c */ | 241 | /* tls.c */ |
241 | extern int os_set_thread_area(void *data, int pid); | 242 | extern int os_set_thread_area(user_desc_t *info, int pid); |
242 | extern int os_get_thread_area(void *data, int pid); | 243 | extern int os_get_thread_area(user_desc_t *info, int pid); |
243 | /* umid.c */ | ||
244 | 244 | ||
245 | /* umid.c */ | ||
245 | extern int umid_file_name(char *name, char *buf, int len); | 246 | extern int umid_file_name(char *name, char *buf, int len); |
246 | extern int set_umid(char *name); | 247 | extern int set_umid(char *name); |
247 | extern char *get_umid(void); | 248 | extern char *get_umid(void); |
diff --git a/arch/um/include/sysdep-i386/tls.h b/arch/um/include/sysdep-i386/tls.h new file mode 100644 index 000000000000..938f953b26cc --- /dev/null +++ b/arch/um/include/sysdep-i386/tls.h | |||
@@ -0,0 +1,28 @@ | |||
1 | #ifndef _SYSDEP_TLS_H | ||
2 | #define _SYSDEP_TLS_H | ||
3 | |||
4 | # ifndef __KERNEL__ | ||
5 | |||
6 | /* Change name to avoid conflicts with the original one from <asm/ldt.h>, which | ||
7 | * may be named user_desc (but in 2.4 and in header matching its API was named | ||
8 | * modify_ldt_ldt_s). */ | ||
9 | |||
10 | typedef struct um_dup_user_desc { | ||
11 | unsigned int entry_number; | ||
12 | unsigned int base_addr; | ||
13 | unsigned int limit; | ||
14 | unsigned int seg_32bit:1; | ||
15 | unsigned int contents:2; | ||
16 | unsigned int read_exec_only:1; | ||
17 | unsigned int limit_in_pages:1; | ||
18 | unsigned int seg_not_present:1; | ||
19 | unsigned int useable:1; | ||
20 | } user_desc_t; | ||
21 | |||
22 | # else /* __KERNEL__ */ | ||
23 | |||
24 | # include <asm/ldt.h> | ||
25 | typedef struct user_desc user_desc_t; | ||
26 | |||
27 | # endif /* __KERNEL__ */ | ||
28 | #endif /* _SYSDEP_TLS_H */ | ||
diff --git a/arch/um/include/sysdep-x86_64/tls.h b/arch/um/include/sysdep-x86_64/tls.h new file mode 100644 index 000000000000..35f19f25bd3b --- /dev/null +++ b/arch/um/include/sysdep-x86_64/tls.h | |||
@@ -0,0 +1,29 @@ | |||
1 | #ifndef _SYSDEP_TLS_H | ||
2 | #define _SYSDEP_TLS_H | ||
3 | |||
4 | # ifndef __KERNEL__ | ||
5 | |||
6 | /* Change name to avoid conflicts with the original one from <asm/ldt.h>, which | ||
7 | * may be named user_desc (but in 2.4 and in header matching its API was named | ||
8 | * modify_ldt_ldt_s). */ | ||
9 | |||
10 | typedef struct um_dup_user_desc { | ||
11 | unsigned int entry_number; | ||
12 | unsigned int base_addr; | ||
13 | unsigned int limit; | ||
14 | unsigned int seg_32bit:1; | ||
15 | unsigned int contents:2; | ||
16 | unsigned int read_exec_only:1; | ||
17 | unsigned int limit_in_pages:1; | ||
18 | unsigned int seg_not_present:1; | ||
19 | unsigned int useable:1; | ||
20 | unsigned int lm:1; | ||
21 | } user_desc_t; | ||
22 | |||
23 | # else /* __KERNEL__ */ | ||
24 | |||
25 | # include <asm/ldt.h> | ||
26 | typedef struct user_desc user_desc_t; | ||
27 | |||
28 | # endif /* __KERNEL__ */ | ||
29 | #endif /* _SYSDEP_TLS_H */ | ||
diff --git a/arch/um/os-Linux/tls.c b/arch/um/os-Linux/tls.c index 63dfcf709377..642db553ab60 100644 --- a/arch/um/os-Linux/tls.c +++ b/arch/um/os-Linux/tls.c | |||
@@ -1,6 +1,7 @@ | |||
1 | #include <errno.h> | 1 | #include <errno.h> |
2 | #include <sys/ptrace.h> | 2 | #include <sys/ptrace.h> |
3 | #include <asm/ldt.h> | 3 | #include <asm/ldt.h> |
4 | #include "sysdep/tls.h" | ||
4 | #include "uml-config.h" | 5 | #include "uml-config.h" |
5 | 6 | ||
6 | /* TLS support - we basically rely on the host's one.*/ | 7 | /* TLS support - we basically rely on the host's one.*/ |
@@ -18,9 +19,8 @@ | |||
18 | #define PTRACE_SET_THREAD_AREA 26 | 19 | #define PTRACE_SET_THREAD_AREA 26 |
19 | #endif | 20 | #endif |
20 | 21 | ||
21 | int os_set_thread_area(void *data, int pid) | 22 | int os_set_thread_area(user_desc_t *info, int pid) |
22 | { | 23 | { |
23 | struct user_desc *info = data; | ||
24 | int ret; | 24 | int ret; |
25 | 25 | ||
26 | ret = ptrace(PTRACE_SET_THREAD_AREA, pid, info->entry_number, | 26 | ret = ptrace(PTRACE_SET_THREAD_AREA, pid, info->entry_number, |
@@ -32,9 +32,8 @@ int os_set_thread_area(void *data, int pid) | |||
32 | 32 | ||
33 | #ifdef UML_CONFIG_MODE_SKAS | 33 | #ifdef UML_CONFIG_MODE_SKAS |
34 | 34 | ||
35 | int os_get_thread_area(void *data, int pid) | 35 | int os_get_thread_area(user_desc_t *info, int pid) |
36 | { | 36 | { |
37 | struct user_desc *info = data; | ||
38 | int ret; | 37 | int ret; |
39 | 38 | ||
40 | ret = ptrace(PTRACE_GET_THREAD_AREA, pid, info->entry_number, | 39 | ret = ptrace(PTRACE_GET_THREAD_AREA, pid, info->entry_number, |
@@ -49,10 +48,10 @@ int os_get_thread_area(void *data, int pid) | |||
49 | #ifdef UML_CONFIG_MODE_TT | 48 | #ifdef UML_CONFIG_MODE_TT |
50 | #include "linux/unistd.h" | 49 | #include "linux/unistd.h" |
51 | 50 | ||
52 | _syscall1(int, get_thread_area, struct user_desc *, u_info); | 51 | _syscall1(int, get_thread_area, user_desc_t *, u_info); |
53 | _syscall1(int, set_thread_area, struct user_desc *, u_info); | 52 | _syscall1(int, set_thread_area, user_desc_t *, u_info); |
54 | 53 | ||
55 | int do_set_thread_area_tt(struct user_desc *info) | 54 | int do_set_thread_area_tt(user_desc_t *info) |
56 | { | 55 | { |
57 | int ret; | 56 | int ret; |
58 | 57 | ||
@@ -63,7 +62,7 @@ int do_set_thread_area_tt(struct user_desc *info) | |||
63 | return ret; | 62 | return ret; |
64 | } | 63 | } |
65 | 64 | ||
66 | int do_get_thread_area_tt(struct user_desc *info) | 65 | int do_get_thread_area_tt(user_desc_t *info) |
67 | { | 66 | { |
68 | int ret; | 67 | int ret; |
69 | 68 | ||