VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMGC/VMMGCA.asm@ 4953

Last change on this file since 4953 was 4071, checked in by vboxsync, 17 years ago

Biggest check-in ever. New source code headers for all (C) innotek files.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 4.6 KB
Line 
1; $Id: VMMGCA.asm 4071 2007-08-07 17:07:59Z vboxsync $
2;; @file
3; VMMGC - Guest Context Virtual Machine Monitor assembly routines.
4;
5
6; Copyright (C) 2006-2007 innotek GmbH
7;
8; This file is part of VirtualBox Open Source Edition (OSE), as
9; available from http://www.virtualbox.org. This file is free software;
10; you can redistribute it and/or modify it under the terms of the GNU
11; General Public License as published by the Free Software Foundation,
12; in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13; distribution. VirtualBox OSE is distributed in the hope that it will
14; be useful, but WITHOUT ANY WARRANTY of any kind.
15
16;*******************************************************************************
17;* Header Files *
18;*******************************************************************************
19%include "VBox/asmdefs.mac"
20%include "VBox/x86.mac"
21
22
23;*******************************************************************************
24;* Defined Constants And Macros *
25;*******************************************************************************
26;; save all registers before loading special values for the faulting.
27%macro SaveAndLoadAll 0
28 pushad
29 push ds
30 push es
31 push fs
32 push gs
33 call NAME(vmmGCTestLoadRegs)
34%endmacro
35
36;; restore all registers after faulting.
37%macro RestoreAll 0
38 pop gs
39 pop fs
40 pop es
41 pop ds
42 popad
43%endmacro
44
45
46;*******************************************************************************
47;* External Symbols *
48;*******************************************************************************
49extern IMPNAME(g_Logger)
50extern IMPNAME(g_RelLogger)
51extern NAME(RTLogLogger)
52
53
54BEGINCODE
55
56;/**
57; * Internal GC logger worker: Logger wrapper.
58; */
59;VMMGCDECL(void) vmmGCLoggerWrapper(const char *pszFormat, ...);
60EXPORTEDNAME vmmGCLoggerWrapper
61%ifdef __YASM__
62%ifdef ASM_FORMAT_ELF
63 push dword IMP(g_Logger) ; YASM BUG #67! YASMCHECK!
64%else
65 push IMP(g_Logger)
66%endif
67%else
68 push IMP(g_Logger)
69%endif
70 call NAME(RTLogLogger)
71 add esp, byte 4
72 ret
73ENDPROC vmmGCLoggerWrapper
74
75
76;/**
77; * Internal GC logger worker: Logger (release) wrapper.
78; */
79;VMMGCDECL(void) vmmGCRelLoggerWrapper(const char *pszFormat, ...);
80EXPORTEDNAME vmmGCRelLoggerWrapper
81%ifdef __YASM__
82%ifdef ASM_FORMAT_ELF
83 push dword IMP(g_RelLogger) ; YASM BUG #67! YASMCHECK!
84%else
85 push IMP(g_RelLogger)
86%endif
87%else
88 push IMP(g_RelLogger)
89%endif
90 call NAME(RTLogLogger)
91 add esp, byte 4
92 ret
93ENDPROC vmmGCRelLoggerWrapper
94
95
96;;
97; Enables write protection.
98BEGINPROC vmmGCEnableWP
99 push eax
100 mov eax, cr0
101 or eax, X86_CR0_WRITE_PROTECT
102 mov cr0, eax
103 pop eax
104 ret
105ENDPROC vmmGCEnableWP
106
107
108;;
109; Disables write protection.
110BEGINPROC vmmGCDisableWP
111 push eax
112 mov eax, cr0
113 and eax, ~X86_CR0_WRITE_PROTECT
114 mov cr0, eax
115 pop eax
116 ret
117ENDPROC vmmGCDisableWP
118
119
120;;
121; Load special register set expected upon faults.
122; All registers are changed.
123BEGINPROC vmmGCTestLoadRegs
124 mov eax, ss
125 mov ds, eax
126 mov es, eax
127 mov fs, eax
128 mov gs, eax
129 mov edi, 001234567h
130 mov esi, 042000042h
131 mov ebp, 0ffeeddcch
132 mov ebx, 089abcdefh
133 mov ecx, 0ffffaaaah
134 mov edx, 077778888h
135 mov eax, 0f0f0f0f0h
136 ret
137ENDPROC vmmGCTestLoadRegs
138
139
140;;
141; A Trap 3 testcase.
142GLOBALNAME vmmGCTestTrap3
143 SaveAndLoadAll
144
145 int 3
146EXPORTEDNAME vmmGCTestTrap3_FaultEIP
147
148 RestoreAll
149 mov eax, 0ffffffffh
150 ret
151ENDPROC vmmGCTestTrap3
152
153
154;;
155; A Trap 8 testcase.
156GLOBALNAME vmmGCTestTrap8
157 SaveAndLoadAll
158
159 sub esp, byte 8
160 sidt [esp]
161 mov word [esp], 111 ; make any #PF double fault.
162 lidt [esp]
163 add esp, byte 8
164
165 COM_S_CHAR '!'
166
167 xor eax, eax
168EXPORTEDNAME vmmGCTestTrap8_FaultEIP
169 mov eax, [eax]
170
171
172 COM_S_CHAR '2'
173
174 RestoreAll
175 mov eax, 0ffffffffh
176 ret
177ENDPROC vmmGCTestTrap8
178
179
180;;
181; A simple Trap 0d testcase.
182GLOBALNAME vmmGCTestTrap0d
183 SaveAndLoadAll
184
185 push ds
186EXPORTEDNAME vmmGCTestTrap0d_FaultEIP
187 ltr [esp]
188 pop eax
189
190 RestoreAll
191 mov eax, 0ffffffffh
192 ret
193ENDPROC vmmGCTestTrap0d
194
195
196;;
197; A simple Trap 0e testcase.
198GLOBALNAME vmmGCTestTrap0e
199 SaveAndLoadAll
200
201 xor eax, eax
202EXPORTEDNAME vmmGCTestTrap0e_FaultEIP
203 mov eax, [eax]
204
205 RestoreAll
206 mov eax, 0ffffffffh
207 ret
208
209EXPORTEDNAME vmmGCTestTrap0e_ResumeEIP
210 RestoreAll
211 xor eax, eax
212 ret
213ENDPROC vmmGCTestTrap0e
214
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette