xref: /freebsd/stand/i386/btx/lib/btxv86.S (revision 2774f206809b8fd3a4904fe945f029a414fbc642)
1#
2# Copyright (c) 1998 Robert Nordier
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms are freely
6# permitted provided that the above copyright notice and this
7# paragraph and the following disclaimer are duplicated in all
8# such forms.
9#
10# This software is provided "AS IS" and without any express or
11# implied warranties, including, without limitation, the implied
12# warranties of merchantability and fitness for a particular
13# purpose.
14#
15
16# $FreeBSD$
17
18#
19# BTX V86 interface.
20#
21
22#
23# Globals.
24#
25		.global __v86int
26#
27# Fields in V86 interface structure.
28#
29		.set V86_CTL,0x0		# Control flags
30		.set V86_ADDR,0x4		# Int number/address
31		.set V86_ES,0x8			# V86 ES
32		.set V86_DS,0xc			# V86 DS
33		.set V86_FS,0x10		# V86 FS
34		.set V86_GS,0x14		# V86 GS
35		.set V86_EAX,0x18		# V86 EAX
36		.set V86_ECX,0x1c		# V86 ECX
37		.set V86_EDX,0x20		# V86 EDX
38		.set V86_EBX,0x24		# V86 EBX
39		.set V86_EFL,0x28		# V86 eflags
40		.set V86_EBP,0x2c		# V86 EBP
41		.set V86_ESI,0x30		# V86 ESI
42		.set V86_EDI,0x34		# V86 EDI
43#
44# Other constants.
45#
46		.set INT_V86,0x31		# Interrupt number
47		.set SIZ_V86,0x38		# Size of V86 structure
48#
49# V86 interface function.
50#
51__v86int:	popl __v86ret			# Save return address
52		pushl $__v86			# Push pointer
53		call __v86_swap			# Load V86 registers
54		int $INT_V86			# To BTX
55		call __v86_swap			# Load user registers
56		addl $0x4,%esp			# Discard pointer
57		pushl __v86ret			# Restore return address
58		ret 				# To user
59#
60# Swap V86 and user registers.
61#
62__v86_swap:	xchgl %ebp,0x4(%esp,1)		# Swap pointer, EBP
63		xchgl %eax,V86_EAX(%ebp)	# Swap EAX
64		xchgl %ecx,V86_ECX(%ebp)	# Swap ECX
65		xchgl %edx,V86_EDX(%ebp)	# Swap EDX
66		xchgl %ebx,V86_EBX(%ebp)	# Swap EBX
67		pushl %eax			# Save
68		pushf 				# Put eflags
69		popl %eax			#  in EAX
70		xchgl %eax,V86_EFL(%ebp)	# Swap
71		pushl %eax			# Put EAX
72		popf 				#  in eflags
73		movl 0x8(%esp,1),%eax		# Load EBP
74		xchgl %eax,V86_EBP(%ebp)	# Swap
75		movl %eax,0x8(%esp,1)		# Save EBP
76		popl %eax			# Restore
77		xchgl %esi,V86_ESI(%ebp)	# Swap ESI
78		xchgl %edi,V86_EDI(%ebp)	# Swap EDI
79		xchgl %ebp,0x4(%esp,1)		# Swap pointer, EBP
80		ret				# To caller
81#
82# V86 interface structure.
83#
84		.comm __v86,SIZ_V86
85		.comm __v86ret,4
86