diff options
| -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 | ||
