diff options
| author | Jeff Dike <jdike@addtoit.com> | 2006-09-25 23:32:59 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-26 08:49:05 -0700 | 
| commit | 13c06be399902c9ebda08e092edb1614bb4a3761 (patch) | |
| tree | c67134cfb7efd23ab7017fde32657fa3a7e58154 /arch/um/os-Linux | |
| parent | c5c6ba4e08ab9c9e390a0f3a7d9a5c332f5cc6ef (diff) | |
| download | olio-linux-3.10-13c06be399902c9ebda08e092edb1614bb4a3761.tar.xz olio-linux-3.10-13c06be399902c9ebda08e092edb1614bb4a3761.zip  | |
[PATCH] uml: Use klibc setjmp/longjmp
This patch adds an implementation of setjmp and longjmp to UML, allowing
access to the inside of a jmpbuf without needing the access macros formerly
provided by libc.
The implementation is stolen from klibc.  I copy the relevant files into
arch/um.  I have another patch which avoids the copying, but requires klibc be
in the tree.
setjmp and longjmp users required some tweaking.  Includes of <setjmp.h> were
removed and includes of the UML longjmp.h were added where necessary.  There
are also replacements of siglongjmp with UML_LONGJMP which I somehow missed
earlier.
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/um/os-Linux')
| -rw-r--r-- | arch/um/os-Linux/process.c | 1 | ||||
| -rw-r--r-- | arch/um/os-Linux/skas/process.c | 3 | ||||
| -rw-r--r-- | arch/um/os-Linux/sys-i386/registers.c | 10 | ||||
| -rw-r--r-- | arch/um/os-Linux/sys-x86_64/registers.c | 10 | ||||
| -rw-r--r-- | arch/um/os-Linux/trap.c | 1 | ||||
| -rw-r--r-- | arch/um/os-Linux/uaccess.c | 3 | ||||
| -rw-r--r-- | arch/um/os-Linux/util.c | 5 | 
7 files changed, 14 insertions, 19 deletions
diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index b98d3ca2cd1..3afde92ad2c 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c @@ -7,7 +7,6 @@  #include <stdio.h>  #include <errno.h>  #include <signal.h> -#include <setjmp.h>  #include <linux/unistd.h>  #include <sys/mman.h>  #include <sys/wait.h> diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index 7baf90fda58..50418a5e713 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -8,7 +8,6 @@  #include <unistd.h>  #include <errno.h>  #include <signal.h> -#include <setjmp.h>  #include <sched.h>  #include "ptrace_user.h"  #include <sys/wait.h> @@ -470,7 +469,7 @@ void thread_wait(void *sw, void *fb)  	*switch_buf = &buf;  	fork_buf = fb;  	if(UML_SETJMP(&buf) == 0) -		siglongjmp(*fork_buf, INIT_JMP_REMOVE_SIGSTACK); +		UML_LONGJMP(fork_buf, INIT_JMP_REMOVE_SIGSTACK);  }  void switch_threads(void *me, void *next) diff --git a/arch/um/os-Linux/sys-i386/registers.c b/arch/um/os-Linux/sys-i386/registers.c index 516f66dd87e..1f90a2d7138 100644 --- a/arch/um/os-Linux/sys-i386/registers.c +++ b/arch/um/os-Linux/sys-i386/registers.c @@ -5,12 +5,12 @@  #include <errno.h>  #include <string.h> -#include <setjmp.h>  #include "sysdep/ptrace_user.h"  #include "sysdep/ptrace.h"  #include "uml-config.h"  #include "skas_ptregs.h"  #include "registers.h" +#include "longjmp.h"  #include "user.h"  /* These are set once at boot time and not changed thereafter */ @@ -132,9 +132,9 @@ void get_safe_registers(unsigned long *regs, unsigned long *fp_regs)  void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer)  { -	struct __jmp_buf_tag *jmpbuf = buffer; +	struct __jmp_buf *jmpbuf = buffer; -	UPT_SET(uml_regs, EIP, jmpbuf->__jmpbuf[JB_PC]); -	UPT_SET(uml_regs, UESP, jmpbuf->__jmpbuf[JB_SP]); -	UPT_SET(uml_regs, EBP, jmpbuf->__jmpbuf[JB_BP]); +	UPT_SET(uml_regs, EIP, jmpbuf->__eip); +	UPT_SET(uml_regs, UESP, jmpbuf->__esp); +	UPT_SET(uml_regs, EBP, jmpbuf->__ebp);  } diff --git a/arch/um/os-Linux/sys-x86_64/registers.c b/arch/um/os-Linux/sys-x86_64/registers.c index becd898d939..e730447d6c0 100644 --- a/arch/um/os-Linux/sys-x86_64/registers.c +++ b/arch/um/os-Linux/sys-x86_64/registers.c @@ -5,11 +5,11 @@  #include <errno.h>  #include <string.h> -#include <setjmp.h>  #include "ptrace_user.h"  #include "uml-config.h"  #include "skas_ptregs.h"  #include "registers.h" +#include "longjmp.h"  #include "user.h"  /* These are set once at boot time and not changed thereafter */ @@ -80,9 +80,9 @@ void get_safe_registers(unsigned long *regs, unsigned long *fp_regs)  void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer)  { -	struct __jmp_buf_tag *jmpbuf = buffer; +	struct __jmp_buf *jmpbuf = buffer; -	UPT_SET(uml_regs, RIP, jmpbuf->__jmpbuf[JB_PC]); -	UPT_SET(uml_regs, RSP, jmpbuf->__jmpbuf[JB_RSP]); -	UPT_SET(uml_regs, RBP, jmpbuf->__jmpbuf[JB_RBP]); +	UPT_SET(uml_regs, RIP, jmpbuf->__rip); +	UPT_SET(uml_regs, RSP, jmpbuf->__rsp); +	UPT_SET(uml_regs, RBP, jmpbuf->__rbp);  } diff --git a/arch/um/os-Linux/trap.c b/arch/um/os-Linux/trap.c index 90b29ae9af4..1df231a2624 100644 --- a/arch/um/os-Linux/trap.c +++ b/arch/um/os-Linux/trap.c @@ -5,7 +5,6 @@  #include <stdlib.h>  #include <signal.h> -#include <setjmp.h>  #include "kern_util.h"  #include "user_util.h"  #include "os.h" diff --git a/arch/um/os-Linux/uaccess.c b/arch/um/os-Linux/uaccess.c index 865f6a6a259..bbb73a65037 100644 --- a/arch/um/os-Linux/uaccess.c +++ b/arch/um/os-Linux/uaccess.c @@ -4,8 +4,7 @@   * Licensed under the GPL   */ -#include <setjmp.h> -#include <string.h> +#include <stddef.h>  #include "longjmp.h"  unsigned long __do_user_copy(void *to, const void *from, int n, diff --git a/arch/um/os-Linux/util.c b/arch/um/os-Linux/util.c index c47a2a7ce70..3f5b1514e8a 100644 --- a/arch/um/os-Linux/util.c +++ b/arch/um/os-Linux/util.c @@ -7,7 +7,6 @@  #include <stdlib.h>  #include <unistd.h>  #include <limits.h> -#include <setjmp.h>  #include <sys/mman.h>  #include <sys/stat.h>  #include <sys/utsname.h> @@ -107,11 +106,11 @@ int setjmp_wrapper(void (*proc)(void *, void *), ...)  	jmp_buf buf;  	int n; -	n = sigsetjmp(buf, 1); +	n = UML_SETJMP(&buf);  	if(n == 0){  		va_start(args, proc);  		(*proc)(&buf, &args);  	}  	va_end(args); -	return(n); +	return n;  }  |