From 5d40de0f6e726dc9c48fb35815e0a6153e59e1dc Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 18 Aug 2011 20:03:29 +0100 Subject: um: kill dead code around uaccess Signed-off-by: Al Viro Signed-off-by: Richard Weinberger --- arch/um/include/shared/os.h | 6 ------ 1 file changed, 6 deletions(-) (limited to 'arch/um/include/shared/os.h') diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index 83c7c2ecd614..2e2663a8e910 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h @@ -203,12 +203,6 @@ extern int os_drop_memory(void *addr, int length); extern int can_drop_memory(void); extern void os_flush_stdout(void); -/* uaccess.c */ -extern unsigned long __do_user_copy(void *to, const void *from, int n, - void **fault_addr, jmp_buf **fault_catcher, - void (*op)(void *to, const void *from, - int n), int *faulted_out); - /* execvp.c */ extern int execvp_noalloc(char *buf, const char *file, char *const argv[]); /* helper.c */ -- cgit v1.2.3 From e87df986ed053d25dbd57b8b137edec5022874f8 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 18 Aug 2011 20:04:29 +0100 Subject: um: simplify set_handler() For one thing, we always block the same signals (IRQ ones - IO, WINCH, VTALRM), so there's no need to pass sa_mask elements in arguments. For another, the flags depend only on whether it's an IRQ signal or not (we add SA_RESTART for them). Signed-off-by: Al Viro Signed-off-by: Richard Weinberger --- arch/um/include/shared/os.h | 2 +- arch/um/os-Linux/process.c | 19 ++++++------------- arch/um/os-Linux/signal.c | 22 +++++++++++----------- arch/um/os-Linux/skas/process.c | 3 +-- 4 files changed, 19 insertions(+), 27 deletions(-) (limited to 'arch/um/include/shared/os.h') diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index 2e2663a8e910..598ca825ea9f 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h @@ -225,7 +225,7 @@ extern char *get_umid(void); extern void timer_init(void); extern void set_sigstack(void *sig_stack, int size); extern void remove_sigstack(void); -extern void set_handler(int sig, void (*handler)(int), int flags, ...); +extern void set_handler(int sig, void (*handler)(int)); extern int change_sig(int signal, int on); extern void block_signals(void); extern void unblock_signals(void); diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index c1a8fa74ebb9..075ae920143d 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c @@ -235,20 +235,13 @@ out: void init_new_thread_signals(void) { - set_handler(SIGSEGV, (__sighandler_t) sig_handler, SA_ONSTACK, - SIGIO, SIGWINCH, SIGVTALRM, -1); - set_handler(SIGTRAP, (__sighandler_t) sig_handler, SA_ONSTACK, - SIGIO, SIGWINCH, SIGVTALRM, -1); - set_handler(SIGFPE, (__sighandler_t) sig_handler, SA_ONSTACK, - SIGIO, SIGWINCH, SIGVTALRM, -1); - set_handler(SIGILL, (__sighandler_t) sig_handler, SA_ONSTACK, - SIGIO, SIGWINCH, SIGVTALRM, -1); - set_handler(SIGBUS, (__sighandler_t) sig_handler, SA_ONSTACK, - SIGIO, SIGWINCH, SIGVTALRM, -1); + set_handler(SIGSEGV, (__sighandler_t) sig_handler); + set_handler(SIGTRAP, (__sighandler_t) sig_handler); + set_handler(SIGFPE, (__sighandler_t) sig_handler); + set_handler(SIGILL, (__sighandler_t) sig_handler); + set_handler(SIGBUS, (__sighandler_t) sig_handler); signal(SIGHUP, SIG_IGN); - - set_handler(SIGIO, (__sighandler_t) sig_handler, - SA_ONSTACK | SA_RESTART, SIGIO, SIGWINCH, SIGVTALRM, -1); + set_handler(SIGIO, (__sighandler_t) sig_handler); signal(SIGWINCH, SIG_IGN); signal(SIGTERM, SIG_DFL); } diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 75c3e9c9cabb..f248fb2ab58c 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c @@ -111,8 +111,7 @@ void alarm_handler(int sig, struct sigcontext *sc) void timer_init(void) { - set_handler(SIGVTALRM, (__sighandler_t) alarm_handler, - SA_ONSTACK | SA_RESTART, SIGIO, SIGWINCH, -1); + set_handler(SIGVTALRM, (__sighandler_t) alarm_handler); } void set_sigstack(void *sig_stack, int size) @@ -174,27 +173,28 @@ static void hard_handler(int sig, siginfo_t *info, void *p) handle_signal(sig, (struct sigcontext *) &uc->uc_mcontext); } -void set_handler(int sig, void (*handler)(int), int flags, ...) +void set_handler(int sig, void (*handler)(int)) { struct sigaction action; - va_list ap; + int flags = SA_SIGINFO | SA_ONSTACK; sigset_t sig_mask; - int mask; handlers[sig] = (void (*)(int, struct sigcontext *)) handler; action.sa_sigaction = hard_handler; + /* block irq ones */ sigemptyset(&action.sa_mask); - - va_start(ap, flags); - while ((mask = va_arg(ap, int)) != -1) - sigaddset(&action.sa_mask, mask); - va_end(ap); + sigaddset(&action.sa_mask, SIGVTALRM); + sigaddset(&action.sa_mask, SIGIO); + sigaddset(&action.sa_mask, SIGWINCH); if (sig == SIGSEGV) flags |= SA_NODEFER; - action.sa_flags = flags | SA_SIGINFO; + if (sigismember(&action.sa_mask, sig)) + flags |= SA_RESTART; /* if it's an irq signal */ + + action.sa_flags = flags; action.sa_restorer = NULL; if (sigaction(sig, &action, NULL) < 0) panic("sigaction failed - errno = %d\n", errno); diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index 20b34dcb0906..31743f1d1195 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -659,8 +659,7 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf) { int n; - set_handler(SIGWINCH, (__sighandler_t) sig_handler, - SA_ONSTACK | SA_RESTART, SIGIO, SIGVTALRM, -1); + set_handler(SIGWINCH, (__sighandler_t) sig_handler); /* * Can't use UML_SETJMP or UML_LONGJMP here because they save -- cgit v1.2.3 From 00361683ce562402a189362f43370a459b166645 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 18 Aug 2011 20:04:39 +0100 Subject: um: fill the handlers array at build time Signed-off-by: Al Viro Signed-off-by: Richard Weinberger --- arch/um/include/shared/os.h | 2 +- arch/um/os-Linux/process.c | 12 ++++++------ arch/um/os-Linux/signal.c | 17 +++++++++++++---- arch/um/os-Linux/skas/process.c | 2 +- 4 files changed, 21 insertions(+), 12 deletions(-) (limited to 'arch/um/include/shared/os.h') diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index 598ca825ea9f..caa66619a9b4 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h @@ -225,7 +225,7 @@ extern char *get_umid(void); extern void timer_init(void); extern void set_sigstack(void *sig_stack, int size); extern void remove_sigstack(void); -extern void set_handler(int sig, void (*handler)(int)); +extern void set_handler(int sig); extern int change_sig(int signal, int on); extern void block_signals(void); extern void unblock_signals(void); diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index 075ae920143d..e08fe305beb1 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c @@ -235,13 +235,13 @@ out: void init_new_thread_signals(void) { - set_handler(SIGSEGV, (__sighandler_t) sig_handler); - set_handler(SIGTRAP, (__sighandler_t) sig_handler); - set_handler(SIGFPE, (__sighandler_t) sig_handler); - set_handler(SIGILL, (__sighandler_t) sig_handler); - set_handler(SIGBUS, (__sighandler_t) sig_handler); + set_handler(SIGSEGV); + set_handler(SIGTRAP); + set_handler(SIGFPE); + set_handler(SIGILL); + set_handler(SIGBUS); signal(SIGHUP, SIG_IGN); - set_handler(SIGIO, (__sighandler_t) sig_handler); + set_handler(SIGIO); signal(SIGWINCH, SIG_IGN); signal(SIGTERM, SIG_DFL); } diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index f248fb2ab58c..c4a4e2026630 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c @@ -111,7 +111,7 @@ void alarm_handler(int sig, struct sigcontext *sc) void timer_init(void) { - set_handler(SIGVTALRM, (__sighandler_t) alarm_handler); + set_handler(SIGVTALRM); } void set_sigstack(void *sig_stack, int size) @@ -124,7 +124,17 @@ void set_sigstack(void *sig_stack, int size) panic("enabling signal stack failed, errno = %d\n", errno); } -static void (*handlers[_NSIG])(int sig, struct sigcontext *sc); +static void (*handlers[_NSIG])(int sig, struct sigcontext *sc) = { + [SIGSEGV] = sig_handler, + [SIGBUS] = sig_handler, + [SIGILL] = sig_handler, + [SIGFPE] = sig_handler, + [SIGTRAP] = sig_handler, + + [SIGIO] = sig_handler, + [SIGWINCH] = sig_handler, + [SIGVTALRM] = alarm_handler +}; static void handle_signal(int sig, struct sigcontext *sc) { @@ -173,13 +183,12 @@ static void hard_handler(int sig, siginfo_t *info, void *p) handle_signal(sig, (struct sigcontext *) &uc->uc_mcontext); } -void set_handler(int sig, void (*handler)(int)) +void set_handler(int sig) { struct sigaction action; int flags = SA_SIGINFO | SA_ONSTACK; sigset_t sig_mask; - handlers[sig] = (void (*)(int, struct sigcontext *)) handler; action.sa_sigaction = hard_handler; /* block irq ones */ diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index 31743f1d1195..f4e02ad72e12 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -659,7 +659,7 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf) { int n; - set_handler(SIGWINCH, (__sighandler_t) sig_handler); + set_handler(SIGWINCH); /* * Can't use UML_SETJMP or UML_LONGJMP here because they save -- cgit v1.2.3 From 1bbd5f21f426d99660ea8120b79595a282e5ff8a Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 18 Aug 2011 20:09:49 +0100 Subject: 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 Signed-off-by: Richard Weinberger --- arch/um/include/shared/os.h | 5 ----- arch/um/os-Linux/Makefile | 4 ++-- arch/um/os-Linux/tls.c | 35 ----------------------------------- arch/x86/um/os-Linux/tls.c | 34 +++++++++++++++++++++++++++++++++- arch/x86/um/shared/sysdep/tls.h | 3 +++ 5 files changed, 38 insertions(+), 43 deletions(-) delete mode 100644 arch/um/os-Linux/tls.c (limited to 'arch/um/include/shared/os.h') diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index caa66619a9b4..89b686c1a3ea 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h @@ -10,7 +10,6 @@ #include "irq_user.h" #include "longjmp.h" #include "mm_id.h" -#include "sysdep/tls.h" #define CATCH_EINTR(expr) while ((errno = 0, ((expr) < 0)) && (errno == EINTR)) @@ -212,10 +211,6 @@ extern int run_helper_thread(int (*proc)(void *), void *arg, extern int helper_wait(int pid); -/* tls.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); diff --git a/arch/um/os-Linux/Makefile b/arch/um/os-Linux/Makefile index 015d00057663..dd764101e488 100644 --- a/arch/um/os-Linux/Makefile +++ b/arch/um/os-Linux/Makefile @@ -5,13 +5,13 @@ obj-y = aio.o execvp.o file.o helper.o irq.o main.o mem.o process.o \ registers.o sigio.o signal.o start_up.o time.o tty.o \ - umid.o tls.o user_syms.o util.o drivers/ skas/ + umid.o user_syms.o util.o drivers/ skas/ obj-$(CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA) += elf_aux.o USER_OBJS := $(user-objs-y) aio.o elf_aux.o execvp.o file.o helper.o irq.o \ main.o mem.o process.o registers.o sigio.o signal.o start_up.o time.o \ - tty.o tls.o umid.o util.o + tty.o umid.o util.o CFLAGS_user_syms.o += -DSUBARCH_$(SUBARCH) diff --git a/arch/um/os-Linux/tls.c b/arch/um/os-Linux/tls.c deleted file mode 100644 index 73277801ef14..000000000000 --- a/arch/um/os-Linux/tls.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include -#include "sysdep/tls.h" - -/* TLS support - we basically rely on the host's one.*/ - -#ifndef PTRACE_GET_THREAD_AREA -#define PTRACE_GET_THREAD_AREA 25 -#endif - -#ifndef PTRACE_SET_THREAD_AREA -#define PTRACE_SET_THREAD_AREA 26 -#endif - -int os_set_thread_area(user_desc_t *info, int pid) -{ - int ret; - - ret = ptrace(PTRACE_SET_THREAD_AREA, pid, info->entry_number, - (unsigned long) info); - if (ret < 0) - ret = -errno; - return ret; -} - -int os_get_thread_area(user_desc_t *info, int pid) -{ - int ret; - - ret = ptrace(PTRACE_GET_THREAD_AREA, pid, info->entry_number, - (unsigned long) info); - if (ret < 0) - ret = -errno; - return ret; -} 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 @@ #include #include +#include #include #include #include "sysdep/tls.h" +#ifndef PTRACE_GET_THREAD_AREA +#define PTRACE_GET_THREAD_AREA 25 +#endif + +#ifndef PTRACE_SET_THREAD_AREA +#define PTRACE_SET_THREAD_AREA 26 +#endif + /* Checks whether host supports TLS, and sets *tls_min according to the value * valid on the host. * i386 host have it == 6; x86_64 host have it == 12, for i386 emulation. */ -void check_host_supports_tls(int *supports_tls, int *tls_min) { +void check_host_supports_tls(int *supports_tls, int *tls_min) +{ /* Values for x86 and x86_64.*/ int val[] = {GDT_ENTRY_TLS_MIN_I386, GDT_ENTRY_TLS_MIN_X86_64}; int i; @@ -33,3 +43,25 @@ void check_host_supports_tls(int *supports_tls, int *tls_min) { *supports_tls = 0; } + +int os_set_thread_area(user_desc_t *info, int pid) +{ + int ret; + + ret = ptrace(PTRACE_SET_THREAD_AREA, pid, info->entry_number, + (unsigned long) info); + if (ret < 0) + ret = -errno; + return ret; +} + +int os_get_thread_area(user_desc_t *info, int pid) +{ + int ret; + + ret = ptrace(PTRACE_GET_THREAD_AREA, pid, info->entry_number, + (unsigned long) info); + if (ret < 0) + ret = -errno; + return ret; +} 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; # endif /* __KERNEL__ */ +extern int os_set_thread_area(user_desc_t *info, int pid); +extern int os_get_thread_area(user_desc_t *info, int pid); + #ifdef __i386__ #define GDT_ENTRY_TLS_MIN_I386 6 #define GDT_ENTRY_TLS_MIN_X86_64 12 -- cgit v1.2.3