VirtualBox

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

Last change on this file since 2402 was 1401, checked in by vboxsync, 18 years ago

Mach-O/Yasm .bss section fix (it must be last, so declare everything else up front).

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