This source file includes following definitions.
- kvm86_call
- kvm86_ret
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <machine/asm.h>
35 #include <machine/param.h>
36 #include "assym.h"
37
38 .data
39 .align 4
40
41
42 .globl kvm86_incall
43 kvm86_incall: .long 0
44
45
46 .globl vm86pcb, vm86newptd, vm86frame, vm86pgtableva
47 .globl vm86tssd0, vm86tssd1
48
49
50 SCRARGFRAME: .long 0
51 SCRSTACK: .long 0
52 SCRTSS0: .long 0
53 SCRTSS1: .long 0
54
55 .text
56
57 #if defined MULTIPROCESSOR
58 #include <machine/i82489reg.h>
59 #endif
60
61
62 ENTRY(kvm86_call)
63 pushl %ebp
64 movl %esp,%ebp
65 pushl %esi
66 pushl %edi
67 pushl %ebx
68 pushl %fs
69 pushl %gs
70
71 movl 8(%ebp),%eax
72 movl %eax,SCRARGFRAME
73
74 movl vm86frame,%edi
75 movl SCRARGFRAME,%esi
76 movl $FRAMESIZE/4,%ecx
77 cld
78 rep
79 movsl
80
81 #ifdef MULTIPROCESSOR
82 movl _C_LABEL(local_apic)+LAPIC_ID,%ecx
83 shrl $LAPIC_ID_SHIFT,%ecx
84 leal 0(,%ecx,4),%ecx
85 movl _C_LABEL(cpu_info)(%ecx),%edx
86 movl %edx,%ecx
87 #else
88 leal _C_LABEL(cpu_info_primary),%ecx
89 #endif
90
91 movl CPU_INFO_CURPCB(%ecx),%eax
92 pushl %eax
93
94 movl vm86pcb,%eax
95 movl %eax,CPU_INFO_CURPCB(%ecx)
96 movl CPU_INFO_CURPROC(%ecx),%ecx
97 movl P_MD_TSS_SEL(%ecx),%edi
98
99 #ifdef MULTIPROCESSOR
100 movl CPU_INFO_GDT(%edx),%eax
101 #else
102 movl _C_LABEL(gdt),%eax
103 #endif
104 andl $~0x0200,4(%eax,%edi,1)
105
106 movl 0(%eax,%edi,1),%edx
107 movl %edx,SCRTSS0
108 movl 4(%eax,%edi,1),%edx
109 movl %edx,SCRTSS1
110
111 movl vm86tssd0,%edx
112 movl %edx,0(%eax,%edi,1)
113 movl vm86tssd1,%edx
114 movl %edx,4(%eax,%edi,1)
115 ltr %di
116
117 movl %cr3,%eax
118 pushl %eax
119 movl PTDpaddr,%ecx
120 movl %ecx,%ebx
121 addl $KERNBASE,%ebx
122 movl 0(%ebx),%eax
123 pushl %eax
124 pushl %ebx
125
126 movl %esp,SCRSTACK
127
128 movl vm86newptd,%eax
129 movl %eax,0(%ebx)
130
131 movl %ecx,%cr3
132 movl vm86frame,%esp
133
134 movl $1,kvm86_incall
135
136
137 popl %gs
138 popl %fs
139 popl %es
140 popl %ds
141 popl %edi
142 popl %esi
143 popl %ebp
144 popl %ebx
145 popl %edx
146 popl %ecx
147 popl %eax
148 addl $8,%esp
149 iret
150
151
152
153 ENTRY(kvm86_ret)
154 pushl %ebp
155 movl %esp,%ebp
156
157 movl 8(%ebp),%esi
158 movl SCRARGFRAME,%edi
159 movl $FRAMESIZE/4,%ecx
160 cld
161 rep
162 movsl
163
164 movl SCRSTACK,%esp
165 popl %ebx
166 popl %eax
167 movl %eax,0(%ebx)
168 popl %eax
169 movl %eax,%cr3
170
171 movl $0,kvm86_incall
172
173
174 #ifdef MULTIPROCESSOR
175 movl _C_LABEL(local_apic)+LAPIC_ID,%ecx
176 shrl $LAPIC_ID_SHIFT,%ecx
177 leal 0(,%ecx,4),%ecx
178 movl _C_LABEL(cpu_info)(%ecx),%ecx
179 movl CPU_INFO_GDT(%ecx),%eax
180 #else
181 leal _C_LABEL(cpu_info_primary),%ecx
182 movl _C_LABEL(gdt),%eax
183 #endif
184 movl CPU_INFO_CURPROC(%ecx),%ecx
185 movl P_MD_TSS_SEL(%ecx),%edi
186 movl SCRTSS0, %edx
187 movl %edx, 0(%eax,%edi,1)
188 movl SCRTSS1, %edx
189 movl %edx, 4(%eax,%edi,1)
190 ltr %di
191
192
193 #ifdef MULTIPROCESSOR
194 movl _C_LABEL(local_apic)+LAPIC_ID,%ecx
195 shrl $LAPIC_ID_SHIFT,%ecx
196 leal 0(,%ecx,4),%ecx
197 movl _C_LABEL(cpu_info)(%ecx),%ecx
198 #else
199 leal _C_LABEL(cpu_info_primary),%ecx
200 #endif
201 popl %eax
202 movl %eax,CPU_INFO_CURPCB(%ecx)
203
204 movl 12(%ebp), %eax
205
206 popl %gs
207 popl %fs
208 popl %ebx
209 popl %edi
210 popl %esi
211 popl %ebp
212 ret