[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>
This commit is contained in:

committed by
Linus Torvalds

parent
c5c6ba4e08
commit
13c06be399
58
arch/um/sys-i386/setjmp.S
Normal file
58
arch/um/sys-i386/setjmp.S
Normal file
@@ -0,0 +1,58 @@
|
||||
#
|
||||
# arch/i386/setjmp.S
|
||||
#
|
||||
# setjmp/longjmp for the i386 architecture
|
||||
#
|
||||
|
||||
#
|
||||
# The jmp_buf is assumed to contain the following, in order:
|
||||
# %ebx
|
||||
# %esp
|
||||
# %ebp
|
||||
# %esi
|
||||
# %edi
|
||||
# <return address>
|
||||
#
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.globl setjmp
|
||||
.type setjmp, @function
|
||||
setjmp:
|
||||
#ifdef _REGPARM
|
||||
movl %eax,%edx
|
||||
#else
|
||||
movl 4(%esp),%edx
|
||||
#endif
|
||||
popl %ecx # Return address, and adjust the stack
|
||||
xorl %eax,%eax # Return value
|
||||
movl %ebx,(%edx)
|
||||
movl %esp,4(%edx) # Post-return %esp!
|
||||
pushl %ecx # Make the call/return stack happy
|
||||
movl %ebp,8(%edx)
|
||||
movl %esi,12(%edx)
|
||||
movl %edi,16(%edx)
|
||||
movl %ecx,20(%edx) # Return address
|
||||
ret
|
||||
|
||||
.size setjmp,.-setjmp
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.globl longjmp
|
||||
.type longjmp, @function
|
||||
longjmp:
|
||||
#ifdef _REGPARM
|
||||
xchgl %eax,%edx
|
||||
#else
|
||||
movl 4(%esp),%edx # jmp_ptr address
|
||||
movl 8(%esp),%eax # Return value
|
||||
#endif
|
||||
movl (%edx),%ebx
|
||||
movl 4(%edx),%esp
|
||||
movl 8(%edx),%ebp
|
||||
movl 12(%edx),%esi
|
||||
movl 16(%edx),%edi
|
||||
jmp *20(%edx)
|
||||
|
||||
.size longjmp,.-longjmp
|
Reference in New Issue
Block a user