VirtualBox

source: vbox/trunk/include/iprt/asmdefs.mac@ 6981

Last change on this file since 6981 was 6069, checked in by vboxsync, 17 years ago

AMD64 -> RT_ARCH_AMD64; X86 -> RT_ARCH_X86.

  • Property eol-style set to native
File size: 13.9 KB
Line 
1;; @file
2; innotek Portable Runtime - Global YASM/NASM macros
3;
4
5;
6; Copyright (C) 2006-2007 innotek GmbH
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 ___iprt_asmdefs_mac
27%define ___iprt_asmdefs_mac
28
29;;
30; Make the mask for the given bit.
31%define RT_BIT(bit) (1 << bit)
32
33;;
34; Align code, pad with INT3.
35%define ALIGNCODE(alignment) align alignment, db 0cch
36
37;;
38; Align data, pad with ZEROs.
39%define ALIGNDATA(alignment) align alignment, db 0
40
41;;
42; Align BSS, pad with ZEROs.
43%define ALIGNBSS(alignment) align alignment, resb 1
44
45;;
46; NAME_OVERLOAD can be defined by a .asm module to modify all the
47; names created using the name macros in this files.
48; This is handy when you've got some kind of template code.
49%ifndef NAME_OVERLOAD
50 %define NAME_OVERLOAD(name) name
51%endif
52
53;;
54; Mangles the given name so it can be referenced using DECLASM() in the
55; C/C++ world.
56%ifdef RT_ARCH_X86
57 %ifdef RT_OS_DARWIN
58 %define NAME(name) _ %+ NAME_OVERLOAD(name)
59 %endif
60 %ifdef RT_OS_OS2
61 %define NAME(name) _ %+ NAME_OVERLOAD(name)
62 %endif
63 %ifdef RT_OS_WINDOWS
64 %define NAME(name) _ %+ NAME_OVERLOAD(name)
65 %endif
66%endif
67%ifndef NAME
68 %define NAME(name) NAME_OVERLOAD(name)
69%endif
70
71;;
72; Mangles the given C name so it will _import_ the right symbol.
73%ifdef ASM_FORMAT_PE
74%define IMPNAME(name) __imp_ %+ NAME(name)
75%else
76%define IMPNAME(name) NAME(name)
77%endif
78
79;;
80; Gets the pointer to an imported object.
81%ifdef ASM_FORMAT_PE
82 %ifdef RT_ARCH_AMD64
83 %define IMP(name) qword [IMPNAME(name) wrt rip]
84 %else
85 %define IMP(name) dword [IMPNAME(name)]
86 %endif
87%else
88 %define IMP(name) IMPNAME(name)
89%endif
90
91
92
93;;
94; Global marker which is DECLASM() compatible.
95%macro GLOBALNAME 1,
96global NAME(%1)
97NAME(%1):
98%endmacro
99
100;;
101; Global exported marker which is DECLASM() compatible.
102%macro EXPORTEDNAME 1,
103 %ifdef __NASM__
104 %ifdef ASM_FORMAT_PE
105 export %1=NAME(%1)
106 %endif
107 %ifdef ASM_FORMAT_OMF
108 export NAME(%1) NAME(%1)
109 %endif
110%endif
111GLOBALNAME %1
112%endmacro
113
114;;
115; Begins a C callable procedure.
116%macro BEGINPROC 1
117GLOBALNAME %1
118%endmacro
119
120;;
121; Begins a C callable exported procedure.
122%macro BEGINPROC_EXPORTED 1
123EXPORTEDNAME %1
124%endmacro
125
126;;
127; Ends a C callable procedure.
128%macro ENDPROC 1
129GLOBALNAME %1_EndProc
130 db 0xCC, 0xCC, 0xCC, 0xCC
131%endmacro
132
133
134;
135; Do OMF and Mach-O/Yasm segment definitions
136;
137; Both format requires this to get the segment order right, in the Mach-O/Yasm case
138; it's only to make sure the .bss section ends up last (it's not declared here).
139;
140%ifdef ASM_FORMAT_OMF
141
142 ; 16-bit segments first (OMF / OS/2 specific).
143 %ifdef RT_INCL_16BIT_SEGMENTS
144 segment DATA16 public CLASS=FAR_DATA align=16 use16
145 segment DATA16_INIT public CLASS=FAR_DATA align=16 use16
146 group DGROUP16 DATA16 DATA16_INIT
147
148 ;;
149 ; Begins 16-bit data
150 %macro BEGINDATA16 0
151 segment DATA16
152 %endmacro
153
154 ;;
155 ; Begins 16-bit init data
156 %macro BEGINDATA16INIT 0
157 segment DATA16_INIT
158 %endmacro
159
160 segment CODE16 public CLASS=FAR_CODE align=16 use16
161 segment CODE16_INIT public CLASS=FAR_CODE align=16 use16
162 group CGROUP16 CODE16 CODE16_INIT
163
164 ;;
165 ; Begins 16-bit code
166 %macro BEGINCODE16 0
167 segment CODE16
168 %endmacro
169
170 ;;
171 ; Begins 16-bit init code
172 %macro BEGINCODE16INIT 0
173 segment CODE16_INIT
174 %endmacro
175
176 %endif
177
178 ; 32-bit segments.
179 segment TEXT32 public CLASS=CODE align=16 use32 flat
180 segment DATA32 public CLASS=DATA align=16 use32 flat
181 segment BSS32 public CLASS=BSS align=16 use32 flat
182
183 ; Make the TEXT32 segment default.
184 segment TEXT32
185%endif
186
187%ifdef ASM_FORMAT_MACHO
188 %ifdef __YASM__
189 [section .text]
190 [section .data]
191 %endif
192%endif
193
194
195;;
196; Begins code
197%ifdef ASM_FORMAT_OMF
198 %macro BEGINCODE 0
199 segment TEXT32
200 %endmacro
201%else
202%macro BEGINCODE 0
203[section .text]
204%endmacro
205%endif
206
207;;
208; Begins constant (read-only) data
209;
210; @remarks This is mapped to the CODE section/segment when there isn't
211; any dedicated const section/segment. (There is code that
212; assumes this, so don't try change it.)
213%ifdef ASM_FORMAT_OMF
214 %macro BEGINCONST 0
215 segment TEXT32
216 %endmacro
217%else
218 %macro BEGINCONST 0
219 %ifdef ASM_FORMAT_MACHO ;; @todo check the other guys too.
220 [section .rodata]
221 %else
222 [section .text]
223 %endif
224 %endmacro
225%endif
226
227;;
228; Begins initialized data
229%ifdef ASM_FORMAT_OMF
230 %macro BEGINDATA 0
231 segment DATA32
232 %endmacro
233%else
234%macro BEGINDATA 0
235[section .data]
236%endmacro
237%endif
238
239;;
240; Begins uninitialized data
241%ifdef ASM_FORMAT_OMF
242 %macro BEGINBSS 0
243 segment BSS32
244 %endmacro
245%else
246%macro BEGINBSS 0
247[section .bss]
248%endmacro
249%endif
250
251
252
253;; @def ARCH_BITS
254; Defines the bit count of the current context.
255%ifndef ARCH_BITS
256 %ifdef RT_ARCH_AMD64
257 %define ARCH_BITS 64
258 %else
259 %define ARCH_BITS 32
260 %endif
261%endif
262
263;; @def HC_ARCH_BITS
264; Defines the host architechture bit count.
265%ifndef HC_ARCH_BITS
266 %ifndef IN_GC
267 %define HC_ARCH_BITS ARCH_BITS
268 %else
269 %define HC_ARCH_BITS 32
270 %endif
271%endif
272
273;; @def R3_ARCH_BITS
274; Defines the host ring-3 architechture bit count.
275%ifndef R3_ARCH_BITS
276 %ifdef IN_RING3
277 %define R3_ARCH_BITS ARCH_BITS
278 %else
279 %define R3_ARCH_BITS HC_ARCH_BITS
280 %endif
281%endif
282
283;; @def R0_ARCH_BITS
284; Defines the host ring-0 architechture bit count.
285%ifndef R0_ARCH_BITS
286 %ifdef IN_RING0
287 %define R0_ARCH_BITS ARCH_BITS
288 %else
289 %define R0_ARCH_BITS HC_ARCH_BITS
290 %endif
291%endif
292
293;; @def GC_ARCH_BITS
294; Defines the guest architechture bit count.
295%ifndef GC_ARCH_BITS
296 %ifdef IN_GC
297 %define GC_ARCH_BITS ARCH_BITS
298 %else
299 %define GC_ARCH_BITS 32
300 %endif
301%endif
302
303
304
305;; @def RTHCPTR_DEF
306; The pesudo-instruction used to declare an initialized pointer variable in the host context.
307%if HC_ARCH_BITS == 64
308 %define RTHCPTR_DEF dq
309%else
310 %define RTHCPTR_DEF dd
311%endif
312
313;; @def RTHCPTR_RES
314; The pesudo-instruction used to declare (=reserve space for) an uninitialized pointer
315; variable of the host context.
316%if HC_ARCH_BITS == 64
317 %define RTHCPTR_RES resq
318%else
319 %define RTHCPTR_RES resd
320%endif
321
322;; @def RTHCPTR_PRE
323; The memory operand prefix used for a pointer in the host context.
324%if HC_ARCH_BITS == 64
325 %define RTHCPTR_PRE qword
326%else
327 %define RTHCPTR_PRE dword
328%endif
329
330;; @def RTHCPTR_CB
331; The size in bytes of a pointer in the host context.
332%if HC_ARCH_BITS == 64
333 %define RTHCPTR_CB 8
334%else
335 %define RTHCPTR_CB 4
336%endif
337
338
339
340;; @def RTR0PTR_DEF
341; The pesudo-instruction used to declare an initialized pointer variable in the ring-0 host context.
342%if R0_ARCH_BITS == 64
343 %define RTR0PTR_DEF dq
344%else
345 %define RTR0PTR_DEF dd
346%endif
347
348;; @def RTR0PTR_RES
349; The pesudo-instruction used to declare (=reserve space for) an uninitialized pointer
350; variable of the ring-0 host context.
351%if R0_ARCH_BITS == 64
352 %define RTR0PTR_RES resq
353%else
354 %define RTR0PTR_RES resd
355%endif
356
357;; @def RTR0PTR_PRE
358; The memory operand prefix used for a pointer in the ring-0 host context.
359%if R0_ARCH_BITS == 64
360 %define RTR0PTR_PRE qword
361%else
362 %define RTR0PTR_PRE dword
363%endif
364
365;; @def RTR0PTR_CB
366; The size in bytes of a pointer in the ring-0 host context.
367%if R0_ARCH_BITS == 64
368 %define RTR0PTR_CB 8
369%else
370 %define RTR0PTR_CB 4
371%endif
372
373
374
375;; @def RTR3PTR_DEF
376; The pesudo-instruction used to declare an initialized pointer variable in the ring-3 host context.
377%if R3_ARCH_BITS == 64
378 %define RTR3PTR_DEF dq
379%else
380 %define RTR3PTR_DEF dd
381%endif
382
383;; @def RTR3PTR_RES
384; The pesudo-instruction used to declare (=reserve space for) an uninitialized pointer
385; variable of the ring-3 host context.
386%if R3_ARCH_BITS == 64
387 %define RTR3PTR_RES resq
388%else
389 %define RTR3PTR_RES resd
390%endif
391
392;; @def RTR3PTR_PRE
393; The memory operand prefix used for a pointer in the ring-3 host context.
394%if R3_ARCH_BITS == 64
395 %define RTR3PTR_PRE qword
396%else
397 %define RTR3PTR_PRE dword
398%endif
399
400;; @def RTR3PTR_CB
401; The size in bytes of a pointer in the ring-3 host context.
402%if R3_ARCH_BITS == 64
403 %define RTR3PTR_CB 8
404%else
405 %define RTR3PTR_CB 4
406%endif
407
408
409
410;; @def RTGCPTR_DEF
411; The pesudo-instruction used to declare an initialized pointer variable in the guest context.
412%if GC_ARCH_BITS == 64
413 %define RTGCPTR_DEF dq
414%else
415 %define RTGCPTR_DEF dd
416%endif
417
418;; @def RTGCPTR_RES
419; The pesudo-instruction used to declare (=reserve space for) an uninitialized pointer
420; variable of the guest context.
421%if GC_ARCH_BITS == 64
422 %define RTGCPTR_RES resq
423%else
424 %define RTGCPTR_RES resd
425%endif
426
427;; @def RTGCPTR_PRE
428; The memory operand prefix used for a pointer in the guest context.
429%if GC_ARCH_BITS == 64
430 %define RTGCPTR_PRE qword
431%else
432 %define RTGCPTR_PRE dword
433%endif
434
435;; @def RTGCPTR_CB
436; The size in bytes of a pointer in the guest context.
437%if GC_ARCH_BITS == 64
438 %define RTGCPTR_CB 8
439%else
440 %define RTGCPTR_CB 4
441%endif
442
443
444
445;; @def RT_CCPTR_DEF
446; The pesudo-instruction used to declare an initialized pointer variable in the current context.
447
448;; @def RT_CCPTR_RES
449; The pesudo-instruction used to declare (=reserve space for) an uninitialized pointer
450; variable of the current context.
451
452;; @def RT_CCPTR_PRE
453; The memory operand prefix used for a pointer in the current context.
454
455;; @def RT_CCPTR_CB
456; The size in bytes of a pointer in the current context.
457
458%ifdef IN_GC
459 %define RTCCPTR_DEF RTGCPTR_DEF
460 %define RTCCPTR_RES RTGCPTR_RES
461 %define RTCCPTR_PRE RTGCPTR_PRE
462 %define RTCCPTR_CB RTGCPTR_CB
463%else
464 %ifdef IN_RING0
465 %define RTCCPTR_DEF RTR0PTR_DEF
466 %define RTCCPTR_RES RTR0PTR_RES
467 %define RTCCPTR_PRE RTR0PTR_PRE
468 %define RTCCPTR_CB RTR0PTR_CB
469 %else
470 %define RTCCPTR_DEF RTR3PTR_DEF
471 %define RTCCPTR_RES RTR3PTR_RES
472 %define RTCCPTR_PRE RTR3PTR_PRE
473 %define RTCCPTR_CB RTR3PTR_CB
474 %endif
475%endif
476
477
478
479;; @def RTHCPHYS_DEF
480; The pesudo-instruction used to declare an initialized host physical address.
481%define RTHCPHYS_DEF dq
482
483;; @def RTHCPTR_RES
484; The pesudo-instruction used to declare (=reserve space for) an uninitialized
485; host physical address variable
486%define RTHCPHYS_RES resq
487
488;; @def RTHCPTR_PRE
489; The memory operand prefix used for a host physical address.
490%define RTHCPHYS_PRE qword
491
492;; @def RTHCPHYS_CB
493; The size in bytes of a host physical address.
494%define RTHCPHYS_CB 8
495
496
497
498;; @def RTGCPHYS_DEF
499; The pesudo-instruction used to declare an initialized guest physical address.
500%define RTGCPHYS_DEF dd
501
502;; @def RTGCPTR_RES
503; The pesudo-instruction used to declare (=reserve space for) an uninitialized
504; guest physical address variable
505%define RTGCPHYS_RES resd
506
507;; @def RTGCPTR_PRE
508; The memory operand prefix used for a guest physical address.
509%define RTGCPHYS_PRE dword
510
511;; @def RTGCPHYS_CB
512; The size in bytes of a guest physical address.
513%define RTGCPHYS_CB 4
514
515
516
517;;
518; The size of the long double C/C++ type.
519; On 32-bit Darwin this is 16 bytes, on L4, Linux, OS/2 and Windows
520; it's 12 bytes.
521; @todo figure out what 64-bit Windows does (I don't recall right now).
522%ifdef RT_ARCH_X86
523 %ifdef RT_OS_DARWIN
524 %define RTLRD_CB 16
525 %else
526 %define RTLRD_CB 12
527 %endif
528%else
529 %define RTLRD_CB 16
530%endif
531
532
533
534;; @def ASM_CALL64_GCC
535; Indicates that we're using the GCC 64-bit calling convention.
536; @see @ref sec_vboxrem_amd64_compare (in VBoxREMWrapper.cpp) for an ABI description.
537
538;; @def ASM_CALL64_MSC
539; Indicates that we're using the Microsoft 64-bit calling convention (fastcall on steroids).
540; @see @ref sec_vboxrem_amd64_compare (in VBoxREMWrapper.cpp) for an ABI description.
541
542; Note: On X86 we're using cdecl unconditionally. There is not yet any common
543; calling convention on AMD64, that's why we need to support two different ones.)
544
545%ifdef RT_ARCH_AMD64
546 %ifndef ASM_CALL64_GCC
547 %ifndef ASM_CALL64_MSC
548 ; define it based on the object format.
549 %ifdef ASM_FORMAT_PE
550 %define ASM_CALL64_MSC
551 %else
552 %define ASM_CALL64_GCC
553 %endif
554 %endif
555 %else
556 ; sanity check.
557 %ifdef ASM_CALL64_MSC
558 %error "Only one of the ASM_CALL64_* defines should be defined!"
559 %endif
560 %endif
561%endif
562
563
564;; @def RT_NOCRT
565; Symbol name wrapper for the No-CRT bits.
566;
567; In order to coexist in the same process as other CRTs, we need to
568; decorate the symbols such that they don't conflict the ones in the
569; other CRTs. The result of such conflicts / duplicate symbols can
570; confuse the dynamic loader on unix like systems.
571;
572; @remark Always feed the name to this macro first and then pass the result
573; on to the next *NAME* macro.
574;
575%ifndef RT_WITHOUT_NOCRT_WRAPPERS
576 %define RT_NOCRT(name) nocrt_ %+ name
577%else
578 %define RT_NOCRT(name) name
579%endif
580
581
582
583;; @def xS
584; The stack unit size / The register unit size.
585
586;; @def xSP
587; The stack pointer register (RSP or ESP).
588
589;; @def xBP
590; The base pointer register (RBP or ESP).
591
592;; @def xAX
593; RAX or EAX depending on context.
594
595;; @def xBX
596; RBX or EBX depending on context.
597
598;; @def xCX
599; RCX or ECX depending on context.
600
601;; @def xDX
602; RDX or EDX depending on context.
603
604;; @def xDI
605; RDI or EDI depending on context.
606
607;; @def xSI
608; RSI or ESI depending on context.
609
610%ifdef RT_ARCH_AMD64
611 %define xS 8
612 %define xSP rsp
613 %define xBP rbp
614 %define xAX rax
615 %define xBX rbx
616 %define xCX rcx
617 %define xDX rdx
618 %define xDI rdi
619 %define xSI rsi
620%else
621 %define xS 4
622 %define xSP esp
623 %define xBP ebp
624 %define xAX eax
625 %define xBX ebx
626 %define xCX ecx
627 %define xDX edx
628 %define xDI edi
629 %define xSI esi
630%endif
631
632%endif
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