VirtualBox

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

Last change on this file since 475 was 74, checked in by vboxsync, 18 years ago

64-bit/32-bit register macros. RTGCPHYS and RTHCPHYS macros.

File size: 12.7 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 callabke procedure.
118%macro ENDPROC 1
119GLOBALNAME %1_EndProc
120 db 0xCC, 0xCC, 0xCC, 0xCC
121%endmacro
122
123
124;;
125; Begins code
126%ifdef ASM_FORMAT_OMF
127 %macro BEGINCODE 0
128 %ifndef _DONE_BEGINCODE
129 %define _DONE_BEGINCODE 1
130 segment TEXT32 public CLASS=CODE align=16 use32 flat
131 %else
132 segment TEXT32
133 %endif
134 %endmacro
135%else
136%macro BEGINCODE 0
137[section .text]
138%endmacro
139%endif
140
141
142;;
143; Begins initialized data
144%ifdef ASM_FORMAT_OMF
145 %macro BEGINDATA 0
146 %ifndef _DONE_BEGINDATA
147 %define _DONE_BEGINDATA 1
148 segment DATA32 public CLASS=DATA align=16 use32 flat
149 %else
150 segment DATA32
151 %endif
152 %endmacro
153%else
154%macro BEGINDATA 0
155[section .data]
156%endmacro
157%endif
158
159;;
160; Begins uninitialized data
161%ifdef ASM_FORMAT_OMF
162 %macro BEGINBSS 0
163 %ifndef _DONE_BEGINBSS
164 %define _DONE_BEGINBSS
165 segment BSS32 public CLASS=BSS align=16 use32 flat
166 %else
167 segment BSS32
168 %endif
169 %endmacro
170%else
171%macro BEGINBSS 0
172[section .bss]
173%endmacro
174%endif
175
176
177
178;; @def ARCH_BITS
179; Defines the bit count of the current context.
180%ifndef ARCH_BITS
181 %ifdef __AMD64__
182 %define ARCH_BITS 64
183 %else
184 %define ARCH_BITS 32
185 %endif
186%endif
187
188;; @def HC_ARCH_BITS
189; Defines the host architechture bit count.
190%ifndef HC_ARCH_BITS
191 %ifndef IN_GC
192 %define HC_ARCH_BITS ARCH_BITS
193 %else
194 %define HC_ARCH_BITS 32
195 %endif
196%endif
197
198;; @def R3_ARCH_BITS
199; Defines the host ring-3 architechture bit count.
200%ifndef R3_ARCH_BITS
201 %ifdef IN_RING3
202 %define R3_ARCH_BITS ARCH_BITS
203 %else
204 %define R3_ARCH_BITS HC_ARCH_BITS
205 %endif
206%endif
207
208;; @def R0_ARCH_BITS
209; Defines the host ring-0 architechture bit count.
210%ifndef R0_ARCH_BITS
211 %ifdef IN_RING0
212 %define R0_ARCH_BITS ARCH_BITS
213 %else
214 %define R0_ARCH_BITS HC_ARCH_BITS
215 %endif
216%endif
217
218;; @def GC_ARCH_BITS
219; Defines the guest architechture bit count.
220%ifndef GC_ARCH_BITS
221 %ifdef IN_GC
222 %define GC_ARCH_BITS ARCH_BITS
223 %else
224 %define GC_ARCH_BITS 32
225 %endif
226%endif
227
228
229
230;; @def RTHCPTR_DEF
231; The pesudo-instruction used to declare an initialized pointer variable in the host context.
232%if HC_ARCH_BITS == 64
233 %define RTHCPTR_DEF dq
234%else
235 %define RTHCPTR_DEF dd
236%endif
237
238;; @def RTHCPTR_RES
239; The pesudo-instruction used to declare (=reserve space for) an uninitialized pointer
240; variable of the host context.
241%if HC_ARCH_BITS == 64
242 %define RTHCPTR_RES resq
243%else
244 %define RTHCPTR_RES resd
245%endif
246
247;; @def RTHCPTR_PRE
248; The memory operand prefix used for a pointer in the host context.
249%if HC_ARCH_BITS == 64
250 %define RTHCPTR_PRE qword
251%else
252 %define RTHCPTR_PRE dword
253%endif
254
255;; @def RTHCPTR_CB
256; The size in bytes of a pointer in the host context.
257%if HC_ARCH_BITS == 64
258 %define RTHCPTR_CB 8
259%else
260 %define RTHCPTR_CB 4
261%endif
262
263
264
265;; @def RTR0PTR_DEF
266; The pesudo-instruction used to declare an initialized pointer variable in the ring-0 host context.
267%if R0_ARCH_BITS == 64
268 %define RTR0PTR_DEF dq
269%else
270 %define RTR0PTR_DEF dd
271%endif
272
273;; @def RTR0PTR_RES
274; The pesudo-instruction used to declare (=reserve space for) an uninitialized pointer
275; variable of the ring-0 host context.
276%if R0_ARCH_BITS == 64
277 %define RTR0PTR_RES resq
278%else
279 %define RTR0PTR_RES resd
280%endif
281
282;; @def RTR0PTR_PRE
283; The memory operand prefix used for a pointer in the ring-0 host context.
284%if R0_ARCH_BITS == 64
285 %define RTR0PTR_PRE qword
286%else
287 %define RTR0PTR_PRE dword
288%endif
289
290;; @def RTR0PTR_CB
291; The size in bytes of a pointer in the ring-0 host context.
292%if R0_ARCH_BITS == 64
293 %define RTR0PTR_CB 8
294%else
295 %define RTR0PTR_CB 4
296%endif
297
298
299
300;; @def RTR3PTR_DEF
301; The pesudo-instruction used to declare an initialized pointer variable in the ring-3 host context.
302%if R3_ARCH_BITS == 64
303 %define RTR3PTR_DEF dq
304%else
305 %define RTR3PTR_DEF dd
306%endif
307
308;; @def RTR3PTR_RES
309; The pesudo-instruction used to declare (=reserve space for) an uninitialized pointer
310; variable of the ring-3 host context.
311%if R3_ARCH_BITS == 64
312 %define RTR3PTR_RES resq
313%else
314 %define RTR3PTR_RES resd
315%endif
316
317;; @def RTR3PTR_PRE
318; The memory operand prefix used for a pointer in the ring-3 host context.
319%if R3_ARCH_BITS == 64
320 %define RTR3PTR_PRE qword
321%else
322 %define RTR3PTR_PRE dword
323%endif
324
325;; @def RTR3PTR_CB
326; The size in bytes of a pointer in the ring-3 host context.
327%if R3_ARCH_BITS == 64
328 %define RTR3PTR_CB 8
329%else
330 %define RTR3PTR_CB 4
331%endif
332
333
334
335;; @def RTGCPTR_DEF
336; The pesudo-instruction used to declare an initialized pointer variable in the guest context.
337%if GC_ARCH_BITS == 64
338 %define RTGCPTR_DEF dq
339%else
340 %define RTGCPTR_DEF dd
341%endif
342
343;; @def RTGCPTR_RES
344; The pesudo-instruction used to declare (=reserve space for) an uninitialized pointer
345; variable of the guest context.
346%if GC_ARCH_BITS == 64
347 %define RTGCPTR_RES resq
348%else
349 %define RTGCPTR_RES resd
350%endif
351
352;; @def RTGCPTR_PRE
353; The memory operand prefix used for a pointer in the guest context.
354%if GC_ARCH_BITS == 64
355 %define RTGCPTR_PRE qword
356%else
357 %define RTGCPTR_PRE dword
358%endif
359
360;; @def RTGCPTR_CB
361; The size in bytes of a pointer in the guest context.
362%if GC_ARCH_BITS == 64
363 %define RTGCPTR_CB 8
364%else
365 %define RTGCPTR_CB 4
366%endif
367
368
369
370;; @def RT_CCPTR_DEF
371; The pesudo-instruction used to declare an initialized pointer variable in the current context.
372
373;; @def RT_CCPTR_RES
374; The pesudo-instruction used to declare (=reserve space for) an uninitialized pointer
375; variable of the current context.
376
377;; @def RT_CCPTR_PRE
378; The memory operand prefix used for a pointer in the current context.
379
380;; @def RT_CCPTR_CB
381; The size in bytes of a pointer in the current context.
382
383%ifdef IN_GC
384 %define RTCCPTR_DEF RTGCPTR_DEF
385 %define RTCCPTR_RES RTGCPTR_RES
386 %define RTCCPTR_PRE RTGCPTR_PRE
387 %define RTCCPTR_CB RTGCPTR_CB
388%else
389 %ifdef IN_RING0
390 %define RTCCPTR_DEF RTR0PTR_DEF
391 %define RTCCPTR_RES RTR0PTR_RES
392 %define RTCCPTR_PRE RTR0PTR_PRE
393 %define RTCCPTR_CB RTR0PTR_CB
394 %else
395 %define RTCCPTR_DEF RTR3PTR_DEF
396 %define RTCCPTR_RES RTR3PTR_RES
397 %define RTCCPTR_PRE RTR3PTR_PRE
398 %define RTCCPTR_CB RTR3PTR_CB
399 %endif
400%endif
401
402
403
404;; @def RTHCPHYS_DEF
405; The pesudo-instruction used to declare an initialized host physical address.
406%define RTHCPHYS_DEF dq
407
408;; @def RTHCPTR_RES
409; The pesudo-instruction used to declare (=reserve space for) an uninitialized
410; host physical address variable
411%define RTHCPHYS_RES resq
412
413;; @def RTHCPTR_PRE
414; The memory operand prefix used for a host physical address.
415%define RTHCPHYS_PRE qword
416
417;; @def RTHCPHYS_CB
418; The size in bytes of a host physical address.
419%define RTHCPHYS_CB 8
420
421
422
423;; @def RTGCPHYS_DEF
424; The pesudo-instruction used to declare an initialized guest physical address.
425%define RTGCPHYS_DEF dd
426
427;; @def RTGCPTR_RES
428; The pesudo-instruction used to declare (=reserve space for) an uninitialized
429; guest physical address variable
430%define RTGCPHYS_RES resd
431
432;; @def RTGCPTR_PRE
433; The memory operand prefix used for a guest physical address.
434%define RTGCPHYS_PRE dword
435
436;; @def RTGCPHYS_CB
437; The size in bytes of a guest physical address.
438%define RTGCPHYS_CB 4
439
440
441
442;;
443; The size of the long double C/C++ type.
444; On 32-bit Darwin this is 16 bytes, on L4, Linux, OS/2 and Windows
445; it's 12 bytes.
446; @todo figure out what 64-bit Windows does (I don't recall right now).
447%ifdef __X86__
448 %ifdef __DARWIN__
449 %define RTLRD_CB 16
450 %else
451 %define RTLRD_CB 12
452 %endif
453%else
454 %define RTLRD_CB 16
455%endif
456
457
458
459;; @def ASM_CALL64_GCC
460; Indicates that we're using the GCC 64-bit calling convention.
461; @see @ref sec_vboxrem_amd64_compare (in VBoxREMWrapper.cpp) for an ABI description.
462
463;; @def ASM_CALL64_MSC
464; Indicates that we're using the Microsoft 64-bit calling convention (fastcall on steroids).
465; @see @ref sec_vboxrem_amd64_compare (in VBoxREMWrapper.cpp) for an ABI description.
466
467; Note: On X86 we're using cdecl unconditionally. There is not yet any common
468; calling convention on AMD64, that's why we need to support two different ones.)
469
470%ifdef __AMD64__
471 %ifndef ASM_CALL64_GCC
472 %ifndef ASM_CALL64_MSC
473 ; define it based on the object format.
474 %ifdef ASM_FORMAT_PE
475 %define ASM_CALL64_MSC
476 %else
477 %define ASM_CALL64_GCC
478 %endif
479 %endif
480 %else
481 ; sanity check.
482 %ifdef ASM_CALL64_MSC
483 %error "Only one of the ASM_CALL64_* defines should be defined!"
484 %endif
485 %endif
486%endif
487
488
489;; @def RT_NOCRT
490; Symbol name wrapper for the No-CRT bits.
491;
492; In order to coexist in the same process as other CRTs, we need to
493; decorate the symbols such that they don't conflict the ones in the
494; other CRTs. The result of such conflicts / duplicate symbols can
495; confuse the dynamic loader on unix like systems.
496;
497; @remark Always feed the name to this macro first and then pass the result
498; on to the next *NAME* macro.
499;
500%ifndef RT_WITHOUT_NOCRT_WRAPPERS
501 %define RT_NOCRT(name) nocrt_ %+ name
502%else
503 %define RT_NOCRT(name) name
504%endif
505
506
507
508;; @def xS
509; The stack unit size / The register unit size.
510
511;; @def xSP
512; The stack pointer register (RSP or ESP).
513
514;; @def xBP
515; The base pointer register (RBP or ESP).
516
517;; @def xAX
518; RAX or EAX depending on context.
519
520;; @def xBX
521; RBX or EBX depending on context.
522
523;; @def xCX
524; RCX or ECX depending on context.
525
526;; @def xDX
527; RDX or EDX depending on context.
528
529;; @def xDI
530; RDI or EDI depending on context.
531
532;; @def xSI
533; RSI or ESI depending on context.
534
535%ifdef __AMD64__
536 %define xS 8
537 %define xSP rsp
538 %define xBP rbp
539 %define xAX rax
540 %define xBX rbx
541 %define xCX rcx
542 %define xDX rdx
543 %define xDI rdi
544 %define xSI rsi
545%else
546 %define xS 4
547 %define xSP esp
548 %define xBP ebp
549 %define xAX eax
550 %define xBX ebx
551 %define xCX ecx
552 %define xDX edx
553 %define xDI edi
554 %define xSI esi
555%endif
556
557%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