1/* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Kernel 4 * FILE: include/asm/asm.inc 5 * PURPOSE: ASM macros for GAS and MASM/ML64 6 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) 7 */ 8 9#ifndef __ASM_INC__ 10#define __ASM_INC__ 11 12/* Common definitions for FPO macro 13 see http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */ 14#define FRAME_FPO 0 15#define FRAME_TRAP 1 16#define FRAME_TSS 2 17#define FRAME_NONFPO 3 18 19#ifdef _USE_ML 20 21/* Allow ".name" identifiers */ 22OPTION DOTNAME 23 24#ifdef _M_IX86 25.686P 26.XMM 27.MODEL FLAT 28ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING 29#endif 30 31/* Explicit radix in MASM syntax */ 32#define BIN(x) x##y 33#define OCT(x) x##q 34#define DEC(x) x##t 35#define HEX(x) 0##x##h 36 37/* Macro values need not be marked */ 38#define VAL(x) x 39 40/* MASM/ML doesn't want explicit [rip] addressing */ 41rip = 0 42 43/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */ 44#define MACRO(name, ...) name MACRO __VA_ARGS__ 45 46/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */ 47.PROC MACRO name 48__current_function_name EQU %name 49#ifdef _M_IX86 50 %name PROC 51#else 52 %name PROC FRAME 53#endif 54ENDM 55#define FUNC .PROC 56 57/* ... and .ENDP, replacing ENDP */ 58.ENDP MACRO 59 %__current_function_name ENDP 60ENDM 61#define ENDFUNC .ENDP 62 63/* Global labels need an extra colon */ 64GLOBAL_LABEL MACRO label 65 %label:: 66ENDM 67 68/* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx 69 and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */ 70FPO MACRO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame 71 .FPO (cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame) 72ENDM 73 74/* MASM doesn't have an ASCII macro */ 75.ASCII MACRO text:VARARG 76 DB text 77ENDM 78.ascii MACRO text:VARARG 79 DB text 80ENDM 81 82/* MASM doesn't have an ASCIZ macro */ 83.ASCIZ MACRO text:VARARG 84 DB text 85 DB 0 86ENDM 87.asciz MACRO text:VARARG 88 DB text 89 DB 0 90ENDM 91 92.code64 MACRO 93 .code 94ENDM 95 96.code32 MACRO 97 .code 98 .586P 99ENDM 100 101.code16 MACRO 102 ASSUME nothing 103 .text SEGMENT use16 PUBLIC 'CODE' 104 .586P 105ENDM 106 107.endcode16 MACRO 108 .text ENDS 109ENDM 110 111.bss MACRO 112 .DATA? 113 ASSUME nothing 114ENDM 115 116//.text MACRO 117//ENDM 118 119.align MACRO alignment 120 ALIGN alignment 121ENDM 122 123.byte MACRO args:VARARG 124 db args 125ENDM 126 127.short MACRO args:VARARG 128 dw args 129ENDM 130 131.word MACRO args:VARARG 132 dw args 133ENDM 134 135.long MACRO args:VARARG 136 dd args 137ENDM 138 139.quad MACRO args:VARARG 140 dq args 141ENDM 142 143.double MACRO args:VARARG 144 real8 args 145ENDM 146 147.org MACRO value 148 ORG value 149ENDM 150 151.fill MACRO count, size, value 152 REPEAT count 153 if (size EQ 1) 154 DB value 155 elseif (size EQ 2) 156 DW value 157 elseif (size EQ 4) 158 DD value 159 endif 160 ENDM 161ENDM 162 163.skip MACRO size, fill:=<0> 164 DB size DUP (fill) 165ENDM 166 167.space MACRO size, fill:=<0> 168 .skip size, fill 169ENDM 170 171ljmp MACRO segment, offset 172 DB 0EAh 173 DD offset 174 DW segment 175ENDM 176 177ljmp16 MACRO segment, offset 178 DB 0EAh 179 DW offset 180 DW segment 181ENDM 182 183data32 MACRO opcode:VARARG 184 DB 66h 185 opcode 186ENDM 187 188UNIMPLEMENTED MACRO name 189ENDM 190 191absolute MACRO address 192 __absolute__address__ = address 193ENDM 194 195resb MACRO name, size 196 name = __absolute__address__ 197 __absolute__address__ = __absolute__address__ + size 198ENDM 199 200/* We need this to distinguish repeat from macros */ 201#define ENDR ENDM 202 203#define CR 13 204#define LF 10 205#define NUL 0 206 207/* For compatibility with GAS */ 208CFI_STARTPROC MACRO start 209ENDM 210CFI_ENDPROC MACRO 211ENDM 212CFI_DEF_CFA MACRO reg:REQ, offset:REQ 213ENDM 214CFI_DEF_CFA_OFFSET MACRO offset:REQ 215ENDM 216CFI_DEF_CFA_REGISTER MACRO reg:REQ 217ENDM 218CFI_ADJUST_CFA_OFFSET MACRO offset:REQ 219ENDM 220CFI_OFFSET MACRO reg:REQ, offset:REQ 221ENDM 222CFI_REGISTER MACRO reg1:REQ, reg2:REQ 223ENDM 224CFI_REL_OFFSET MACRO reg:REQ, offset:REQ 225ENDM 226CFI_SAME_VALUE MACRO reg:REQ 227ENDM 228 229#else /***********************************************************************/ 230 231/* Force intel syntax */ 232.intel_syntax noprefix 233 234.altmacro 235 236/* Explicit radix in GAS syntax */ 237#define BIN(x) 0b##x 238#define OCT(x) 0##x 239#define DEC(x) x 240#define HEX(x) 0x##x 241 242/* Macro values need to be marked */ 243#define VAL(x) \x 244 245/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */ 246#define MACRO(...) .macro __VA_ARGS__ 247#define ENDM .endm 248 249/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */ 250.macro .PROC name 251 .func \name 252#ifdef _X86_ 253 /* x86 GAS expects a label with _ prefix */ 254 _\name: 255#endif 256 \name: 257 .cfi_startproc 258 .equ cfa_current_offset, -8 259.endm 260#define FUNC .PROC 261 262/* ... and .ENDP, replacing ENDP */ 263.macro .ENDP 264 .cfi_endproc 265 .endfunc 266.endm 267#define ENDFUNC .ENDP 268 269/* MASM compatible PUBLIC */ 270.macro PUBLIC symbol 271 .global \symbol 272.endm 273 274/* No special marking of global labels */ 275.macro GLOBAL_LABEL label 276 \label: 277.endm 278 279/* Dummy ASSUME */ 280.macro ASSUME p1 p2 p3 p4 p5 p6 p7 p8 281.endm 282 283/* MASM needs an end tag for segments */ 284.macro .endcode16 285.endm 286 287/* MASM compatible ALIGN */ 288#define ALIGN .align 289 290/* MASM compatible REPEAT, additional ENDR */ 291#define REPEAT .rept 292#define ENDR .endr 293 294.macro ljmp segment, offset 295 jmp far ptr \segment:\offset 296.endm 297 298.macro ljmp16 segment, offset 299 jmp far ptr \segment:\offset 300.endm 301 302/* MASM compatible EXTERN */ 303.macro EXTERN name 304.endm 305 306/* MASM needs an END tag */ 307#define END 308 309.macro .MODEL model 310.endm 311 312.macro .code 313 .text 314.endm 315 316.macro .const 317 .section .rdata 318.endm 319 320/* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx 321 and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */ 322.macro FPO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame 323 .if (cbFrame == FRAME_TRAP) 324 .cfi_signal_frame 325 .endif 326.endm 327 328/* Macros for x64 stack unwind OPs */ 329 330.macro .allocstack size 331 .cfi_adjust_cfa_offset \size 332 .set cfa_current_offset, cfa_current_offset - \size 333.endm 334 335code = 1 336.macro .pushframe param=0 337 .if (\param) 338 .cfi_adjust_cfa_offset 0x30 339 .set cfa_current_offset, cfa_current_offset - 0x30 340 .else 341 .cfi_adjust_cfa_offset 0x28 342 .set cfa_current_offset, cfa_current_offset - 0x28 343 .endif 344.endm 345 346.macro .pushreg reg 347 .cfi_adjust_cfa_offset 8 348 .equ cfa_current_offset, cfa_current_offset - 8 349 .cfi_offset \reg, cfa_current_offset 350.endm 351 352.macro .savereg reg, offset 353 // checkme!!! 354 .cfi_offset \reg, \offset 355.endm 356 357.macro .savexmm128 reg, offset 358 // checkme!!! 359 .cfi_offset \reg, \offset 360.endm 361 362.macro .setframe reg, offset 363 .cfi_def_cfa reg, \offset 364 .equ cfa_current_offset, \offset 365.endm 366 367.macro .endprolog 368.endm 369 370.macro absolute address 371 __absolute__address__ = \address 372.endm 373 374.macro resb name, size 375 \name = __absolute__address__ 376 __absolute__address__ = __absolute__address__ + \size 377.endm 378 379.macro UNIMPLEMENTED2 file, line, func 380 jmp 3f 3811: .asciz "\func" 3822: .asciz \file 3833: 384 sub rsp, 0x20 385 lea rcx, MsgUnimplemented[rip] 386 lea rdx, 1b[rip] 387 lea r8, 2b[rip] 388 mov r9, \line 389 call DbgPrint 390 add rsp, 0x20 391.endm 392#define UNIMPLEMENTED UNIMPLEMENTED2 __FILE__, __LINE__, 393 394/* MASM/ML uses ".if" for runtime conditionals, and "if" for compile time 395 conditionals. We therefore use "if", too. .if shouldn't be used at all */ 396#define if .if 397#define endif .endif 398#define else .else 399#define elseif .elseif 400 401#define CR "\r" 402#define LF "\n" 403#define NUL "\0" 404 405/* CFI annotations */ 406#define CFI_STARTPROC .cfi_startproc 407#define CFI_ENDPROC .cfi_endproc 408#define CFI_DEF_CFA .cfi_def_cfa 409#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset 410#define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register 411#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset 412#define CFI_OFFSET .cfi_offset 413#define CFI_REGISTER .cfi_register 414#define CFI_REL_OFFSET .cfi_rel_offset 415#define CFI_SAME_VALUE .cfi_same_value 416 417#endif 418 419#endif /* __ASM_INC__ */ 420