# Part of libhgfs - (c) 2009, D.C. van Moolenbroek

.globl	__libhgfs_backdoor
.globl	__libhgfs_backdoor_in
.globl	__libhgfs_backdoor_out

.text

	MAGIC = 0x564D5868
	BD_PORT = 0x5658
	IO_PORT = 0x5659

.balign	16
__libhgfs_backdoor:
	pushl	%ebx
	pushl	%esi
	pushl	%edi
	pushl	%ebp
	movl	4+16(%esp), %ebp
	movl	$MAGIC, %eax
	movl	4(%ebp), %ebx
	movl	8(%ebp), %ecx
	movl	12(%ebp), %edx
	movw	$BD_PORT, %dx
	movl	16(%ebp), %esi
	movl	20(%ebp), %edi
	inl	%dx
	movl	%eax, (%ebp)
	movl	%ebx, 4(%ebp)
	movl	%ecx, 8(%ebp)
	movl	%edx, 12(%ebp)
	movl	%esi, 16(%ebp)
	movl	%edi, 20(%ebp)
	popl	%ebp
	popl	%edi
	popl	%esi
	popl	%ebx
	ret

.balign	16
__libhgfs_backdoor_in:
	pushl	%ebx
	pushl	%esi
	pushl	%edi
	pushl	%ebp
	movl	4+16(%esp), %eax
	movl	4(%eax), %ebx
	movl	8(%eax), %ecx
	movl	12(%eax), %edx
	movw	$IO_PORT, %dx
	movl	16(%eax), %esi
	movl	20(%eax), %edi
	movl	24(%eax), %ebp
	movl	$MAGIC, %eax
	cld
	repe; insb
	pushl	%eax
	movl	4+20(%esp), %eax
	movl	%ebx, 4(%eax)
	movl	%ecx, 8(%eax)
	movl	%edx, 12(%eax)
	movl	%esi, 16(%eax)
	movl	%edi, 20(%eax)
	movl	%ebp, 24(%eax)
	popl	%ebx
	movl	%ebx, (%eax)
	movl	(%eax), %eax
	popl	%ebp
	popl	%edi
	popl	%esi
	popl	%ebx
	ret

.balign	16
__libhgfs_backdoor_out:
	pushl	%ebx
	pushl	%esi
	pushl	%edi
	pushl	%ebp
	movl	4+16(%esp), %eax
	movl	4(%eax), %ebx
	movl	8(%eax), %ecx
	movl	12(%eax), %edx
	movw	$IO_PORT, %dx
	movl	16(%eax), %esi
	movl	20(%eax), %edi
	movl	24(%eax), %ebp
	movl	$MAGIC, %eax
	cld
	repe; outsb
	pushl	%eax
	movl	4+20(%esp), %eax
	movl	%ebx, 4(%eax)
	movl	%ecx, 8(%eax)
	movl	%edx, 12(%eax)
	movl	%esi, 16(%eax)
	movl	%edi, 20(%eax)
	movl	%ebp, 24(%eax)
	popl	%ebx
	movl	%ebx, (%eax)
	movl	(%eax), %eax
	popl	%ebp
	popl	%edi
	popl	%esi
	popl	%ebx
	ret
