Commit 29a5de15 authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds

[PATCH] UML: Separate out signal reception

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: default avatarJeff Dike <jdike@addtoit.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 104d88df
/*
* Copyright (C) 2004 PathScale, Inc
* Licensed under the GPL
*/
#ifndef __I386_SIGNAL_H_
#define __I386_SIGNAL_H_
#include <signal.h>
#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:
*/
/*
* 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:
*/
......@@ -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;
......
......@@ -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
......
/*
* Copyright (C) 2004 PathScale, Inc
* Licensed under the GPL
*/
#include <signal.h>
#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:
*/
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment