aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um')
-rw-r--r--arch/um/include/os.h7
-rw-r--r--arch/um/include/sysdep-i386/tls.h28
-rw-r--r--arch/um/include/sysdep-x86_64/tls.h29
-rw-r--r--arch/um/os-Linux/tls.c15
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 */
241extern int os_set_thread_area(void *data, int pid); 242extern int os_set_thread_area(user_desc_t *info, int pid);
242extern int os_get_thread_area(void *data, int pid); 243extern int os_get_thread_area(user_desc_t *info, int pid);
243/* umid.c */
244 244
245/* umid.c */
245extern int umid_file_name(char *name, char *buf, int len); 246extern int umid_file_name(char *name, char *buf, int len);
246extern int set_umid(char *name); 247extern int set_umid(char *name);
247extern char *get_umid(void); 248extern 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
10typedef 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>
25typedef 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
10typedef 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>
26typedef 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
21int os_set_thread_area(void *data, int pid) 22int 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
35int os_get_thread_area(void *data, int pid) 35int 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
55int do_set_thread_area_tt(struct user_desc *info) 54int 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
66int do_get_thread_area_tt(struct user_desc *info) 65int do_get_thread_area_tt(user_desc_t *info)
67{ 66{
68 int ret; 67 int ret;
69 68