mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 12:39:23 +00:00 
			
		
		
		
	 13c06be399
			
		
	
	
		13c06be399
		
	
	
	
	
		
			
			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>
		
			
				
	
	
		
			59 lines
		
	
	
		
			963 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			963 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #
 | |
| # 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
 |