[PATCH] uml: move libc-dependent startup and signal code
The serial UML OS-abstraction layer patch (um/kernel dir). This moves all systemcalls from process.c file under os-Linux dir and join process.c and process_kern.c files. Signed-off-by: Gennady Sharapov <gennady.v.sharapov@intel.com> Signed-off-by: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
09ace81c1d
commit
60d339f6fe
@@ -3,10 +3,10 @@
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <setjmp.h>
|
||||
#include <linux/unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/wait.h>
|
||||
@@ -14,6 +14,10 @@
|
||||
#include "os.h"
|
||||
#include "user.h"
|
||||
#include "user_util.h"
|
||||
#include "signal_user.h"
|
||||
#include "process.h"
|
||||
#include "irq_user.h"
|
||||
#include "kern_util.h"
|
||||
|
||||
#define ARBITRARY_ADDR -1
|
||||
#define FAILURE_PID -1
|
||||
@@ -114,8 +118,10 @@ void os_usr1_process(int pid)
|
||||
kill(pid, SIGUSR1);
|
||||
}
|
||||
|
||||
/*Don't use the glibc version, which caches the result in TLS. It misses some
|
||||
* syscalls, and also breaks with clone(), which does not unshare the TLS.*/
|
||||
/* Don't use the glibc version, which caches the result in TLS. It misses some
|
||||
* syscalls, and also breaks with clone(), which does not unshare the TLS.
|
||||
*/
|
||||
|
||||
inline _syscall0(pid_t, getpid)
|
||||
|
||||
int os_getpid(void)
|
||||
@@ -164,6 +170,52 @@ int os_unmap_memory(void *addr, int len)
|
||||
return(0);
|
||||
}
|
||||
|
||||
void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int))
|
||||
{
|
||||
int flags = 0, pages;
|
||||
|
||||
if(sig_stack != NULL){
|
||||
pages = (1 << UML_CONFIG_KERNEL_STACK_ORDER);
|
||||
set_sigstack(sig_stack, pages * page_size());
|
||||
flags = SA_ONSTACK;
|
||||
}
|
||||
if(usr1_handler) set_handler(SIGUSR1, usr1_handler, flags, -1);
|
||||
}
|
||||
|
||||
void init_new_thread_signals(int altstack)
|
||||
{
|
||||
int flags = altstack ? SA_ONSTACK : 0;
|
||||
|
||||
set_handler(SIGSEGV, (__sighandler_t) sig_handler, flags,
|
||||
SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
|
||||
set_handler(SIGTRAP, (__sighandler_t) sig_handler, flags,
|
||||
SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
|
||||
set_handler(SIGFPE, (__sighandler_t) sig_handler, flags,
|
||||
SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
|
||||
set_handler(SIGILL, (__sighandler_t) sig_handler, flags,
|
||||
SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
|
||||
set_handler(SIGBUS, (__sighandler_t) sig_handler, flags,
|
||||
SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
|
||||
set_handler(SIGUSR2, (__sighandler_t) sig_handler,
|
||||
flags, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
|
||||
signal(SIGHUP, SIG_IGN);
|
||||
|
||||
init_irq_signals(altstack);
|
||||
}
|
||||
|
||||
int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr)
|
||||
{
|
||||
sigjmp_buf buf;
|
||||
int n;
|
||||
|
||||
*jmp_ptr = &buf;
|
||||
n = sigsetjmp(buf, 1);
|
||||
if(n != 0)
|
||||
return(n);
|
||||
(*fn)(arg);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
|
Reference in New Issue
Block a user