From: Jeff Dike This patch moves most of the signal handlers to os-Linux, adds an arch-specific mechanism to get the address of the sigcontext structure, and implements it for i386 and x86_64. Signed-off-by: Jeff Dike Signed-off-by: Andrew Morton --- 25-akpm/arch/um/include/sysdep-i386/signal.h | 25 +++++++++++++ 25-akpm/arch/um/include/sysdep-x86_64/signal.h | 27 ++++++++++++++ 25-akpm/arch/um/kernel/trap_user.c | 22 ----------- 25-akpm/arch/um/os-Linux/Makefile | 4 +- 25-akpm/arch/um/os-Linux/signal.c | 48 +++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 24 deletions(-) diff -puN arch/um/include/sysdep-i386/signal.h~uml-separate-out-signal-reception arch/um/include/sysdep-i386/signal.h --- 25/arch/um/include/sysdep-i386/signal.h~uml-separate-out-signal-reception 2005-01-09 23:44:08.115929680 -0800 +++ 25-akpm/arch/um/include/sysdep-i386/signal.h 2005-01-09 23:44:08.124928312 -0800 @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2004 PathScale, Inc + * Licensed under the GPL + */ + +#ifndef __I386_SIGNAL_H_ +#define __I386_SIGNAL_H_ + +#include + +#define ARCH_GET_SIGCONTEXT(sc, sig) \ + do sc = (struct sigcontext *) (&sig + 1); while(0) + +#endif + +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically + * adjust the settings for this buffer only. This must remain at the end + * of the file. + * --------------------------------------------------------------------------- + * Local variables: + * c-file-style: "linux" + * End: + */ diff -puN arch/um/include/sysdep-x86_64/signal.h~uml-separate-out-signal-reception arch/um/include/sysdep-x86_64/signal.h --- 25/arch/um/include/sysdep-x86_64/signal.h~uml-separate-out-signal-reception 2005-01-09 23:44:08.116929528 -0800 +++ 25-akpm/arch/um/include/sysdep-x86_64/signal.h 2005-01-09 23:44:08.125928160 -0800 @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2004 PathScale, Inc + * Licensed under the GPL + */ + +#ifndef __X86_64_SIGNAL_H_ +#define __X86_64_SIGNAL_H_ + +#define ARCH_GET_SIGCONTEXT(sc, sig_addr) \ + do { \ + struct ucontext *__uc; \ + asm("movq %%rdx, %0" : "=r" (__uc)); \ + sc = (struct sigcontext *) &__uc->uc_mcontext; \ + } while(0) + +#endif + +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically + * adjust the settings for this buffer only. This must remain at the end + * of the file. + * --------------------------------------------------------------------------- + * Local variables: + * c-file-style: "linux" + * End: + */ diff -puN arch/um/kernel/trap_user.c~uml-separate-out-signal-reception arch/um/kernel/trap_user.c --- 25/arch/um/kernel/trap_user.c~uml-separate-out-signal-reception 2005-01-09 23:44:08.118929224 -0800 +++ 25-akpm/arch/um/kernel/trap_user.c 2005-01-09 23:44:08.125928160 -0800 @@ -102,28 +102,6 @@ struct signal_info sig_info[] = { .is_irq = 0 }, }; -void sig_handler(int sig, struct sigcontext sc) -{ - CHOOSE_MODE_PROC(sig_handler_common_tt, sig_handler_common_skas, - sig, &sc); -} - -extern int timer_irq_inited; - -void alarm_handler(int sig, struct sigcontext sc) -{ - if(!timer_irq_inited) return; - - if(sig == SIGALRM) - switch_timers(0); - - CHOOSE_MODE_PROC(sig_handler_common_tt, sig_handler_common_skas, - sig, &sc); - - if(sig == SIGALRM) - switch_timers(1); -} - void do_longjmp(void *b, int val) { sigjmp_buf *buf = b; diff -puN arch/um/os-Linux/Makefile~uml-separate-out-signal-reception arch/um/os-Linux/Makefile --- 25/arch/um/os-Linux/Makefile~uml-separate-out-signal-reception 2005-01-09 23:44:08.119929072 -0800 +++ 25-akpm/arch/um/os-Linux/Makefile 2005-01-09 23:44:08.126928008 -0800 @@ -3,10 +3,10 @@ # Licensed under the GPL # -obj-y = elf_aux.o file.o process.o time.o tty.o user_syms.o drivers/ \ +obj-y = elf_aux.o file.o process.o signal.o time.o tty.o user_syms.o drivers/ \ sys-$(SUBARCH)/ -USER_OBJS := elf_aux.o file.o process.o time.o tty.o +USER_OBJS := elf_aux.o file.o process.o signal.o time.o tty.o USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) $(USER_OBJS) : %.o: %.c diff -puN arch/um/os-Linux/signal.c~uml-separate-out-signal-reception arch/um/os-Linux/signal.c --- 25/arch/um/os-Linux/signal.c~uml-separate-out-signal-reception 2005-01-09 23:44:08.121928768 -0800 +++ 25-akpm/arch/um/os-Linux/signal.c 2005-01-09 23:44:08.126928008 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2004 PathScale, Inc + * Licensed under the GPL + */ + +#include +#include "time_user.h" +#include "mode.h" +#include "sysdep/signal.h" + +void sig_handler(int sig) +{ + struct sigcontext *sc; + + ARCH_GET_SIGCONTEXT(sc, sig); + CHOOSE_MODE_PROC(sig_handler_common_tt, sig_handler_common_skas, + sig, sc); +} + +extern int timer_irq_inited; + +void alarm_handler(int sig) +{ + struct sigcontext *sc; + + ARCH_GET_SIGCONTEXT(sc, sig); + if(!timer_irq_inited) return; + + if(sig == SIGALRM) + switch_timers(0); + + CHOOSE_MODE_PROC(sig_handler_common_tt, sig_handler_common_skas, + sig, sc); + + if(sig == SIGALRM) + switch_timers(1); +} + +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically + * adjust the settings for this buffer only. This must remain at the end + * of the file. + * --------------------------------------------------------------------------- + * Local variables: + * c-file-style: "linux" + * End: + */ _