xref: /freebsd/stand/i386/btx/lib/btxv86.S (revision 22cf89c938886d14f5796fc49f9f020c23ea8eaf)
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#
17# BTX V86 interface.
18#
19
20#
21# Globals.
22#
23		.global __v86int
24#
25# Fields in V86 interface structure.
26#
27		.set V86_CTL,0x0		# Control flags
28		.set V86_ADDR,0x4		# Int number/address
29		.set V86_ES,0x8			# V86 ES
30		.set V86_DS,0xc			# V86 DS
31		.set V86_FS,0x10		# V86 FS
32		.set V86_GS,0x14		# V86 GS
33		.set V86_EAX,0x18		# V86 EAX
34		.set V86_ECX,0x1c		# V86 ECX
35		.set V86_EDX,0x20		# V86 EDX
36		.set V86_EBX,0x24		# V86 EBX
37		.set V86_EFL,0x28		# V86 eflags
38		.set V86_EBP,0x2c		# V86 EBP
39		.set V86_ESI,0x30		# V86 ESI
40		.set V86_EDI,0x34		# V86 EDI
41#
42# Other constants.
43#
44		.set INT_V86,0x31		# Interrupt number
45		.set SIZ_V86,0x38		# Size of V86 structure
46#
47# V86 interface function.
48#
49__v86int:	popl __v86ret			# Save return address
50		pushl $__v86			# Push pointer
51		call __v86_swap			# Load V86 registers
52		int $INT_V86			# To BTX
53		call __v86_swap			# Load user registers
54		addl $0x4,%esp			# Discard pointer
55		pushl __v86ret			# Restore return address
56		ret 				# To user
57#
58# Swap V86 and user registers.
59#
60__v86_swap:	xchgl %ebp,0x4(%esp,1)		# Swap pointer, EBP
61		xchgl %eax,V86_EAX(%ebp)	# Swap EAX
62		xchgl %ecx,V86_ECX(%ebp)	# Swap ECX
63		xchgl %edx,V86_EDX(%ebp)	# Swap EDX
64		xchgl %ebx,V86_EBX(%ebp)	# Swap EBX
65		pushl %eax			# Save
66		pushf 				# Put eflags
67		popl %eax			#  in EAX
68		xchgl %eax,V86_EFL(%ebp)	# Swap
69		pushl %eax			# Put EAX
70		popf 				#  in eflags
71		movl 0x8(%esp,1),%eax		# Load EBP
72		xchgl %eax,V86_EBP(%ebp)	# Swap
73		movl %eax,0x8(%esp,1)		# Save EBP
74		popl %eax			# Restore
75		xchgl %esi,V86_ESI(%ebp)	# Swap ESI
76		xchgl %edi,V86_EDI(%ebp)	# Swap EDI
77		xchgl %ebp,0x4(%esp,1)		# Swap pointer, EBP
78		ret				# To caller
79#
80# V86 interface structure.
81#
82		.comm __v86,SIZ_V86
83		.comm __v86ret,4
84