VirtualBox

source: vbox/trunk/include/VBox/asmdefs.mac@ 35638

Last change on this file since 35638 was 28800, checked in by vboxsync, 15 years ago

Automated rebranding to Oracle copyright/license strings via filemuncher

  • Property svn:eol-style set to native
File size: 15.7 KB
Line 
1;; @file
2; VirtualBox YASM/NASM macros, structs, etc.
3;
4
5;
6; Copyright (C) 2006-2007 Oracle Corporation
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 (GPL) as published by the Free Software
12; Foundation, in version 2 as it comes in the "COPYING" file of the
13; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15;
16; The contents of this file may alternatively be used under the terms
17; of the Common Development and Distribution License Version 1.0
18; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19; VirtualBox OSE distribution, in which case the provisions of the
20; CDDL are applicable instead of those of the GPL.
21;
22; You may elect to license modified versions of this file under the
23; terms and conditions of either the GPL or the CDDL or both.
24;
25
26%ifndef ___VBox_asmdefs_mac
27%define ___VBox_asmdefs_mac
28
29;; @def VBOX_WITH_STATISTICS
30; When defined all statistics will be included in the build.
31; This is enabled by default in all debug builds.
32%ifndef VBOX_WITH_STATISTICS
33 %ifdef DEBUG
34 %define VBOX_WITH_STATISTICS
35 %endif
36%endif
37
38%include "iprt/asmdefs.mac"
39
40;; @def VBOX_STRICT
41; Enables strict checks in the VBox code.
42; This is enabled by default in all debug builds and when RT_STRICT is enabled.
43%ifndef VBOX_STRICT
44 %ifdef DEBUG
45 %define VBOX_STRICT
46 %endif
47 %ifdef RT_STRICT
48 %define VBOX_STRICT
49 %endif
50%endif
51
52
53%ifndef VBOX_UART_BASE
54 %ifndef IPRT_UART_BASE
55 %define VBOX_UART_BASE 3f8h ; COM1 (see src/VBox/Runtime/common/log/logcom.cpp)
56 %else
57 %define VBOX_UART_BASE IPRT_UART_BASE
58 %endif
59%endif
60%ifndef VBOX_UART_RATE
61 %define VBOX_UART_RATE 12 ; 9600 bps
62%endif
63%ifndef VBOX_UART_PARAMS
64 %define VBOX_UART_PARAMS 00000011b ; 8n1
65%endif
66
67
68;;
69; Initializes the com port to 9600 baud 8n1.
70; al and dx are wasted.
71; @todo comport init doesn't quite work - therefore we no longer use this! :-/
72%macro COM_INIT 0
73 push eax
74 push edx
75
76 mov dx, VBOX_UART_BASE + 3
77 mov al, 80h
78 out dx, al ; make DL register accessible
79
80 mov dx, VBOX_UART_BASE
81 mov ax, VBOX_UART_RATE
82 out dx, ax ; write bps rate divisor
83
84 mov dx, VBOX_UART_BASE + 3
85 mov al, VBOX_UART_PARAMS
86 out dx, al ; write parameters
87
88
89 xor ax, ax
90 mov dx, VBOX_UART_BASE + 4 ; disconnect the UART from the int line
91 out dx, al
92
93 mov dx, VBOX_UART_BASE + 1 ; disable UART ints
94 out dx, al
95
96 mov dx, VBOX_UART_BASE + 2 ; disable the fifos (old software relies on it)
97 out dx, al
98
99 mov dx, VBOX_UART_BASE
100 in al, dx ; clear receiver
101 mov dx, VBOX_UART_BASE + 5
102 in al, dx ; clear line status
103 inc dx
104 in al, dx ; clear modem status
105
106 pop edx
107 pop eax
108%endmacro
109
110
111;;
112; writes string to comport
113; trashes nothing (uses stack though)
114
115%macro COM32_S_PRINT 1+
116 push esi
117 push ecx
118 push eax
119 mov ecx, edx
120 shl ecx, 16
121
122 call %%stringend
123%%string: db %1
124%%stringend:
125 pop esi
126 mov cx, %%stringend - %%string
127%%status:
128 mov dx, VBOX_UART_BASE + 5
129 in al, dx
130 test al, 20h
131 jz short %%status
132
133 mov al, [esi]
134 mov dx, VBOX_UART_BASE
135 out dx, al
136 inc esi
137 dec cx
138 jnz short %%status
139
140%%status2:
141 mov dx, VBOX_UART_BASE + 5
142 in al, dx
143 test al, 20h
144 jz short %%status2
145
146 shr ecx, 16
147 mov dx, cx
148 pop eax
149 pop ecx
150 pop esi
151%endmacro
152
153%macro COM64_S_PRINT 1+
154 push rsi
155 push rdx
156 push rcx
157 push rax
158
159 jmp %%stringend
160%%string: db %1
161%%stringend:
162 lea rsi, [%%string wrt rip]
163 mov cx, %%stringend - %%string
164%%status:
165 mov dx, VBOX_UART_BASE + 5
166 in al, dx
167 test al, 20h
168 jz short %%status
169
170 mov al, [rsi]
171 mov dx, VBOX_UART_BASE
172 out dx, al
173 inc rsi
174 dec cx
175 jnz short %%status
176
177%%status2:
178 mov dx, VBOX_UART_BASE + 5
179 in al, dx
180 test al, 20h
181 jz short %%status2
182
183 pop rax
184 pop rcx
185 pop rdx
186 pop rsi
187%endmacro
188
189%macro COM_S_PRINT 1+
190%ifdef RT_ARCH_AMD64
191 COM64_S_PRINT %1
192%else
193 COM32_S_PRINT %1
194%endif
195%endmacro
196
197
198;; Write char.
199; trashes esi
200%macro COM_CHAR 1
201 mov esi, eax
202 shl esi, 16
203 mov si, dx
204
205%%status:
206 mov dx, VBOX_UART_BASE + 5
207 in al, dx
208 test al, 20h
209 jz short %%status
210
211 mov al, %1
212 mov dx, VBOX_UART_BASE
213 out dx, al
214
215%%status2:
216 mov dx, VBOX_UART_BASE + 5
217 in al, dx
218 test al, 20h
219 jz short %%status2
220
221 mov dx, si
222 shr esi, 16
223 mov ax, si
224%endmacro
225
226
227;; Write char.
228; trashes nothing (uses stack though)
229
230%macro COM32_S_CHAR 1
231 push eax
232 push edx
233
234%%status:
235 mov dx, VBOX_UART_BASE + 5
236 in al, dx
237 test al, 20h
238 jz short %%status
239
240 mov al, %1
241 mov dx, VBOX_UART_BASE
242 out dx, al
243
244%%status2:
245 mov dx, VBOX_UART_BASE + 5
246 in al, dx
247 test al, 20h
248 jz short %%status2
249
250 pop edx
251 pop eax
252%endmacro
253
254%macro COM64_S_CHAR 1
255 push rax
256 push rdx
257
258%%status:
259 mov dx, VBOX_UART_BASE + 5
260 in al, dx
261 test al, 20h
262 jz short %%status
263
264 mov al, %1
265 mov dx, VBOX_UART_BASE
266 out dx, al
267
268%%status2:
269 mov dx, VBOX_UART_BASE + 5
270 in al, dx
271 test al, 20h
272 jz short %%status2
273
274 pop rdx
275 pop rax
276%endmacro
277
278%macro COM_S_CHAR 1
279%ifdef RT_ARCH_AMD64
280 COM64_S_CHAR %1
281%else
282 COM32_S_CHAR %1
283%endif
284%endmacro
285
286
287;; Writes newline
288; trashes esi
289%macro COM_NEWLINE 0
290 mov esi, eax
291 shl esi, 16
292 mov si, dx
293
294%%status1:
295 mov dx, VBOX_UART_BASE + 5
296 in al, dx
297 test al, 20h
298 jz short %%status1
299
300 mov al, 13
301 mov dx, VBOX_UART_BASE
302 out dx, al
303
304%%status2:
305 mov dx, VBOX_UART_BASE + 5
306 in al, dx
307 test al, 20h
308 jz short %%status2
309
310 mov al, 10
311 mov dx, VBOX_UART_BASE
312 out dx, al
313
314%%status3:
315 mov dx, VBOX_UART_BASE + 5
316 in al, dx
317 test al, 20h
318 jz short %%status3
319
320 mov dx, si
321 shr esi, 16
322 mov ax, si
323%endmacro
324
325
326;; Writes newline
327; trashes nothing (uses stack though)
328
329%macro COM32_S_NEWLINE 0
330 push edx
331 push eax
332
333%%status1:
334 mov dx, VBOX_UART_BASE + 5
335 in al, dx
336 test al, 20h
337 jz short %%status1
338
339 mov al, 13
340 mov dx, VBOX_UART_BASE
341 out dx, al
342
343%%status2:
344 mov dx, VBOX_UART_BASE + 5
345 in al, dx
346 test al, 20h
347 jz short %%status2
348
349 mov al, 10
350 mov dx, VBOX_UART_BASE
351 out dx, al
352
353%%status3:
354 mov dx, VBOX_UART_BASE + 5
355 in al, dx
356 test al, 20h
357 jz short %%status3
358
359 pop eax
360 pop edx
361%endmacro
362
363%macro COM64_S_NEWLINE 0
364 push rdx
365 push rax
366
367%%status1:
368 mov dx, VBOX_UART_BASE + 5
369 in al, dx
370 test al, 20h
371 jz short %%status1
372
373 mov al, 13
374 mov dx, VBOX_UART_BASE
375 out dx, al
376
377%%status2:
378 mov dx, VBOX_UART_BASE + 5
379 in al, dx
380 test al, 20h
381 jz short %%status2
382
383 mov al, 10
384 mov dx, VBOX_UART_BASE
385 out dx, al
386
387%%status3:
388 mov dx, VBOX_UART_BASE + 5
389 in al, dx
390 test al, 20h
391 jz short %%status3
392
393 pop rax
394 pop rdx
395%endmacro
396
397%macro COM_S_NEWLINE 0
398%ifdef RT_ARCH_AMD64
399 COM64_S_NEWLINE
400%else
401 COM32_S_NEWLINE
402%endif
403%endmacro
404
405
406;; Writes a dword from register to com port.
407; trashes esi, edi
408; edi cannot be used as input register
409%macro COM_DWORD_REG 1
410 mov edi, ebx ; save ebx
411 mov ebx, %1 ; get value we're supposed to print
412 mov esi, eax ; save ax
413 shl esi, 16 ; save dx
414 mov si, dx
415
416 mov ah, 8 ; loop counter.
417%%daloop:
418 rol ebx, 4 ; shift next digit to the front
419
420%%status0:
421 mov dx, VBOX_UART_BASE + 5
422 in al, dx
423 test al, 20h
424 jz short %%status0
425
426 mov al, bl ; get next char
427 and al, 0fh
428 cmp al, 10
429 jae short %%hex ; yasm BUG! It sometimes generate a near jump here. YASMCHECK!
430 add al, '0'
431 jmp short %%print
432%%hex:
433 add al, 'a' - 10
434%%print:
435 mov dx, VBOX_UART_BASE
436 out dx, al
437
438 dec ah
439 jnz short %%daloop ; loop
440
441 mov dx, si ; restore dx
442 shr esi, 16
443 mov ax, si ; restore ax
444 mov ebx, edi ; restore ebx
445%endmacro
446
447
448;; Writes a dword from register to com port.
449; trashes nothing (uses stack though)
450
451%macro COM32_S_DWORD_REG 1
452 push edx
453 push eax
454 push ebx
455
456 mov ebx, %1 ; get value we're supposed to print
457
458 mov ah, 8 ; loop counter.
459%%daloop:
460 rol ebx, 4 ; shift next digit to the front
461
462%%status0:
463 mov dx, VBOX_UART_BASE + 5
464 in al, dx
465 test al, 20h
466 jz short %%status0
467
468 mov al, bl ; get next char
469 and al, 0fh
470 cmp al, 10
471 jae short %%hex ; yasm BUG! It sometimes generate a near jump here. YASMCHECK!
472 add al, '0'
473 jmp short %%print
474%%hex:
475 add al, 'a' - 10
476%%print:
477 mov dx, VBOX_UART_BASE
478 out dx, al
479
480 dec ah
481 jnz short %%daloop ; loop
482
483 pop ebx
484 pop eax
485 pop edx
486%endmacro
487
488%macro COM64_S_DWORD_REG 1
489 push rdx
490 push rax
491 push rbx
492
493 mov ebx, %1 ; get value we're supposed to print
494
495 mov ah, 8 ; loop counter.
496%%daloop:
497 rol ebx, 4 ; shift next digit to the front
498
499%%status0:
500 mov dx, VBOX_UART_BASE + 5
501 in al, dx
502 test al, 20h
503 jz short %%status0
504
505 mov al, bl ; get next char
506 and al, 0fh
507 cmp al, 10
508 jae short %%hex ; yasm BUG! It sometimes generate a near jump here. YASMCHECK!
509 add al, '0'
510 jmp short %%print
511%%hex:
512 add al, 'a' - 10
513%%print:
514 mov dx, VBOX_UART_BASE
515 out dx, al
516
517 dec ah
518 jnz short %%daloop ; loop
519
520 pop rbx
521 pop rax
522 pop rdx
523%endmacro
524
525%macro COM_S_DWORD_REG 1
526%ifdef RT_ARCH_AMD64
527 COM64_S_DWORD_REG %1
528%else
529 COM32_S_DWORD_REG %1
530%endif
531%endmacro
532
533
534;; Writes a qword from register to com port.
535; trashes nothing (uses stack though)
536%macro COM64_S_QWORD_REG 1
537 push rdx
538 push rax
539 push rbx
540
541 mov rbx, %1 ; get value we're supposed to print
542
543 mov ah, 16 ; loop counter.
544%%daloop:
545 rol rbx, 4 ; shift next digit to the front
546
547%%status0:
548 mov dx, VBOX_UART_BASE + 5
549 in al, dx
550 test al, 20h
551 jz short %%status0
552
553 mov al, bl ; get next char
554 and al, 0fh
555 cmp al, 10
556 jae short %%hex ; yasm BUG! It sometimes generate a near jump here. YASMCHECK!
557 add al, '0'
558 jmp short %%print
559%%hex:
560 add al, 'a' - 10
561%%print:
562 mov dx, VBOX_UART_BASE
563 out dx, al
564
565 dec ah
566 jnz short %%daloop ; loop
567
568 pop rbx
569 pop rax
570 pop rdx
571%endmacro
572
573
574;; Writes a byte from register to com port.
575; trashes nothing (uses stack though)
576
577%macro COM32_S_BYTE_REG 1
578 push edx
579 push eax
580 push ebx
581
582 mov ebx, %1 ; get value we're supposed to print
583
584 mov ah, 2 ; loop counter.
585 ror ebx, 8 ; shift next digit to the front
586%%daloop:
587 rol ebx, 4 ; shift next digit to the front
588
589%%status0:
590 mov dx, VBOX_UART_BASE + 5
591 in al, dx
592 test al, 20h
593 jz short %%status0
594
595 mov al, bl ; get next char
596 and al, 0fh
597 cmp al, 10
598 jae short %%hex ; yasm BUG! It sometimes generate a near jump here. YASMCHECK!
599 add al, '0'
600 jmp short %%print
601%%hex:
602 add al, 'a' - 10
603%%print:
604 mov dx, VBOX_UART_BASE
605 out dx, al
606
607 dec ah
608 jnz short %%daloop ; loop
609
610 pop ebx
611 pop eax
612 pop edx
613%endmacro
614
615%macro COM64_S_BYTE_REG 1
616 push rdx
617 push rax
618 push rbx
619
620 mov ebx, %1 ; get value we're supposed to print
621
622 mov ah, 2 ; loop counter.
623 ror ebx, 8 ; shift next digit to the front
624%%daloop:
625 rol ebx, 4 ; shift next digit to the front
626
627%%status0:
628 mov dx, VBOX_UART_BASE + 5
629 in al, dx
630 test al, 20h
631 jz short %%status0
632
633 mov al, bl ; get next char
634 and al, 0fh
635 cmp al, 10
636 jae short %%hex ; yasm BUG! It sometimes generate a near jump here. YASMCHECK!
637 add al, '0'
638 jmp short %%print
639%%hex:
640 add al, 'a' - 10
641%%print:
642 mov dx, VBOX_UART_BASE
643 out dx, al
644
645 dec ah
646 jnz short %%daloop ; loop
647
648 pop rbx
649 pop rax
650 pop rdx
651%endmacro
652
653%macro COM_S_BYTE_REG 1
654%ifdef RT_ARCH_AMD64
655 COM64_S_BYTE_REG %1
656%else
657 COM32_S_BYTE_REG %1
658%endif
659%endmacro
660
661
662
663;; Writes a single hex digit from register to com port.
664; trashes nothing (uses stack though)
665
666%macro COM32_S_DIGIT_REG 1
667 push edx
668 push eax
669 push ebx
670
671 mov ebx, %1 ; get value we're supposed to print
672%%status0:
673 mov dx, VBOX_UART_BASE + 5
674 in al, dx
675 test al, 20h
676 jz short %%status0
677
678 mov al, bl ; get next char
679 and al, 0fh
680 cmp al, 10
681 jae short %%hex ; yasm BUG! It sometimes generate a near jump here. YASMCHECK!
682 add al, '0'
683 jmp short %%print
684%%hex:
685 add al, 'a' - 10
686%%print:
687 mov dx, VBOX_UART_BASE
688 out dx, al
689
690 pop ebx
691 pop eax
692 pop edx
693%endmacro
694
695%macro COM64_S_DIGIT_REG 1
696 push rdx
697 push rax
698 push rbx
699
700 mov ebx, %1 ; get value we're supposed to print
701%%status0:
702 mov dx, VBOX_UART_BASE + 5
703 in al, dx
704 test al, 20h
705 jz short %%status0
706
707 mov al, bl ; get next char
708 and al, 0fh
709 cmp al, 10
710 jae short %%hex ; yasm BUG! It sometimes generate a near jump here. YASMCHECK!
711 add al, '0'
712 jmp short %%print
713%%hex:
714 add al, 'a' - 10
715%%print:
716 mov dx, VBOX_UART_BASE
717 out dx, al
718
719 pop rbx
720 pop rax
721 pop rdx
722%endmacro
723
724%macro COM_S_DIGIT_REG 1
725%ifdef RT_ARCH_AMD64
726 COM64_S_DIGIT_REG %1
727%else
728 COM32_S_DIGIT_REG %1
729%endif
730%endmacro
731
732
733;;
734; Loops for a while.
735; ecx is trashed.
736%macro LOOP_A_WHILE 0
737
738 xor ecx, ecx
739 dec ecx
740 shr ecx, 1
741%%looplabel:
742 nop
743 nop
744 nop
745 dec ecx
746 jnz short %%looplabel
747
748%endmacro
749
750
751;;
752; Loops for a short while.
753; ecx is trashed.
754%macro LOOP_SHORT_WHILE 0
755
756 xor ecx, ecx
757 dec ecx
758 shr ecx, 4
759%%looplabel:
760 nop
761 nop
762 dec ecx
763 jnz short %%looplabel
764
765%endmacro
766
767%endif
768
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