VirtualBox

source: vbox/trunk/src/VBox/VMM/testcase/Instructions/env-common.mac@ 47389

Last change on this file since 47389 was 47132, checked in by vboxsync, 12 years ago

test divide errors (BS2+big.mac).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.6 KB
Line 
1; $Id: env-common.mac 47132 2013-07-14 00:06:54Z vboxsync $
2;; @file
3; Instruction Test Environment - Common Bits.
4;
5
6;
7; Copyright (C) 2006-2013 Oracle Corporation
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17
18%ifndef ___env_common_mac
19%define ___env_common_mac
20
21
22;*******************************************************************************
23;* Defined Constants And Macros *
24;*******************************************************************************
25%ifdef RT_ARCH_AMD64
26 %define MY_PUSH_FLAGS pushfq
27 %define MY_POP_FLAGS popfq
28 %define MY_PUSH_FLAGS_SIZE 8
29
30 %macro MY_PUSH_ALL 0
31 push rbp
32 mov rbp, rsp
33 push rax
34 push rbx
35 push rcx
36 push rdx
37 push rsi
38 push rdi
39 push r8
40 push r9
41 push r10
42 push r11
43 push r12
44 push r13
45 push r14
46 push r15
47 pushfq
48 %endm
49 %macro MY_POP_ALL 0
50 popfq
51 pop r15
52 pop r14
53 pop r13
54 pop r12
55 pop r11
56 pop r10
57 pop r9
58 pop r8
59 pop rdi
60 pop rsi
61 pop rdx
62 pop rcx
63 pop rbx
64 pop rax
65 pop rbp
66 %endm
67
68%else
69 %define MY_PUSH_FLAGS pushfd
70 %define MY_POP_FLAGS popfd
71 %define MY_PUSH_FLAGS_SIZE 4
72
73 %macro MY_PUSH_ALL 0
74 push eBP
75 mov xBP, xSP
76 push eax
77 push ebx
78 push ecx
79 push edx
80 push esi
81 push edi
82 pushfd
83 %endm
84 %macro MY_POP_ALL 0
85 popfd
86 pop edi
87 pop esi
88 pop edx
89 pop ecx
90 pop ebx
91 pop eax
92 pop ebp
93 %endm
94%endif
95
96
97
98;*******************************************************************************
99;* Internal Functions *
100;*******************************************************************************
101
102VBINSTST_BEGINCODE
103
104;;
105; Report bad register value.
106;
107; Primary purpose is save all registers and convert from our stack-based to
108; the correct calling convention for the environment.
109;
110; This function will clean up the stack upon return (to save space in the caller).
111;
112; @param uExpected
113; @param uActual
114; @param uRegisterNo
115;
116VBINSTST_BEGINPROC Common_BadValue
117 MY_PUSH_ALL
118 mov xAX, xSP ; 16-byte align the stack and reserve space for arguments and stuff.
119 sub xSP, 40h
120 and xSP, ~15
121 mov [xSP + 38h], xAX
122
123%ifdef ASM_CALL64_GCC
124 mov r8d, [VBINSTST_NAME(g_uVBInsTstSubTestIndicator) wrt rip]
125 mov rcx, [rbp + 10h] ; expected
126 mov rdx, [rbp + 18h] ; actual
127 mov rsi, [rbp + 20h] ; reg#
128 lea rdi, [.szFmt wrt rip]
129 VBINSTST_CALL_FN_FAILURE_4
130
131%elifdef ASM_CALL64_MSC
132 mov r10d, [VBINSTST_NAME(g_uVBInsTstSubTestIndicator) wrt rip]
133 mov [rsp + 20h], r10
134 mov r9, [rbp + 10h] ; expected
135 mov r8, [rbp + 18h] ; actual
136 mov rdx, [rbp + 20h] ; reg#
137 lea rcx, [.szFmt wrt rip]
138 VBINSTST_CALL_FN_FAILURE_4
139
140%elifdef ASM_CALL64_BS2
141 mov sBX, [VBINSTST_NAME(g_uVBInsTstSubTestIndicator) xWrtRIP]
142 mov sCX, [xBP + xCB + xCB] ; expected
143 mov sAX, [xBP + xCB + xCB + sCB*1] ; actual
144 mov sDX, [xBP + xCB + xCB + sCB*2] ; reg#
145 lea sSI, [.szFmt xWrtRIP]
146 mov qword [xSP + xCB + 3*sCB], sBX
147 mov qword [xSP + xCB + 2*sCB], sCX
148 mov qword [xSP + xCB + 1*sCB], sAX
149 mov qword [xSP + xCB], sDX
150 mov [xSP], sSI
151 VBINSTST_CALL_FN_FAILURE_4
152
153%else
154 mov sBX, [VBINSTST_NAME(g_uVBInsTstSubTestIndicator)]
155 mov sCX, [xBP + xCB + xCB] ; expected
156 mov sAX, [xBP + xCB + xCB + sCB*1] ; actual
157 mov sDX, [xBP + xCB + xCB + sCB*2] ; reg#
158 mov [xSP + xCB + 3*sCB], sBX
159 mov [xSP + xCB + 2*sCB], sCX
160 mov [xSP + xCB + 1*sCB], sAX
161 mov [xSP + xCB], sDX
162 mov [xSP], RTCCPTR_PRE .szFmt
163 VBINSTST_CALL_FN_FAILURE_4
164%endif
165
166 mov xSP, [xSP + 38h]
167 MY_POP_ALL
168 ret 3*sCB
169%if ARCH_BITS == 64
170.szFmt: db 'Bad register 0x%RX32 value 0x%RX64, expected 0x%RX64 (line %RU64)', 13, 0
171%else
172.szFmt: db 'Bad register 0x%RX32 value 0x%RX32, expected 0x%RX32 (line %RU32)', 13, 0
173%endif
174VBINSTST_ENDPROC Common_BadValue
175
176
177%ifdef VBINSTST_CAN_DO_TRAPS
178
179;;
180; Report a missing TRAP.
181;
182; Primary purpose is save all registers and convert from our stack-based to
183; the correct calling convention for the environment.
184;
185; This function will clean up the stack upon return (to save space in the caller).
186;
187; @param uExpected
188;
189VBINSTST_BEGINPROC Common_MissingTrap
190 MY_PUSH_ALL
191 mov xAX, xSP ; 16-byte align the stack and reserve space for arguments and stuff.
192 sub xSP, 40h
193 and xSP, ~15
194 mov [xSP + 38h], xAX
195
196 %ifdef ASM_CALL64_GCC
197 mov rdx, [VBINSTST_NAME(g_uVBInsTstSubTestIndicator) wrt rip]
198 movzx rsi, byte [rbp + 10h] ; expected
199 lea rdi, [.szFmt wrt rip]
200 VBINSTST_CALL_FN_FAILURE_2
201
202 %elifdef ASM_CALL64_MSC
203 mov r8d, [VBINSTST_NAME(g_uVBInsTstSubTestIndicator) wrt rip]
204 movzx rdx, byte [rbp + 10h] ; expected
205 lea rcx, [.szFmt wrt rip]
206 VBINSTST_CALL_FN_FAILURE_2
207
208 %elifdef ASM_CALL64_BS2
209 mov sBX, [VBINSTST_NAME(g_uVBInsTstSubTestIndicator) xWrtRIP]
210 mov sDX, [xBP + xCB + xCB] ; expected
211 lea sSI, [.szFmt xWrtRIP]
212 mov qword [xSP + xCB + 1*sCB], sBX
213 mov qword [xSP + xCB], sDX
214 mov [xSP], sSI
215 VBINSTST_CALL_FN_FAILURE_2
216
217 %else
218 mov sBX, [VBINSTST_NAME(g_uVBInsTstSubTestIndicator)]
219 mov sDX, [xBP + xCB + xCB] ; expected
220 mov [xSP + xCB + 1*sCB], sBX
221 mov [xSP + xCB], sDX
222 mov [xSP], RTCCPTR_PRE .szFmt
223 VBINSTST_CALL_FN_FAILURE_2
224 %endif
225
226 mov xSP, [xSP + 38h]
227 MY_POP_ALL
228 ret 1*sCB
229 %if ARCH_BITS == 64
230.szFmt: db 'Missing trap %RX8 (line %RU64)', 13, 0
231 %else
232.szFmt: db 'Missing trap %RX8 (line %RU32)', 13, 0
233 %endif
234VBINSTST_ENDPROC Common_MissingTrap
235
236 %macro Common_MissingTrapTemplate 1
237 VBINSTST_BEGINPROC Common_MissingTrap_%1
238 push %1
239 call VBINSTST_NAME(Common_MissingTrap)
240 ret
241 VBINSTST_ENDPROC Common_MissingTrap_%1
242 %endmacro
243 Common_MissingTrapTemplate X86_XCPT_DE
244 Common_MissingTrapTemplate X86_XCPT_DB
245 Common_MissingTrapTemplate X86_XCPT_NMI
246 Common_MissingTrapTemplate X86_XCPT_BP
247 Common_MissingTrapTemplate X86_XCPT_OF
248 Common_MissingTrapTemplate X86_XCPT_BR
249 Common_MissingTrapTemplate X86_XCPT_UD
250 Common_MissingTrapTemplate X86_XCPT_NM
251 ;Common_MissingTrapTemplate X86_XCPT_DF
252 ;Common_MissingTrapTemplate X86_XCPT_CO_SEG_OVERRUN
253 Common_MissingTrapTemplate X86_XCPT_TS
254 Common_MissingTrapTemplate X86_XCPT_NP
255 Common_MissingTrapTemplate X86_XCPT_SS
256 Common_MissingTrapTemplate X86_XCPT_GP
257 Common_MissingTrapTemplate X86_XCPT_PF
258 Common_MissingTrapTemplate X86_XCPT_MF
259 Common_MissingTrapTemplate X86_XCPT_AC
260 ;Common_MissingTrapTemplate X86_XCPT_MC
261 Common_MissingTrapTemplate X86_XCPT_XF
262
263%endif ; VBINSTST_CAN_DO_TRAPS
264
265
266;
267; Global data variables used by Common_SetupMemReadUxx.
268; For address calculation reasons, these must be qword aligned.
269;
270VBINSTST_BEGINDATA
271 align 64
272 dd 09d8af498h, 09ab3e5f8h
273VBINSTST_GLOBALNAME_EX g_u64Data, data hidden
274 dq 0
275 dd 07d7af797h, 096b36562h
276VBINSTST_GLOBALNAME_EX g_u32Data, data hidden
277 dd 0
278 dd 012305987h
279VBINSTST_GLOBALNAME_EX g_u16Data, data hidden
280 dw 0
281 dw 05865h
282 dw 03863h
283 dw 02679h
284VBINSTST_GLOBALNAME_EX g_u8Data, data hidden
285 db 0
286 db 90h
287 dw 0865ah
288 dd 058daffe2h
289
290VBINSTST_BEGINCODE
291
292;;
293; Sets up g_u8Data.
294; @param uValue
295VBINSTST_BEGINPROC Common_SetupMemReadU8
296 push sAX
297 mov ax, [xSP + sCB + xCB]
298 mov [VBINSTST_NAME(g_u8Data) xWrtRIP], ax
299 pop sAX
300 ret sCB
301VBINSTST_ENDPROC Common_SetupMemReadU8
302
303;;
304; Sets up g_u16Data.
305; @param uValue
306VBINSTST_BEGINPROC Common_SetupMemReadU16
307 push sAX
308 mov ax, [xSP + sCB + xCB]
309 mov [VBINSTST_NAME(g_u16Data) xWrtRIP], ax
310 pop sAX
311 ret sCB
312VBINSTST_ENDPROC Common_SetupMemReadU16
313
314;;
315; Sets up g_u32Data.
316; @param uValue
317VBINSTST_BEGINPROC Common_SetupMemReadU32
318 push sAX
319 mov eax, [xSP + sCB + xCB]
320 mov [VBINSTST_NAME(g_u32Data) xWrtRIP], eax
321 pop sAX
322 ret sCB
323VBINSTST_ENDPROC Common_SetupMemReadU32
324
325;;
326; Sets up g_u64Data.
327; @param uValue
328VBINSTST_BEGINPROC Common_SetupMemReadU64
329 push sAX
330%ifdef RT_ARCH_AMD64
331 mov rax, [xSP + sCB + xCB]
332 mov [VBINSTST_NAME(g_u64Data) xWrtRIP], rax
333%else
334 mov eax, [xSP + sCB + xCB]
335 mov [VBINSTST_NAME(g_u64Data) xWrtRIP], eax
336 mov eax, [xSP + sCB + xCB + 4]
337 mov [VBINSTST_NAME(g_u64Data) + 4 xWrtRIP], eax
338%endif
339 pop sAX
340 ret sCB
341VBINSTST_ENDPROC Common_SetupMemReadU64
342
343
344%endif
345
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