Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/stand/i386/btx/lib/btxv86.S
34869 views
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
85