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 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.double MACRO args:VARARG 140 dq args 141ENDM 142 143.org MACRO value 144 ORG value 145ENDM 146 147.fill MACRO count, size, value 148 REPEAT count 149 if (size EQ 1) 150 DB value 151 elseif (size EQ 2) 152 DW value 153 elseif (size EQ 4) 154 DD value 155 endif 156 ENDM 157ENDM 158 159.skip MACRO size, fill:=<0> 160 DB size DUP (fill) 161ENDM 162 163.space MACRO size, fill:=<0> 164 .skip size, fill 165ENDM 166 167ljmp MACRO segment, offset 168 DB 0EAh 169 DD offset 170 DW segment 171ENDM 172 173ljmp16 MACRO segment, offset 174 DB 0EAh 175 DW offset 176 DW segment 177ENDM 178 179data32 MACRO opcode:VARARG 180 DB 66h 181 opcode 182ENDM 183 184UNIMPLEMENTED MACRO name 185ENDM 186 187absolute MACRO address 188 __absolute__address__ = address 189ENDM 190 191resb MACRO name, size 192 name = __absolute__address__ 193 __absolute__address__ = __absolute__address__ + size 194ENDM 195 196/* We need this to distinguish repeat from macros */ 197#define ENDR ENDM 198 199#define CR 13 200#define LF 10 201#define NUL 0 202 203/* For compatibility with GAS */ 204CFI_STARTPROC MACRO start 205ENDM 206CFI_ENDPROC MACRO 207ENDM 208CFI_DEF_CFA MACRO reg:REQ, offset:REQ 209ENDM 210CFI_DEF_CFA_OFFSET MACRO offset:REQ 211ENDM 212CFI_DEF_CFA_REGISTER MACRO reg:REQ 213ENDM 214CFI_ADJUST_CFA_OFFSET MACRO offset:REQ 215ENDM 216CFI_OFFSET MACRO reg:REQ, offset:REQ 217ENDM 218CFI_REGISTER MACRO reg1:REQ, reg2:REQ 219ENDM 220CFI_REL_OFFSET MACRO reg:REQ, offset:REQ 221ENDM 222CFI_SAME_VALUE MACRO reg:REQ 223ENDM 224 225#else /***********************************************************************/ 226 227/* Force intel syntax */ 228.intel_syntax noprefix 229 230.altmacro 231 232/* Explicit radix in GAS syntax */ 233#define BIN(x) 0b##x 234#define OCT(x) 0##x 235#define DEC(x) x 236#define HEX(x) 0x##x 237 238/* Macro values need to be marked */ 239#define VAL(x) \x 240 241/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */ 242#define MACRO(...) .macro __VA_ARGS__ 243#define ENDM .endm 244 245/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */ 246.macro .PROC name 247 .func \name 248#ifdef _X86_ 249 /* x86 GAS expects a label with _ prefix */ 250 _\name: 251#endif 252 \name: 253 .cfi_startproc 254 .equ cfa_current_offset, -8 255.endm 256#define FUNC .PROC 257 258/* ... and .ENDP, replacing ENDP */ 259.macro .ENDP 260 .cfi_endproc 261 .endfunc 262.endm 263#define ENDFUNC .ENDP 264 265/* MASM compatible PUBLIC */ 266.macro PUBLIC symbol 267 .global \symbol 268.endm 269 270/* No special marking of global labels */ 271.macro GLOBAL_LABEL label 272 \label: 273.endm 274 275/* Dummy ASSUME */ 276.macro ASSUME p1 p2 p3 p4 p5 p6 p7 p8 277.endm 278 279/* MASM needs an end tag for segments */ 280.macro .endcode16 281.endm 282 283/* MASM compatible ALIGN */ 284#define ALIGN .align 285 286/* MASM compatible REPEAT, additional ENDR */ 287#define REPEAT .rept 288#define ENDR .endr 289 290.macro ljmp segment, offset 291 jmp far ptr \segment:\offset 292.endm 293 294.macro ljmp16 segment, offset 295 jmp far ptr \segment:\offset 296.endm 297 298/* MASM compatible EXTERN */ 299.macro EXTERN name 300.endm 301 302/* MASM needs an END tag */ 303#define END 304 305.macro .MODEL model 306.endm 307 308.macro .code 309 .text 310.endm 311 312/* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx 313 and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */ 314.macro FPO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame 315 .if (cbFrame == FRAME_TRAP) 316 .cfi_signal_frame 317 .endif 318.endm 319 320/* Macros for x64 stack unwind OPs */ 321 322.macro .allocstack size 323 .cfi_adjust_cfa_offset \size 324 .set cfa_current_offset, cfa_current_offset - \size 325.endm 326 327code = 1 328.macro .pushframe param=0 329 .if (\param) 330 .cfi_adjust_cfa_offset 0x30 331 .set cfa_current_offset, cfa_current_offset - 0x30 332 .else 333 .cfi_adjust_cfa_offset 0x28 334 .set cfa_current_offset, cfa_current_offset - 0x28 335 .endif 336.endm 337 338.macro .pushreg reg 339 .cfi_adjust_cfa_offset 8 340 .equ cfa_current_offset, cfa_current_offset - 8 341 .cfi_offset \reg, cfa_current_offset 342.endm 343 344.macro .savereg reg, offset 345 // checkme!!! 346 .cfi_offset \reg, \offset 347.endm 348 349.macro .savexmm128 reg, offset 350 // checkme!!! 351 .cfi_offset \reg, \offset 352.endm 353 354.macro .setframe reg, offset 355 .cfi_def_cfa reg, \offset 356 .equ cfa_current_offset, \offset 357.endm 358 359.macro .endprolog 360.endm 361 362.macro absolute address 363 __absolute__address__ = \address 364.endm 365 366.macro resb name, size 367 \name = __absolute__address__ 368 __absolute__address__ = __absolute__address__ + \size 369.endm 370 371.macro UNIMPLEMENTED2 file, line, func 372 jmp 3f 3731: .asciz "\func" 3742: .asciz \file 3753: 376 sub rsp, 0x20 377 lea rcx, MsgUnimplemented[rip] 378 lea rdx, 1b[rip] 379 lea r8, 2b[rip] 380 mov r9, \line 381 call DbgPrint 382 add rsp, 0x20 383.endm 384#define UNIMPLEMENTED UNIMPLEMENTED2 __FILE__, __LINE__, 385 386/* MASM/ML uses ".if" for runtime conditionals, and "if" for compile time 387 conditionals. We therefore use "if", too. .if shouldn't be used at all */ 388#define if .if 389#define endif .endif 390#define else .else 391#define elseif .elseif 392 393#define CR "\r" 394#define LF "\n" 395#define NUL "\0" 396 397/* CFI annotations */ 398#define CFI_STARTPROC .cfi_startproc 399#define CFI_ENDPROC .cfi_endproc 400#define CFI_DEF_CFA .cfi_def_cfa 401#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset 402#define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register 403#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset 404#define CFI_OFFSET .cfi_offset 405#define CFI_REGISTER .cfi_register 406#define CFI_REL_OFFSET .cfi_rel_offset 407#define CFI_SAME_VALUE .cfi_same_value 408 409#endif 410 411#endif /* __ASM_INC__ */ 412