VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/bootsectors/bootsector2-test1-template.mac@ 83878

Last change on this file since 83878 was 82968, checked in by vboxsync, 5 years ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.9 KB
Line 
1; $Id: bootsector2-test1-template.mac 82968 2020-02-04 10:35:17Z vboxsync $
2;; @file
3; bootsector2 test1 - multi mode template.
4;
5
6;
7; Copyright (C) 2007-2020 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 "bootsector2-template-header.mac"
29
30;;
31; Run the CPUID benchmark for this mode.
32;
33; @uses nothing
34;
35BEGINCODELOW
36BITS 16
37BEGINPROC TMPL_NM(BenchmarkCpuId_rm)
38 call TMPL_NM(Bs2IsModeSupported_rm)
39 jz .done
40 call TMPL_NM(Bs2EnterMode_rm)
41BITS TMPL_BITS
42 push xBP
43 mov xBP, xSP
44 push sAX
45 push sBX
46 push sCX
47 push sDX
48 push sDI
49 sub sSP, 20h
50
51 ; Get the current time.
52 mov xAX, xSP
53 call TMPL_NM_CMN(GetNanoTS)
54
55 ; Do the test.
56 mov edi, TEST_INSTRUCTION_COUNT_IO / 4
57.again:
58 mov eax, 1
59 cpuid
60 mov eax, 1
61 cpuid
62 mov eax, 1
63 cpuid
64 mov eax, 1
65 cpuid
66 dec edi
67 jnz .again
68
69 ; Calc the elapsed time and report the result.
70 mov xAX, xSP
71 call TMPL_NM_CMN(GetElapsedNanoTS)
72
73 mov xCX, .s_szTestName
74 mov edx, TEST_INSTRUCTION_COUNT_IO
75 mov xAX, xSP
76 call TMPL_NM_CMN(ReportResult)
77
78 add sSP, 20h
79 pop sDI
80 pop sDX
81 pop sCX
82 pop sBX
83 pop sAX
84 leave
85
86 call TMPL_NM(Bs2ExitMode)
87BITS 16
88.done:
89 ret
90
91.s_szTestName:
92 db TMPL_MODE_STR, ', CPUID', 0
93ENDPROC TMPL_NM(BenchmarkCpuId_rm)
94
95TMPL_BEGINCODE
96BITS TMPL_BITS
97
98
99;;
100; Run the RDTSC benchmark for this mode.
101;
102; @uses nothing
103;
104BEGINCODELOW
105BITS 16
106BEGINPROC TMPL_NM(BenchmarkRdTsc_rm)
107 call TMPL_NM(Bs2IsModeSupported_rm)
108 jz .done
109 call TMPL_NM(Bs2EnterMode_rm)
110BITS TMPL_BITS
111 push xBP
112 mov xBP, xSP
113 push sAX
114 push sBX
115 push sCX
116 push sDX
117 push sDI
118 sub sSP, 20h
119
120 ; Get the current time.
121 mov xAX, xSP
122 call TMPL_NM_CMN(GetNanoTS)
123
124 ; Do the test.
125 mov edi, TEST_INSTRUCTION_COUNT_RDTSC / 4
126.again:
127 rdtsc
128 rdtsc
129 rdtsc
130 rdtsc
131 dec edi
132 jnz .again
133
134 ; Calc the elapsed time and report the result.
135 mov xAX, xSP
136 call TMPL_NM_CMN(GetElapsedNanoTS)
137
138 mov xCX, .s_szTestName
139 mov edx, TEST_INSTRUCTION_COUNT_RDTSC
140 mov xAX, xSP
141 call TMPL_NM_CMN(ReportResult)
142
143 add sSP, 20h
144 pop sDI
145 pop sDX
146 pop sCX
147 pop sBX
148 pop sAX
149 leave
150
151 call TMPL_NM(Bs2ExitMode)
152BITS 16
153.done:
154 ret
155
156.s_szTestName:
157 db TMPL_MODE_STR, ', RDTSC', 0
158ENDPROC TMPL_NM(BenchmarkRdTsc_rm)
159
160TMPL_BEGINCODE
161BITS TMPL_BITS
162
163
164;;
165; Run the Read CR4 benchmark for this mode.
166;
167; @uses nothing
168;
169BEGINCODELOW
170BITS 16
171BEGINPROC TMPL_NM(BenchmarkRdCr4_rm)
172 call TMPL_NM(Bs2IsModeSupported_rm)
173 jz .done
174 call TMPL_NM(Bs2EnterMode_rm)
175BITS TMPL_BITS
176 push xBP
177 mov xBP, xSP
178 push sAX
179 push sBX
180 push sCX
181 push sDX
182 push sDI
183 sub sSP, 20h
184
185 ; Get the current time.
186 mov xAX, xSP
187 call TMPL_NM_CMN(GetNanoTS)
188
189 ; Do the test.
190 mov edi, TEST_INSTRUCTION_COUNT_READCR4 / 4
191.again:
192 mov sAX, cr4
193 mov sAX, cr4
194 mov sAX, cr4
195 mov sAX, cr4
196 dec edi
197 jnz .again
198
199 ; Calc the elapsed time and report the result.
200 mov xAX, xSP
201 call TMPL_NM_CMN(GetElapsedNanoTS)
202
203 mov xCX, .s_szTestName
204 mov edx, TEST_INSTRUCTION_COUNT_READCR4
205 mov xAX, xSP
206 call TMPL_NM_CMN(ReportResult)
207
208 add sSP, 20h
209 pop sDI
210 pop sDX
211 pop sCX
212 pop sBX
213 pop sAX
214 leave
215
216 call TMPL_NM(Bs2ExitMode)
217BITS 16
218.done:
219 ret
220
221.s_szTestName:
222 db TMPL_MODE_STR, ', Read CR4', 0
223ENDPROC TMPL_NM(BenchmarkRdCr4_rm)
224
225TMPL_BEGINCODE
226BITS TMPL_BITS
227
228
229;;
230; Prologue for the I/O port tests.
231%ifndef HaveIoPortPrologue
232%define HaveIoPortPrologue
233%macro IoPortPrologue 2
234 push xBP
235 mov xBP, xSP
236 push sAX
237 push sDX
238 push sCX
239 sub xSP, 20h
240
241 ; Get the current time.
242 mov xAX, xSP
243 call TMPL_NM_CMN(GetNanoTS)
244
245 ; Do the test.
246 mov dx, %2
247 mov ecx, (%1) / 5
248%endmacro
249%endif
250
251
252;;
253; Epilogue for the I/O port tests.
254%ifndef HaveIoPortEpilogue
255%define HaveIoPortEpilogue
256%macro IoPortEpilogue 1
257 ; Calc the elapsed time and report the result.
258 mov xAX, xSP
259 call TMPL_NM_CMN(GetElapsedNanoTS)
260
261 mov xCX, .s_szTestName
262 mov edx, (%1)
263 mov xAX, xSP
264 call TMPL_NM_CMN(ReportResult)
265
266 add xSP, 20h
267 pop sCX
268 pop sDX
269 pop sAX
270 leave
271 ret
272%endmacro
273%endif
274
275
276;;
277; Benchmarks: IN eax, NOP
278;
279; @uses nothing
280;
281BEGINPROC TMPL_NM(BenchmarkIoPortNop32In)
282 IoPortPrologue TEST_INSTRUCTION_COUNT_IO, VMMDEV_TESTING_IOPORT_NOP
283.again:
284 in eax, dx
285 in eax, dx
286 in eax, dx
287 in eax, dx
288 in eax, dx
289 dec ecx
290 jnz .again
291 IoPortEpilogue TEST_INSTRUCTION_COUNT_IO
292.s_szTestName:
293 db TMPL_MODE_STR, ', 32-bit IN', 0
294ENDPROC TMPL_NM(BenchmarkIoPortNop32In)
295
296
297;;
298; Benchmarks: OUT NOP, eax
299;
300; @uses nothing
301;
302BEGINPROC TMPL_NM(BenchmarkIoPortNop32Out)
303 IoPortPrologue TEST_INSTRUCTION_COUNT_IO, VMMDEV_TESTING_IOPORT_NOP
304.again:
305 out dx, eax
306 out dx, eax
307 out dx, eax
308 out dx, eax
309 out dx, eax
310 dec ecx
311 jnz .again
312 IoPortEpilogue TEST_INSTRUCTION_COUNT_IO
313.s_szTestName:
314 db TMPL_MODE_STR, ', 32-bit OUT', 0
315ENDPROC TMPL_NM(BenchmarkIoPortNop32Out)
316
317
318;;
319; Benchmarks: IN ax, NOP
320;
321; @uses nothing
322;
323BEGINPROC TMPL_NM(BenchmarkIoPortNop16In)
324 IoPortPrologue TEST_INSTRUCTION_COUNT_IO, VMMDEV_TESTING_IOPORT_NOP
325.again:
326 in ax, dx
327 in ax, dx
328 in ax, dx
329 in ax, dx
330 in ax, dx
331 dec ecx
332 jnz .again
333 IoPortEpilogue TEST_INSTRUCTION_COUNT_IO
334.s_szTestName:
335 db TMPL_MODE_STR, ', 16-bit IN', 0
336ENDPROC TMPL_NM(BenchmarkIoPortNop16In)
337
338
339;;
340; Benchmarks: OUT NOP, ax
341;
342; @uses nothing
343;
344BEGINPROC TMPL_NM(BenchmarkIoPortNop16Out)
345 IoPortPrologue TEST_INSTRUCTION_COUNT_IO, VMMDEV_TESTING_IOPORT_NOP
346.again:
347 out dx, ax
348 out dx, ax
349 out dx, ax
350 out dx, ax
351 out dx, ax
352 dec ecx
353 jnz .again
354 IoPortEpilogue TEST_INSTRUCTION_COUNT_IO
355.s_szTestName:
356 db TMPL_MODE_STR, ', 16-bit OUT', 0
357ENDPROC TMPL_NM(BenchmarkIoPortNop16Out)
358
359
360;;
361; Benchmarks: IN al, NOP
362;
363; @uses nothing
364;
365BEGINPROC TMPL_NM(BenchmarkIoPortNop8In)
366 IoPortPrologue TEST_INSTRUCTION_COUNT_IO, VMMDEV_TESTING_IOPORT_NOP
367.again:
368 in al, dx
369 in al, dx
370 in al, dx
371 in al, dx
372 in al, dx
373 dec ecx
374 jnz .again
375 IoPortEpilogue TEST_INSTRUCTION_COUNT_IO
376.s_szTestName:
377 db TMPL_MODE_STR, ', 8-bit IN', 0
378ENDPROC TMPL_NM(BenchmarkIoPortNop8In)
379
380
381;;
382; Benchmarks: OUT NOP, al
383;
384; @uses nothing
385;
386BEGINPROC TMPL_NM(BenchmarkIoPortNop8Out)
387 IoPortPrologue TEST_INSTRUCTION_COUNT_IO, VMMDEV_TESTING_IOPORT_NOP
388.again:
389 out dx, al
390 out dx, al
391 out dx, al
392 out dx, al
393 out dx, al
394 dec ecx
395 jnz .again
396 IoPortEpilogue TEST_INSTRUCTION_COUNT_IO
397.s_szTestName:
398 db TMPL_MODE_STR, ', 8-bit OUT', 0
399ENDPROC TMPL_NM(BenchmarkIoPortNop8Out)
400
401
402;;
403; Benchmarks: IN eax, NOP_R3
404;
405; @uses nothing
406;
407BEGINPROC TMPL_NM(BenchmarkIoPortRing3Nop32In)
408 IoPortPrologue TEST_INSTRUCTION_COUNT_IO, VMMDEV_TESTING_IOPORT_NOP_R3
409.again:
410 in eax, dx
411 in eax, dx
412 in eax, dx
413 in eax, dx
414 in eax, dx
415 dec ecx
416 jnz .again
417 IoPortEpilogue TEST_INSTRUCTION_COUNT_IO
418.s_szTestName:
419 db TMPL_MODE_STR, ', 32-bit IN-to-ring-3', 0
420ENDPROC TMPL_NM(BenchmarkIoPortRing3Nop32In)
421
422
423;;
424; Benchmarks: OUT NOP_R3, eax
425;
426; @uses nothing
427;
428BEGINPROC TMPL_NM(BenchmarkIoPortRing3Nop32Out)
429 IoPortPrologue TEST_INSTRUCTION_COUNT_IO, VMMDEV_TESTING_IOPORT_NOP_R3
430.again:
431 out dx, eax
432 out dx, eax
433 out dx, eax
434 out dx, eax
435 out dx, eax
436 dec ecx
437 jnz .again
438 IoPortEpilogue TEST_INSTRUCTION_COUNT_IO
439.s_szTestName:
440 db TMPL_MODE_STR, ', 32-bit OUT-to-ring-3', 0
441ENDPROC TMPL_NM(BenchmarkIoPortRing3Nop32Out)
442
443
444%undef IoPortPrologue
445%undef IoPortEpilogue
446
447
448;;
449; Run the I/O benchmarks for this mode.
450;
451; @uses nothing
452;
453BEGINCODELOW
454BITS 16
455BEGINPROC TMPL_NM(BenchmarkIoPortNop_rm)
456 call TMPL_NM(Bs2IsModeSupported_rm)
457 jz .done
458 call TMPL_NM(Bs2EnterMode_rm)
459BITS TMPL_BITS
460
461 call TMPL_NM(BenchmarkIoPortNop32In)
462 call TMPL_NM(BenchmarkIoPortNop32Out)
463%ifndef QUICK_TEST
464 call TMPL_NM(BenchmarkIoPortNop16In)
465 call TMPL_NM(BenchmarkIoPortNop16Out)
466 call TMPL_NM(BenchmarkIoPortNop8In)
467 call TMPL_NM(BenchmarkIoPortNop8Out)
468%endif
469 call TMPL_NM(BenchmarkIoPortRing3Nop32In)
470 call TMPL_NM(BenchmarkIoPortRing3Nop32Out)
471
472 call TMPL_NM(Bs2ExitMode)
473BITS 16
474.done:
475 ret
476ENDPROC TMPL_NM(BenchmarkIoPortNop_rm)
477
478TMPL_BEGINCODE
479BITS TMPL_BITS
480
481
482
483
484;;
485; Prologue for the MMIO tests.
486%ifndef HaveMmioPrologue
487%define HaveMmioPrologue
488%macro MmioPrologue 2
489 push xBP
490 mov xBP, xSP
491 push sAX
492 push sDX
493 push sCX
494 push sBX
495 sub xSP, 20h
496
497 ; Get the current time.
498 mov xAX, xSP
499 call TMPL_NM_CMN(GetNanoTS)
500
501 ; Do the test - X million 32-bit IN instructions.
502%ifdef TMPL_16BIT
503 mov dx, ds ; save ds
504 %ifdef TMPL_RM
505 mov bx, VMMDEV_TESTING_MMIO_RM_SEL
506 mov ds, bx
507 mov ebx, VMMDEV_TESTING_MMIO_RM_OFF(%2)
508 %else
509 mov bx, BS2_SEL_MMIO16
510 mov ds, bx
511 mov ebx, %2 - BS2_SEL_MMIO16_BASE
512 %endif
513%else
514 mov xBX, %2
515%endif
516 mov ecx, (%1) / 5
517%endmacro
518%endif
519
520;;
521; Epilogue for the MMIO tests.
522%ifndef HaveMmioEpilogue
523%define HaveMmioEpilogue
524%macro MmioEpilogue 1
525%ifdef TMPL_16BIT
526 mov ds, dx ; restore ds
527%endif
528
529 ; Calc the elapsed time and report the result.
530 mov xAX, xSP
531 call TMPL_NM_CMN(GetElapsedNanoTS)
532
533 mov xCX, .s_szTestName
534 mov edx, (%1)
535 mov xAX, xSP
536 call TMPL_NM_CMN(ReportResult)
537
538 add xSP, 20h
539 pop sBX
540 pop sCX
541 pop sDX
542 pop sAX
543 leave
544 ret
545%endmacro
546%endif
547
548
549;;
550; Benchmarks: MOV eax, [NOP]
551;
552; @uses nothing
553;
554BEGINPROC TMPL_NM(BenchmarkMmioNop32Read)
555 MmioPrologue TEST_INSTRUCTION_COUNT_MMIO, VMMDEV_TESTING_MMIO_NOP
556.again:
557 mov eax, [sBX]
558 mov eax, [sBX]
559 mov eax, [sBX]
560 mov eax, [sBX]
561 mov eax, [sBX]
562 dec ecx
563 jnz .again
564 MmioEpilogue TEST_INSTRUCTION_COUNT_MMIO
565.s_szTestName:
566 db TMPL_MODE_STR, ', 32-bit read', 0
567ENDPROC TMPL_NM(BenchmarkMmioNop32Read)
568
569
570;;
571; Benchmarks: MOV [NOP], eax
572;
573; @uses nothing
574;
575BEGINPROC TMPL_NM(BenchmarkMmioNop32Write)
576 MmioPrologue TEST_INSTRUCTION_COUNT_MMIO, VMMDEV_TESTING_MMIO_NOP
577.again:
578 mov [sBX], eax
579 mov [sBX], eax
580 mov [sBX], eax
581 mov [sBX], eax
582 mov [sBX], eax
583 dec ecx
584 jnz .again
585 MmioEpilogue TEST_INSTRUCTION_COUNT_MMIO
586.s_szTestName:
587 db TMPL_MODE_STR, ', 32-bit write', 0
588ENDPROC TMPL_NM(BenchmarkMmioNop32Write)
589
590
591;;
592; Benchmarks: MOV ax, [NOP]
593;
594; @uses nothing
595;
596BEGINPROC TMPL_NM(BenchmarkMmioNop16Read)
597 MmioPrologue TEST_INSTRUCTION_COUNT_MMIO, VMMDEV_TESTING_MMIO_NOP
598.again:
599 mov ax, [xBX]
600 mov ax, [xBX]
601 mov ax, [xBX]
602 mov ax, [xBX]
603 mov ax, [xBX]
604 dec ecx
605 jnz .again
606 MmioEpilogue TEST_INSTRUCTION_COUNT_MMIO
607.s_szTestName:
608 db TMPL_MODE_STR, ', 16-bit read', 0
609ENDPROC TMPL_NM(BenchmarkMmioNop16Read)
610
611
612;;
613; Benchmarks: MOV [NOP], ax
614;
615; @uses nothing
616;
617BEGINPROC TMPL_NM(BenchmarkMmioNop16Write)
618 MmioPrologue TEST_INSTRUCTION_COUNT_MMIO, VMMDEV_TESTING_MMIO_NOP
619.again:
620 mov [xBX], ax
621 mov [xBX], ax
622 mov [xBX], ax
623 mov [xBX], ax
624 mov [xBX], ax
625 dec ecx
626 jnz .again
627 MmioEpilogue TEST_INSTRUCTION_COUNT_MMIO
628.s_szTestName:
629 db TMPL_MODE_STR, ', 16-bit write', 0
630ENDPROC TMPL_NM(BenchmarkMmioNop16Write)
631
632
633;;
634; Benchmarks: MOV al, [NOP]
635;
636; @uses nothing
637;
638BEGINPROC TMPL_NM(BenchmarkMmioNop8Read)
639 MmioPrologue TEST_INSTRUCTION_COUNT_MMIO, VMMDEV_TESTING_MMIO_NOP
640.again:
641 mov al, [xBX]
642 mov al, [xBX]
643 mov al, [xBX]
644 mov al, [xBX]
645 mov al, [xBX]
646 dec ecx
647 jnz .again
648 MmioEpilogue TEST_INSTRUCTION_COUNT_MMIO
649.s_szTestName:
650 db TMPL_MODE_STR, ', 8-bit read', 0
651ENDPROC TMPL_NM(BenchmarkMmioNop8Read)
652
653
654;;
655; Benchmarks: MOV [NOP], al
656;
657; @uses nothing
658;
659BEGINPROC TMPL_NM(BenchmarkMmioNop8Write)
660 MmioPrologue TEST_INSTRUCTION_COUNT_MMIO, VMMDEV_TESTING_MMIO_NOP
661.again:
662 mov [xBX], al
663 mov [xBX], al
664 mov [xBX], al
665 mov [xBX], al
666 mov [xBX], al
667 dec ecx
668 jnz .again
669 MmioEpilogue TEST_INSTRUCTION_COUNT_MMIO
670.s_szTestName:
671 db TMPL_MODE_STR, ', 8-bit write', 0
672ENDPROC TMPL_NM(BenchmarkMmioNop8Write)
673
674
675;;
676; Benchmarks: MOV eax, [NOP_R3]
677;
678; @uses nothing
679;
680BEGINPROC TMPL_NM(BenchmarkMmioRing3Nop32Read)
681 MmioPrologue TEST_INSTRUCTION_COUNT_MMIO, VMMDEV_TESTING_MMIO_NOP_R3
682.again:
683 mov eax, [sBX]
684 mov eax, [sBX]
685 mov eax, [sBX]
686 mov eax, [sBX]
687 mov eax, [sBX]
688 dec ecx
689 jnz .again
690 MmioEpilogue TEST_INSTRUCTION_COUNT_MMIO
691.s_szTestName:
692 db TMPL_MODE_STR, ', 32-bit read-to-ring-3', 0
693ENDPROC TMPL_NM(BenchmarkMmioRing3Nop32Read)
694
695
696;;
697; Benchmarks: MOV [NOP_R3], eax
698;
699; @uses nothing
700;
701BEGINPROC TMPL_NM(BenchmarkMmioRing3Nop32Write)
702 MmioPrologue TEST_INSTRUCTION_COUNT_MMIO, VMMDEV_TESTING_MMIO_NOP_R3
703.again:
704 mov [sBX], eax
705 mov [sBX], eax
706 mov [sBX], eax
707 mov [sBX], eax
708 mov [sBX], eax
709 dec ecx
710 jnz .again
711 MmioEpilogue TEST_INSTRUCTION_COUNT_MMIO
712.s_szTestName:
713 db TMPL_MODE_STR, ', 32-bit write-to-ring-3', 0
714ENDPROC TMPL_NM(BenchmarkMmioRing3Nop32Write)
715
716
717%undef MmioPrologue
718%undef MmioEpilogue
719
720
721;;
722; Do the MMIO tests for this mode.
723;
724; @uses nothing
725;
726BEGINCODELOW
727BITS 16
728BEGINPROC TMPL_NM(BenchmarkMmioNop_rm)
729 call TMPL_NM(Bs2IsModeSupported_rm)
730 jz .done
731 call TMPL_NM(Bs2EnterMode_rm)
732BITS TMPL_BITS
733
734 call TMPL_NM(BenchmarkMmioNop32Read)
735 call TMPL_NM(BenchmarkMmioNop32Write)
736%ifndef QUICK_TEST
737 call TMPL_NM(BenchmarkMmioNop16Read)
738 call TMPL_NM(BenchmarkMmioNop16Write)
739 call TMPL_NM(BenchmarkMmioNop8Read)
740 call TMPL_NM(BenchmarkMmioNop8Write)
741%endif
742 call TMPL_NM(BenchmarkMmioRing3Nop32Read)
743 call TMPL_NM(BenchmarkMmioRing3Nop32Write)
744
745 call TMPL_NM(Bs2ExitMode)
746BITS 16
747.done:
748 ret
749ENDPROC TMPL_NM(BenchmarkMmioNop_rm)
750
751TMPL_BEGINCODE
752BITS TMPL_BITS
753
754
755%include "bootsector2-template-footer.mac"
756
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