From 05c46db4d7d51af969e09f9f1adbff66ee2e84b4 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 18 Aug 2011 20:04:59 +0100 Subject: um: take userland definition of barrier() to user.h Signed-off-by: Al Viro Signed-off-by: Richard Weinberger --- arch/um/include/shared/process.h | 3 --- 1 file changed, 3 deletions(-) (limited to 'arch/um/include/shared/process.h') diff --git a/arch/um/include/shared/process.h b/arch/um/include/shared/process.h index bb873a51262..28215300fc6 100644 --- a/arch/um/include/shared/process.h +++ b/arch/um/include/shared/process.h @@ -8,9 +8,6 @@ #include -/* Copied from linux/compiler-gcc.h since we can't include it directly */ -#define barrier() __asm__ __volatile__("": : :"memory") - extern void sig_handler(int sig, struct sigcontext *sc); extern void alarm_handler(int sig, struct sigcontext *sc); -- cgit v1.2.3-70-g09d2 From 248b74c79ebb9fb55e146797a808836d90418c4b Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 18 Aug 2011 20:05:09 +0100 Subject: um: start switching the references to host mcontext_t to its userland type Signed-off-by: Al Viro Signed-off-by: Richard Weinberger --- arch/um/include/shared/process.h | 5 ---- arch/um/os-Linux/internal.h | 1 + arch/um/os-Linux/signal.c | 35 ++++++++++++--------------- arch/um/os-Linux/time.c | 2 +- arch/um/sys-x86/shared/sysdep/sigcontext_32.h | 7 ++++++ arch/um/sys-x86/shared/sysdep/sigcontext_64.h | 7 ++++++ arch/um/sys-x86/stub_segv.c | 2 +- 7 files changed, 33 insertions(+), 26 deletions(-) create mode 100644 arch/um/os-Linux/internal.h (limited to 'arch/um/include/shared/process.h') diff --git a/arch/um/include/shared/process.h b/arch/um/include/shared/process.h index 28215300fc6..2ba310e1b65 100644 --- a/arch/um/include/shared/process.h +++ b/arch/um/include/shared/process.h @@ -6,9 +6,4 @@ #ifndef __PROCESS_H__ #define __PROCESS_H__ -#include - -extern void sig_handler(int sig, struct sigcontext *sc); -extern void alarm_handler(int sig, struct sigcontext *sc); - #endif diff --git a/arch/um/os-Linux/internal.h b/arch/um/os-Linux/internal.h new file mode 100644 index 00000000000..2c3c3ecd8c0 --- /dev/null +++ b/arch/um/os-Linux/internal.h @@ -0,0 +1 @@ +void alarm_handler(int, mcontext_t *); diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 08d30617699..07d9905e44e 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c @@ -26,7 +26,7 @@ void (*sig_info[NSIG])(int, struct uml_pt_regs *) = { [SIGIO] = sigio_handler, [SIGVTALRM] = timer_handler }; -static void sig_handler_common(int sig, struct sigcontext *sc) +static void sig_handler_common(int sig, mcontext_t *mc) { struct uml_pt_regs r; int save_errno = errno; @@ -34,8 +34,8 @@ static void sig_handler_common(int sig, struct sigcontext *sc) r.is_user = 0; if (sig == SIGSEGV) { /* For segfaults, we want the data from the sigcontext. */ - copy_sc(&r, sc); - GET_FAULTINFO_FROM_SC(r.faultinfo, sc); + copy_sc(&r, (struct sigcontext *)mc); + GET_FAULTINFO_FROM_MC(r.faultinfo, mc); } /* enable signals if sig isn't IRQ signal */ @@ -62,7 +62,7 @@ static void sig_handler_common(int sig, struct sigcontext *sc) static int signals_enabled; static unsigned int signals_pending; -void sig_handler(int sig, struct sigcontext *sc) +void sig_handler(int sig, mcontext_t *mc) { int enabled; @@ -74,23 +74,23 @@ void sig_handler(int sig, struct sigcontext *sc) block_signals(); - sig_handler_common(sig, sc); + sig_handler_common(sig, mc); set_signals(enabled); } -static void real_alarm_handler(struct sigcontext *sc) +static void real_alarm_handler(mcontext_t *mc) { struct uml_pt_regs regs; - if (sc != NULL) - copy_sc(®s, sc); + if (mc != NULL) + copy_sc(®s, (struct sigcontext *)mc); regs.is_user = 0; unblock_signals(); timer_handler(SIGVTALRM, ®s); } -void alarm_handler(int sig, struct sigcontext *sc) +void alarm_handler(int sig, mcontext_t *mc) { int enabled; @@ -102,7 +102,7 @@ void alarm_handler(int sig, struct sigcontext *sc) block_signals(); - real_alarm_handler(sc); + real_alarm_handler(mc); set_signals(enabled); } @@ -121,7 +121,7 @@ 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, mcontext_t *mc) = { [SIGSEGV] = sig_handler, [SIGBUS] = sig_handler, [SIGILL] = sig_handler, @@ -133,8 +133,11 @@ static void (*handlers[_NSIG])(int sig, struct sigcontext *sc) = { [SIGVTALRM] = alarm_handler }; -static void handle_signal(int sig, struct sigcontext *sc) + +static void hard_handler(int sig, siginfo_t *info, void *p) { + struct ucontext *uc = p; + mcontext_t *mc = &uc->uc_mcontext; unsigned long pending = 1UL << sig; do { @@ -160,7 +163,7 @@ static void handle_signal(int sig, struct sigcontext *sc) while ((sig = ffs(pending)) != 0){ sig--; pending &= ~(1 << sig); - (*handlers[sig])(sig, sc); + (*handlers[sig])(sig, mc); } /* @@ -174,12 +177,6 @@ static void handle_signal(int sig, struct sigcontext *sc) } while (pending); } -static void hard_handler(int sig, siginfo_t *info, void *p) -{ - struct ucontext *uc = p; - handle_signal(sig, (struct sigcontext *) &uc->uc_mcontext); -} - void set_handler(int sig) { struct sigaction action; diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c index 995ca304f1c..910499d76a6 100644 --- a/arch/um/os-Linux/time.c +++ b/arch/um/os-Linux/time.c @@ -10,7 +10,7 @@ #include #include "kern_util.h" #include "os.h" -#include "process.h" +#include "internal.h" int set_interval(void) { diff --git a/arch/um/sys-x86/shared/sysdep/sigcontext_32.h b/arch/um/sys-x86/shared/sysdep/sigcontext_32.h index aebc2dd61f0..548c3cdb743 100644 --- a/arch/um/sys-x86/shared/sysdep/sigcontext_32.h +++ b/arch/um/sys-x86/shared/sysdep/sigcontext_32.h @@ -22,4 +22,11 @@ (fi).trap_no = SC_TRAPNO(sc); \ } +#define GET_FAULTINFO_FROM_MC(fi, mc) \ + { \ + (fi).cr2 = (mc)->cr2; \ + (fi).error_code = (mc)->gregs[REG_ERR]; \ + (fi).trap_no = (mc)->gregs[REG_TRAPNO]; \ + } + #endif diff --git a/arch/um/sys-x86/shared/sysdep/sigcontext_64.h b/arch/um/sys-x86/shared/sysdep/sigcontext_64.h index 60d89a2fba0..5c4a6a35914 100644 --- a/arch/um/sys-x86/shared/sysdep/sigcontext_64.h +++ b/arch/um/sys-x86/shared/sysdep/sigcontext_64.h @@ -22,4 +22,11 @@ (fi).trap_no = SC_TRAPNO(sc); \ } +#define GET_FAULTINFO_FROM_MC(fi, mc) \ + { \ + (fi).cr2 = (mc)->gregs[REG_CR2]; \ + (fi).error_code = (mc)->gregs[REG_ERR]; \ + (fi).trap_no = (mc)->gregs[REG_TRAPNO]; \ + } + #endif diff --git a/arch/um/sys-x86/stub_segv.c b/arch/um/sys-x86/stub_segv.c index f62771cf236..bd2eaf69103 100644 --- a/arch/um/sys-x86/stub_segv.c +++ b/arch/um/sys-x86/stub_segv.c @@ -12,7 +12,7 @@ stub_segv_handler(int sig, siginfo_t *info, void *p) { struct ucontext *uc = p; - GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA), + GET_FAULTINFO_FROM_MC(*((struct faultinfo *) STUB_DATA), &uc->uc_mcontext); trap_myself(); } -- cgit v1.2.3-70-g09d2 From 0de021f797e7bd785796071aab8e14827c87d6bf Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 18 Aug 2011 20:05:29 +0100 Subject: um: shared/process.h is empty now; kill it Signed-off-by: Al Viro Signed-off-by: Richard Weinberger --- arch/um/include/shared/process.h | 9 --------- arch/um/os-Linux/irq.c | 1 - arch/um/os-Linux/process.c | 1 - arch/um/os-Linux/sigio.c | 1 - arch/um/os-Linux/signal.c | 1 - arch/um/os-Linux/skas/process.c | 1 - 6 files changed, 14 deletions(-) delete mode 100644 arch/um/include/shared/process.h (limited to 'arch/um/include/shared/process.h') diff --git a/arch/um/include/shared/process.h b/arch/um/include/shared/process.h deleted file mode 100644 index 2ba310e1b65..00000000000 --- a/arch/um/include/shared/process.h +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (C) 2000 - 2008 Jeff Dike (jdike@{addtoit,linux.intel}.com) - * Licensed under the GPL - */ - -#ifndef __PROCESS_H__ -#define __PROCESS_H__ - -#endif diff --git a/arch/um/os-Linux/irq.c b/arch/um/os-Linux/irq.c index 59c592cca25..9a49908b576 100644 --- a/arch/um/os-Linux/irq.c +++ b/arch/um/os-Linux/irq.c @@ -10,7 +10,6 @@ #include #include "irq_user.h" #include "os.h" -#include "process.h" #include "um_malloc.h" /* diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index e08fe305beb..307f173e7f8 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c @@ -15,7 +15,6 @@ #include "init.h" #include "longjmp.h" #include "os.h" -#include "process.h" #include "skas_ptrace.h" #define ARBITRARY_ADDR -1 diff --git a/arch/um/os-Linux/sigio.c b/arch/um/os-Linux/sigio.c index 34bb59bfa00..3c161218c67 100644 --- a/arch/um/os-Linux/sigio.c +++ b/arch/um/os-Linux/sigio.c @@ -14,7 +14,6 @@ #include "kern_util.h" #include "init.h" #include "os.h" -#include "process.h" #include "sigio.h" #include "um_malloc.h" diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 9f2c2228f7a..4d31688b22b 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c @@ -12,7 +12,6 @@ #include "as-layout.h" #include "kern_util.h" #include "os.h" -#include "process.h" #include "sysdep/barrier.h" #include "sysdep/mcontext.h" diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index f4e02ad72e1..30f1bb43a23 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -17,7 +17,6 @@ #include "kern_util.h" #include "mem.h" #include "os.h" -#include "process.h" #include "proc_mm.h" #include "ptrace_user.h" #include "registers.h" -- cgit v1.2.3-70-g09d2