/*
 * Copyright  Robert J. Amstadt, 1993
 */
#ifdef linux
#define UDATASEL 0x2b
#endif
#if defined(__NetBSD__) || defined(__FreeBSD__)
#define UDATASEL 0x27
#endif
	.data
jump_target:
return_value:
	.long	0

/**********************************************************************
 *	Places to keep info about the current 32-bit stack frame.
 */
	.globl	_IF1632_Saved32_esp,_IF1632_Saved32_ebp,_IF1632_Saved32_ss
_IF1632_Saved32_esp:
	.long	0
_IF1632_Saved32_ebp:
	.long	0
_IF1632_Saved32_ss:
	.word	0

/**********************************************************************
 *	Places to keep info about the current 16-bit stack frame.
 */
	.globl	_IF1632_Saved16_esp,_IF1632_Saved16_ebp,_IF1632_Saved16_ss
_IF1632_Saved16_esp:
	.long	0
_IF1632_Saved16_ebp:
	.long	0
_IF1632_Saved16_ss:
	.word	0

nbytes:
	.word	0
selector:
	.word	0
offset:
	.word	0

	.text

/**********************************************************************
 *	int CallToInit16(unsigned long csip, unsigned long sssp,
 *		     unsigned short ds)
 *
 *	Stack:	 	0	ebp
 *		 	4	eip
 *		 	8	target ip
 *			10	target cs
 *			12	target sp
 *			14	target ss
 *			16	target ds
 */
	.align	4
	.globl _CallToInit16
_CallToInit16:
	pushl	%ebp
	movl	%esp,%ebp

	/*
 	 * Save our registers
	 */
	pushal
	pushl	_IF1632_Saved32_esp
	pushl	_IF1632_Saved32_ebp
	pushw	_IF1632_Saved32_ss

	/*
	 * Get target address.
	 */
	movl	8(%ebp),%eax
	movl	%eax,jump_target
	lea	jump_target,%edx

	/*
	 * Put stack registers where we can get them after stack switch.
	 */
	movw	%ss,_IF1632_Saved32_ss
	movl	%esp,_IF1632_Saved32_esp
	movl	%ebp,_IF1632_Saved32_ebp

	/*
	 * Load initial registers
	 */
	movw	_WIN_StackSize,%bx
	movw	_WIN_HeapSize,%cx
	movl	$0,%esi
	xorl	%eax,%eax
	movw	_PSPSelector,%ax
	movw	%ax,%es
	movw	16(%ebp),%ax
	movw	%ax,%ds
	movl	%eax,%edi
	xorl	%eax,%eax
	movw	12(%ebp),%ax
	movl	%eax,%esp
	movw	14(%ebp),%ax
	movw	%ax,%ss
	movl	%esp,%eax
	movl	%eax,%ebp
	movw	$UDATASEL,%ax
	movw	%ax,%fs
	movw	%ax,%gs
	movw	%ds,%ax

	/*
	 * Call entry point
	 */
	.byte	0x66
	lcall	%fs:(%edx)

	/*
	 * Restore old stack and segment registers.
	 *
	 * Two choices here:
	 *	1. Trust that fs or gs hasn't changed.
	 *	2. Rely on knowledge of Linux use of segments.
	 *
	 * I'll opt for choice 2 because who knows what programs we
	 * going to run.  Linux should be fairly stable in terms of
	 * GDT usage.
	 */
	pushl	%eax
	movw	$UDATASEL,%ax
	movw	%ax,%ds
	movw	%ax,%es
	movw	%ax,%fs
	movw	%ax,%gs
	popl	%eax
	movw	_IF1632_Saved32_ss,%ss
	movl	_IF1632_Saved32_esp,%esp
	movl	_IF1632_Saved32_ebp,%ebp

	/*
 	 * Restore registers, but do not destroy return value.
	 */
	popw	_IF1632_Saved32_ss
	popl	_IF1632_Saved32_ebp
	popl	_IF1632_Saved32_esp
	movl	%eax,return_value
	popal
	movl	return_value,%eax
	.align	2,0x90
	leave
	ret

/**********************************************************************
 *	int CallTo16(unsigned long csip, unsigned short ds)
 *
 *	Stack:	 	0	ebp
 *		 	4	eip
 *		 	8	target ip
 *			10	target cs
 *			12	target ds
 */
	.align	4
	.globl _CallTo16
_CallTo16:
	pushl	%ebp
	movl	%esp,%ebp

	/*
	 * Get target address and new ds
	 */
	movl	8(%ebp),%eax
	movl	%eax,jump_target
	lea	jump_target,%edx
	movw	12(%ebp),%ax

	/*
	 * Switch to 16-bit stack
	 */
	pushl	_IF1632_Saved32_esp
	pushl	_IF1632_Saved32_ebp
	pushw	_IF1632_Saved32_ss

	movw	%ss,_IF1632_Saved32_ss
	movl	%esp,_IF1632_Saved32_esp
	movl	%ebp,_IF1632_Saved32_ebp

	movw	_IF1632_Saved16_ss,%ss
	movl	_IF1632_Saved16_esp,%esp
	movl	_IF1632_Saved16_ebp,%ebp

	/*
	 * Call entry point
	 */
	movw	%ax,%ds
	.byte	0x66
	lcall	%fs:(%edx)

	/*
	 * Restore old stack and segment registers.
	 *
	 * Two choices here:
	 *	1. Trust that fs or gs hasn't changed.
	 *	2. Rely on knowledge of Linux use of segments.
	 *
	 * I'll opt for choice 2 because who knows what programs we
	 * going to run.  Linux should be fairly stable in terms of
	 * GDT usage.
	 */
	pushl	%eax
	movw	$UDATASEL,%ax
	movw	%ax,%ds
	movw	%ax,%es
	movw	%ax,%fs
	movw	%ax,%gs
	popl	%eax

	movw	%ss,_IF1632_Saved16_ss
	movl	%esp,_IF1632_Saved16_esp
	movl	%ebp,_IF1632_Saved16_ebp

	movw	_IF1632_Saved32_ss,%ss
	movl	_IF1632_Saved32_esp,%esp
	movl	_IF1632_Saved32_ebp,%ebp

	popw	_IF1632_Saved32_ss
	popl	_IF1632_Saved32_ebp
	popl	_IF1632_Saved32_esp

	movl	%eax,return_value
	movw	return_value+2,%dx
	.align	2,0x90
	leave
	ret

/**********************************************************************
 *	CallTo32()
 *
 *	This function is called as a relay point to the built function
 *	handler.  KERNEL, USER and GDI calls are dealt with by this
 *	handler.  Calls to these DLLs will be mapped to a call handler
 *	which will set EAX to a number indicating which DLL and which
 *	function within that DLL.
 *
 *	This function will pass to the function handler two arguments.
 *	The first argument will be the contents of EAX, the second
 *	argument will be a segment:offset pair that points to the
 *	16-bit stack.
 */
	.align	4
	.globl _CallTo32
_CallTo32:
	pushl	%ebp
	movl	%esp,%ebp

	/*
 	 * Save registers.  286 mode does not have fs or gs.
	 */
	pushw	%ds
	pushw	%es

	/*
	 * Restore segment registers.
	 */
	pushl	%eax
	movw	$UDATASEL,%ax
	movw	%ax,%ds
	movw	%ax,%es
	popl	%eax

	/*
	 * Save old stack save variables, save stack registers, reload
	 * stack registers.
	 */
	pushl	_IF1632_Saved16_esp
	pushl	_IF1632_Saved16_ebp
	pushw	_IF1632_Saved16_ss

	movw	%ss,_IF1632_Saved16_ss
	movl	%esp,_IF1632_Saved16_esp
	movl	%ebp,_IF1632_Saved16_ebp

	movw	_IF1632_Saved32_ss,%ss
	movl	_IF1632_Saved32_esp,%esp
	movl	_IF1632_Saved32_ebp,%ebp

	/*
	 * Call entry point
	 */
	pushw	_IF1632_Saved16_ss
	pushw	_IF1632_Saved16_esp
	pushl	%eax
	call	_DLLRelay

	/*
 	 * Restore registers, but do not destroy return value.
	 */
	movw	_IF1632_Saved16_ss,%ss
	movl	_IF1632_Saved16_esp,%esp
	movl	_IF1632_Saved16_ebp,%ebp

	popw	_IF1632_Saved16_ss
	popl	_IF1632_Saved16_ebp
	popl	_IF1632_Saved16_esp

	popw	%es
	popw	%ds

	.align	2,0x90
	leave
	/*
	 * Now we need to ditch the parameter bytes that were left on the
	 * stack. We do this by effectively popping the number of bytes,
	 * and the return address, removing the parameters and then putting
	 * the return address back on the stack.
	 * Normally this field is filled in by the relevant function in
	 * the emulation library, since it should know how many bytes to
	 * expect.
	 */
	popw	%gs:nbytes
	cmpw	$0,%gs:nbytes
	je	noargs
	popw	%gs:offset
	popw	%gs:selector
	addw	%gs:nbytes,%esp
	pushw	%gs:selector
	pushw	%gs:offset
noargs:

	/*
	 * Last, but not least we need to move the high word from eax to dx
	 */
	pushl	%eax
	popw	%dx
	popw	%dx

	.byte	0x66
	lret

/**********************************************************************
 *	ReturnFromRegisterFunc()
 */
	.globl _ReturnFromRegisterFunc
_ReturnFromRegisterFunc:
	/*
 	 * Restore 16-bit stack
	 */
	movw	_IF1632_Saved16_ss,%ss
	movl	_IF1632_Saved16_esp,%esp
	movl	_IF1632_Saved16_ebp,%ebp

	popw	_IF1632_Saved16_ss
	popl	_IF1632_Saved16_ebp
	popl	_IF1632_Saved16_esp

	popw	%es
	popw	%ds

	.align	2,0x90
	leave
	/*
	 * This leaves us with a stack that has number of arguments,
	 * the return address, the saved registers, and the return 
	 * address again.
	 */
	add	$6,%esp		/* argument count, return address */
#include "pop.h"		/* restore context                */

	/*
	 * Return to original caller.
	 */
	.byte	0x66
	lret

