VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/bootsectors/bootsector2-triple-fault-1.asm@ 76690

Last change on this file since 76690 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.2 KB
Line 
1; $Id: bootsector2-triple-fault-1.asm 76553 2019-01-01 01:45:53Z vboxsync $
2;; @file
3; Bootsector for testing triple faults.
4;
5
6;
7; Copyright (C) 2007-2019 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; The contents of this file may alternatively be used under the terms
18; of the Common Development and Distribution License Version 1.0
19; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20; VirtualBox OSE distribution, in which case the provisions of the
21; CDDL are applicable instead of those of the GPL.
22;
23; You may elect to license modified versions of this file under the
24; terms and conditions of either the GPL or the CDDL or both.
25;
26
27
28%include "iprt/asmdefs.mac"
29%include "iprt/x86.mac"
30%include "VBox/VMMDevTesting.mac"
31
32;; The number of instructions to test.
33%define TEST_INSTRUCTION_COUNT_IO 2000000
34
35;; The number of instructions to test.
36%define TEST_INSTRUCTION_COUNT_MMIO 750000
37
38;; Define this to drop unnecessary test variations.
39%define QUICK_TEST
40
41;
42; Include and execute the init code.
43;
44 %define BS2_INIT_RM
45 %define BS2_INC_PE16
46 %define BS2_INC_PE32
47 %define BS2_INC_PP32
48 %define BS2_INC_PAE32
49 %define BS2_INC_LM64
50 %include "bootsector2-common-init-code.mac"
51
52
53;
54; The test driver
55;
56BEGINPROC main
57 ;
58 ; Test prologue.
59 ;
60 mov ax, .s_szTstName
61 call TestInit_r86
62 call Bs2EnableA20_r86
63
64 ;
65 ; Did we get here from a reboot triggered below?
66 ;
67 push ds
68 mov ax, 2000h ; 128 KB is enough for the test program
69.boot_check_loop:
70 mov ds, ax
71 cmp dword [0], 064726962h
72 jne .boot_check_next
73 cmp dword [4], 062697264h
74 je .warm_reset_broken
75
76.boot_check_next:
77 mov dword [0], 064726962h
78 mov dword [4], 062697264h
79 add ax, 1000h
80 cmp ax, 8000h
81 jbe .boot_check_loop
82 pop ds
83 jmp .fine
84
85.warm_reset_broken:
86 pop ds
87 mov ax, .s_szWarmResetBroken
88 call NAME(TestFailed_r86)
89 jmp .done
90.s_szWarmResetBroken:
91 db 'Warm reset vector support is broken', 0dh, 0ah, 0
92.fine:
93
94 ;
95 ; Test that the warm reset interface works.
96 ;
97 mov ax, .s_szPrecondTest5
98 call NAME(TestSub_r86)
99 mov al, 05h
100 call NAME(SetWarmResetJmp)
101 cmp ax, 0
102 jne .precond_test_A
103 call NAME(TestReboot_r86)
104
105.precond_test_A:
106 mov ax, .s_szPrecondTestA
107 call NAME(TestSub_r86)
108 mov al, 0Ah
109 call NAME(SetWarmResetJmp)
110 cmp ax, 0
111 jne .precond_test_A_passed
112 call NAME(TestReboot_r86)
113.precond_test_A_passed:
114 call NAME(TestSubDone_r86)
115
116 ;
117 ; The real tests.
118 ;
119
120
121 ;
122 ; We're done.
123 ;
124.done:
125 call NAME(TestTerm_r86)
126 call Bs2Panic
127
128.s_szTstName:
129 db 'tstTriple', 0
130.s_szPrecondTest5:
131 db 'Shutdown Action 5', 0
132.s_szPrecondTestA:
133 db 'Shutdown Action A', 0
134ENDPROC main
135
136
137
138;;
139; Sets up the warm reset vector.
140;
141; @param ax Where to resume exeuction.
142; @param dl Shutdown action command to use, 5h or Fh.
143;
144; @uses nothing
145;
146BEGINPROC SetUpWarmReset
147 push bp
148 mov bp, sp
149 push eax
150 push ebx
151 push ecx
152 push edx
153 push edi
154 push esi
155 push es
156
157 ;
158 ; Set up the warm reboot vector.
159 ;
160 mov bx, 40h
161 mov es, bx
162
163 mov ecx, [es:67h] ; debug
164 mov word [es:67h], ax
165 mov bx, cs
166 mov word [es:67h+2], bx
167
168 mov bx, [es:72h] ; debug
169 mov word [es:72h], 1234h ; warm reboot
170
171 wbinvd
172
173 mov al, 0fh
174 out 70h, al ; set register index
175 in al, 71h
176 mov ah, al ; debug
177 mov al, dl ; shutdown action command
178 out 71h, al ; set cmos[f] = a - invoke testResume as early as possible.
179 in al, 71h ; debug / paranoia
180 movzx si, al
181
182 ; Debug print.
183%if 1
184 mov di, sp ; save sp (lazy bird)
185 in al, 64h
186 push ax ; kbd status
187 push si ; cmos[f] after
188 mov al, ah ; cmos[f] before
189 push ax
190 push word [0472h] ; 40:72 word after
191 push bx ; 40:72 word before
192 push word [0467h] ; 40:67 far addr after
193 push word [0469h]
194 push cx ; 40:67 far addr before
195 shr ecx, 16
196 push dx
197 push ds
198 push .s_szDebugFmt
199 call NAME(PrintF_r86)
200 mov sp, di ; restore sp.
201;.forever:
202; cli
203; hlt
204; jmp .forever
205%endif
206
207 pop es
208 pop esi
209 pop edi
210 pop edx
211 pop ecx
212 pop ebx
213 pop eax
214 leave
215 ret
216
217.s_szDebugFmt:
218 db 'dbg: 40:67=%RX16:%RX16 (%RX16:%RX16) 40:72=%RX16 (%RX16) cmos[f]=%RX8 (%RX8) kbdsts=%RX8', 0dh, 0ah, 0
219ENDPROC SetUpWarmReset
220
221
222;;
223; Sets up the warm reset vector.
224;
225; @returns ax = 0 on setup call, ax = 1 on resume return.
226; @param al Shutdown action command to use, 5h or Fh.
227; @uses ax
228;
229BEGINPROC SetWarmResetJmp
230 push bp
231 mov bp, sp
232 push dx
233
234 mov dl, al
235 mov ax, .resume
236 call NAME(SetUpWarmReset)
237
238%ifdef DEBUG
239 push cs
240 push .s_szDbg1
241 call NAME(PrintF_r86)
242 add sp, 4
243%endif
244
245 mov ax, .s_ResumeRegs
246 call NAME(TestSaveRegisters_r86)
247
248%ifdef DEBUG
249 push cs
250 push .s_szDbg2
251 call NAME(PrintF_r86)
252 add sp, 4
253%endif
254
255 mov dx, [bp - 2]
256 mov [.s_ResumeRegs + BS2REGS.rdx], dx
257 mov ax, bp
258 add ax, 4
259 mov [.s_ResumeRegs + BS2REGS.rsp], ax
260 mov ax, [bp]
261 mov [.s_ResumeRegs + BS2REGS.rbp], ax
262 mov ax, [bp + 2]
263 mov [.s_ResumeRegs + BS2REGS.rip], ax
264 mov word [.s_ResumeRegs + BS2REGS.rax], 1
265
266%ifdef DEBUG
267 push cs
268 push .s_szDbg3
269 call NAME(PrintF_r86)
270 add sp, 4
271%endif
272
273 xor ax, ax
274.done:
275 pop dx
276 leave
277 ret
278
279.resume:
280 cli
281 xor ax, ax
282 mov ds, ax
283 mov es, ax
284 mov ax, [.s_ResumeRegs + BS2REGS.ss]
285 mov ss, ax
286 mov esp, [.s_ResumeRegs + BS2REGS.rsp]
287 mov ebp, [.s_ResumeRegs + BS2REGS.rbp]
288
289%ifdef DEBUG
290 push ds
291 push .s_szDbg4
292 call NAME(PrintF_r86)
293 add sp, 4
294%endif
295
296 mov ax, .s_ResumeRegs
297 call NAME(TestRestoreRegisters_r86)
298 mov ax, [.s_ResumeRegs + BS2REGS.rip]
299 push ax
300 mov ax, 1
301 ret
302 ;jmp word [.s_ResumeRegs + BS2REGS.rip]
303
304.s_ResumeRegs:
305 times (BS2REGS_size) db 0
306%ifdef DEBUG
307.s_szDbg1:
308 db 'dbg 1', 0dh, 0ah, 0
309.s_szDbg2:
310 db 'dbg 2', 0dh, 0ah, 0
311.s_szDbg3:
312 db 'dbg 3', 0dh, 0ah, 0
313.s_szDbg4:
314 db 'dbg 4', 0dh, 0ah, 0
315%endif
316ENDPROC SetWarmResetJmp
317
318
319;;
320; Reboot the machine. Will not return.
321;
322BEGINPROC TestReboot_r86
323%ifdef DEBUG
324 ; Debug
325 push ds
326 push .s_szDbg
327 call NAME(PrintF_r86)
328%endif
329 ; Via port A
330 in al, 92h
331 and al, ~1
332 out 92h, al
333 or al, 1
334 out 92h, al
335 in al, 92h
336.forever:
337 cli
338 hlt
339 jmp .forever
340%ifdef DEBUG
341.s_szDbg:
342 db 'Rebooting...', 0dh, 0ah, 0
343%endif
344ENDPROC TestReboot_r86
345
346
347;
348; Instantiate the template code.
349;
350%include "bootsector2-template-footer.mac" ; reset the initial environemnt.
351
352;%define TMPL_RM
353;%include "bootsector2-test1-template.mac"
354;%define TMPL_CMN_V86
355;%include "bootsector2-test1-template.mac"
356;%define TMPL_PE16
357;%include "bootsector2-test1-template.mac"
358;%define TMPL_PE32
359;%include "bootsector2-test1-template.mac"
360;%define TMPL_PP16
361;%include "bootsector2-test1-template.mac"
362;%define TMPL_PP32
363;%include "bootsector2-test1-template.mac"
364;%define TMPL_PAE16
365;%include "bootsector2-test1-template.mac"
366;%define TMPL_PAE32
367;%include "bootsector2-test1-template.mac"
368;%define TMPL_LM16
369;%include "bootsector2-test1-template.mac"
370;%define TMPL_LM32
371;%include "bootsector2-test1-template.mac"
372;%define TMPL_LM64
373;%include "bootsector2-test1-template.mac"
374
375
376;
377; End sections and image.
378;
379%include "bootsector2-common-end.mac"
380
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