xref: /openbmc/linux/arch/x86/um/setjmp_32.S (revision 5c48b108)
15c48b108SAl Viro#
25c48b108SAl Viro# arch/i386/setjmp.S
35c48b108SAl Viro#
45c48b108SAl Viro# setjmp/longjmp for the i386 architecture
55c48b108SAl Viro#
65c48b108SAl Viro
75c48b108SAl Viro#
85c48b108SAl Viro# The jmp_buf is assumed to contain the following, in order:
95c48b108SAl Viro#	%ebx
105c48b108SAl Viro#	%esp
115c48b108SAl Viro#	%ebp
125c48b108SAl Viro#	%esi
135c48b108SAl Viro#	%edi
145c48b108SAl Viro#	<return address>
155c48b108SAl Viro#
165c48b108SAl Viro
175c48b108SAl Viro	.text
185c48b108SAl Viro	.align 4
195c48b108SAl Viro	.globl setjmp
205c48b108SAl Viro	.type setjmp, @function
215c48b108SAl Virosetjmp:
225c48b108SAl Viro#ifdef _REGPARM
235c48b108SAl Viro	movl %eax,%edx
245c48b108SAl Viro#else
255c48b108SAl Viro	movl 4(%esp),%edx
265c48b108SAl Viro#endif
275c48b108SAl Viro	popl %ecx			# Return address, and adjust the stack
285c48b108SAl Viro	xorl %eax,%eax			# Return value
295c48b108SAl Viro	movl %ebx,(%edx)
305c48b108SAl Viro	movl %esp,4(%edx)		# Post-return %esp!
315c48b108SAl Viro	pushl %ecx			# Make the call/return stack happy
325c48b108SAl Viro	movl %ebp,8(%edx)
335c48b108SAl Viro	movl %esi,12(%edx)
345c48b108SAl Viro	movl %edi,16(%edx)
355c48b108SAl Viro	movl %ecx,20(%edx)		# Return address
365c48b108SAl Viro	ret
375c48b108SAl Viro
385c48b108SAl Viro	.size setjmp,.-setjmp
395c48b108SAl Viro
405c48b108SAl Viro	.text
415c48b108SAl Viro	.align 4
425c48b108SAl Viro	.globl longjmp
435c48b108SAl Viro	.type longjmp, @function
445c48b108SAl Virolongjmp:
455c48b108SAl Viro#ifdef _REGPARM
465c48b108SAl Viro	xchgl %eax,%edx
475c48b108SAl Viro#else
485c48b108SAl Viro	movl 4(%esp),%edx		# jmp_ptr address
495c48b108SAl Viro	movl 8(%esp),%eax		# Return value
505c48b108SAl Viro#endif
515c48b108SAl Viro	movl (%edx),%ebx
525c48b108SAl Viro	movl 4(%edx),%esp
535c48b108SAl Viro	movl 8(%edx),%ebp
545c48b108SAl Viro	movl 12(%edx),%esi
555c48b108SAl Viro	movl 16(%edx),%edi
565c48b108SAl Viro	jmp *20(%edx)
575c48b108SAl Viro
585c48b108SAl Viro	.size longjmp,.-longjmp
59