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 @@ #include "kern_util.h" #include "skas/mm_id.h" #include "irq_user.h" +#include "sysdep/tls.h" #define OS_TYPE_FILE 1 #define OS_TYPE_DIR 2 @@ -238,10 +239,10 @@ extern int helper_wait(int pid); /* tls.c */ -extern int os_set_thread_area(void *data, int pid); -extern int os_get_thread_area(void *data, int pid); -/* umid.c */ +extern int os_set_thread_area(user_desc_t *info, int pid); +extern int os_get_thread_area(user_desc_t *info, int pid); +/* umid.c */ extern int umid_file_name(char *name, char *buf, int len); extern int set_umid(char *name); 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 @@ +#ifndef _SYSDEP_TLS_H +#define _SYSDEP_TLS_H + +# ifndef __KERNEL__ + +/* Change name to avoid conflicts with the original one from <asm/ldt.h>, which + * may be named user_desc (but in 2.4 and in header matching its API was named + * modify_ldt_ldt_s). */ + +typedef struct um_dup_user_desc { + unsigned int entry_number; + unsigned int base_addr; + unsigned int limit; + unsigned int seg_32bit:1; + unsigned int contents:2; + unsigned int read_exec_only:1; + unsigned int limit_in_pages:1; + unsigned int seg_not_present:1; + unsigned int useable:1; +} user_desc_t; + +# else /* __KERNEL__ */ + +# include <asm/ldt.h> +typedef struct user_desc user_desc_t; + +# endif /* __KERNEL__ */ +#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 @@ +#ifndef _SYSDEP_TLS_H +#define _SYSDEP_TLS_H + +# ifndef __KERNEL__ + +/* Change name to avoid conflicts with the original one from <asm/ldt.h>, which + * may be named user_desc (but in 2.4 and in header matching its API was named + * modify_ldt_ldt_s). */ + +typedef struct um_dup_user_desc { + unsigned int entry_number; + unsigned int base_addr; + unsigned int limit; + unsigned int seg_32bit:1; + unsigned int contents:2; + unsigned int read_exec_only:1; + unsigned int limit_in_pages:1; + unsigned int seg_not_present:1; + unsigned int useable:1; + unsigned int lm:1; +} user_desc_t; + +# else /* __KERNEL__ */ + +# include <asm/ldt.h> +typedef struct user_desc user_desc_t; + +# endif /* __KERNEL__ */ +#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 @@ #include <errno.h> #include <sys/ptrace.h> #include <asm/ldt.h> +#include "sysdep/tls.h" #include "uml-config.h" /* TLS support - we basically rely on the host's one.*/ @@ -18,9 +19,8 @@ #define PTRACE_SET_THREAD_AREA 26 #endif -int os_set_thread_area(void *data, int pid) +int os_set_thread_area(user_desc_t *info, int pid) { - struct user_desc *info = data; int ret; ret = ptrace(PTRACE_SET_THREAD_AREA, pid, info->entry_number, @@ -32,9 +32,8 @@ int os_set_thread_area(void *data, int pid) #ifdef UML_CONFIG_MODE_SKAS -int os_get_thread_area(void *data, int pid) +int os_get_thread_area(user_desc_t *info, int pid) { - struct user_desc *info = data; int ret; ret = ptrace(PTRACE_GET_THREAD_AREA, pid, info->entry_number, @@ -49,10 +48,10 @@ int os_get_thread_area(void *data, int pid) #ifdef UML_CONFIG_MODE_TT #include "linux/unistd.h" -_syscall1(int, get_thread_area, struct user_desc *, u_info); -_syscall1(int, set_thread_area, struct user_desc *, u_info); +_syscall1(int, get_thread_area, user_desc_t *, u_info); +_syscall1(int, set_thread_area, user_desc_t *, u_info); -int do_set_thread_area_tt(struct user_desc *info) +int do_set_thread_area_tt(user_desc_t *info) { int ret; @@ -63,7 +62,7 @@ int do_set_thread_area_tt(struct user_desc *info) return ret; } -int do_get_thread_area_tt(struct user_desc *info) +int do_get_thread_area_tt(user_desc_t *info) { int ret; |