VirtualBox

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

Last change on this file since 23746 was 20544, checked in by vboxsync, 16 years ago

VBox/asmdefs.mac: Set VBOX_STRICT for DEBUG builds.

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