OpenBSD-4.6/lib/libpthread/arch/i386/uthread_machdep_asm.S

/*	$OpenBSD: uthread_machdep_asm.S,v 1.1 2000/09/25 01:16:40 d Exp $	*/
/* David Leonard, <d@csee.uq.edu.au>. Public domain. */

#include <machine/asm.h>

/*
 * Switch stacks
 */

/* void _thread_machdep_switch(new, oldsave); */
ENTRY(_thread_machdep_switch)
	pushal		/* pushl %eax,%ecx,%edx,%ebx,%esp,%ebp,%esi,%edi */
	pushl	%ds
	pushl	%es
	pushl	%fs
	pushl	%gs
#define DISTANCE	((8+1+1+1+1)*4)
	movl	(DISTANCE+8)(%esp), %eax	/* %eax = arg2  */
	movl	%esp, 0(%eax)			/* *arg2 = %esp */
	movl	(DISTANCE+4)(%esp), %eax	/* %eax = arg1  */
	movl	0(%eax), %esp			/* %esp = *arg1 */
	popl	%gs
	popl	%fs
	popl	%es
	popl	%ds
	popal		/* popl %edi,%esi,%ebp,%esp,%ebx,%edx,%ecx,%eax */
	ret