-/*\r
- * COPYRIGHT: See COPYING in the top level directory\r
- * PROJECT: ReactOS Kernel\r
- * FILE: include/asm/asm.inc\r
- * PURPOSE: ASM macros for GAS and MASM/ML64\r
- * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)\r
- */\r
-\r
-#ifndef __ASM_INC__\r
-#define __ASM_INC__\r
-\r
-#ifdef _USE_ML\r
-\r
-/* Allow ".name" identifiers */\r
-OPTION DOTNAME\r
-\r
-#ifdef _M_IX86\r
-.686P\r
-.XMM\r
-.MODEL FLAT\r
-ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING\r
-#endif\r
-\r
-/* Explicit radix in MASM syntax */\r
-#define BIN(x) x##y\r
-#define OCT(x) x##q\r
-#define DEC(x) x##t\r
-#define HEX(x) 0##x##h\r
-\r
-/* Macro values need not be marked */\r
-#define VAL(x) x\r
-\r
-/* MASM/ML doesn't want explicit [rip] addressing */\r
-rip = 0\r
-\r
-/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */\r
-#define MACRO(name, ...) name MACRO __VA_ARGS__\r
-\r
-/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */\r
-.PROC MACRO name\r
-__current_function_name EQU %name\r
-#ifdef _M_IX86\r
- %name PROC\r
-#else\r
- %name PROC FRAME\r
-#endif\r
-ENDM\r
-#define FUNC .PROC\r
-\r
-/* ... and .ENDP, replacing ENDP */\r
-.ENDP MACRO\r
- %__current_function_name ENDP\r
-ENDM\r
-#define ENDFUNC .ENDP\r
-\r
-/* Global labels need an extra colon */\r
-GLOBAL_LABEL MACRO label\r
- %label::\r
-ENDM\r
-\r
-/* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx\r
- and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */\r
-FPO MACRO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame\r
- .FPO (cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame)\r
-ENDM\r
-\r
-/* MASM doesn't have an ASCII macro */\r
-.ASCII MACRO text:VARARG\r
- DB text\r
-ENDM\r
-.ascii MACRO text:VARARG\r
- DB text\r
-ENDM\r
-\r
-/* MASM doesn't have an ASCIZ macro */\r
-.ASCIZ MACRO text:VARARG\r
- DB text\r
- DB 0\r
-ENDM\r
-.asciz MACRO text:VARARG\r
- DB text\r
- DB 0\r
-ENDM\r
-\r
-.code64 MACRO\r
- .code\r
-ENDM\r
-\r
-.code32 MACRO\r
- .code\r
- .586P\r
-ENDM\r
-\r
-.code16 MACRO\r
- ASSUME nothing\r
- .text SEGMENT use16\r
- .586P\r
-ENDM\r
-\r
-.endcode16 MACRO\r
- .text ENDS\r
-ENDM\r
-\r
-.bss MACRO\r
- .DATA?\r
- ASSUME nothing\r
-ENDM\r
-\r
-//.text MACRO\r
-//ENDM\r
-\r
-.align MACRO alignment\r
- ALIGN alignment\r
-ENDM\r
-\r
-.byte MACRO args:VARARG\r
- db args\r
-ENDM\r
-\r
-.short MACRO args:VARARG\r
- dw args\r
-ENDM\r
-\r
-.word MACRO args:VARARG\r
- dw args\r
-ENDM\r
-\r
-.long MACRO args:VARARG\r
- dd args\r
-ENDM\r
-\r
-.double MACRO args:VARARG\r
- dq args\r
-ENDM\r
-\r
-.org MACRO value\r
- ORG value\r
-ENDM\r
-\r
-.fill MACRO count, size, value\r
- REPEAT count\r
- if (size EQ 1)\r
- DB value\r
- elseif (size EQ 2)\r
- DW value\r
- elseif (size EQ 4)\r
- DD value\r
- endif\r
- ENDM\r
-ENDM\r
-\r
-.skip MACRO size, fill:=<0>\r
- DB size DUP (fill)\r
-ENDM\r
-\r
-.space MACRO size, fill:=<0>\r
- .skip size, fill\r
-ENDM\r
-\r
-ljmp MACRO segment, offset\r
- DB 0EAh\r
- DD offset\r
- DW segment\r
-ENDM\r
-\r
-ljmp16 MACRO segment, offset\r
- DB 0EAh\r
- DW offset\r
- DW segment\r
-ENDM\r
-\r
-data32 MACRO opcode:VARARG\r
- DB 66h\r
- opcode\r
-ENDM\r
-\r
-UNIMPLEMENTED MACRO name\r
-ENDM\r
-\r
-absolute MACRO address\r
- __absolute__address__ = address\r
-ENDM\r
-\r
-resb MACRO name, size\r
- name = __absolute__address__\r
- __absolute__address__ = __absolute__address__ + size\r
-ENDM\r
-\r
-\r
-/* We need this to distinguish repeat from macros */\r
-#define ENDR ENDM\r
-\r
-#define CR 13\r
-#define LF 10\r
-#define NUL 0\r
-\r
-#else /***********************************************************************/\r
-\r
-/* Force intel syntax */\r
-.intel_syntax noprefix\r
-\r
-.altmacro\r
-\r
-/* Explicit radix in GAS syntax */\r
-#define BIN(x) 0b##x\r
-#define OCT(x) 0##x\r
-#define DEC(x) x\r
-#define HEX(x) 0x##x\r
-\r
-/* Macro values need to be marked */\r
-#define VAL(x) \x\r
-\r
-/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */\r
-#define MACRO(...) .macro __VA_ARGS__\r
-#define ENDM .endm\r
-\r
-/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */\r
-.macro .PROC name\r
- .func \name\r
-#ifdef _X86_\r
- /* x86 gas expects a label with _ prefix */\r
- _\name:\r
-#endif\r
- \name:\r
- .cfi_startproc\r
- .equ cfa_current_offset, -8\r
-.endm\r
-#define FUNC .PROC\r
-\r
-/* ... and .ENDP, replacing ENDP */\r
-.macro .ENDP\r
- .cfi_endproc\r
- .endfunc\r
-.endm\r
-#define ENDFUNC .ENDP\r
-\r
-/* MASM compatible PUBLIC */\r
-.macro PUBLIC symbol\r
- .global \symbol\r
-.endm\r
-\r
-/* No special marking of global labels */\r
-.macro GLOBAL_LABEL label\r
- \label:\r
-.endm\r
-\r
-/* Dummy ASSUME */\r
-.macro ASSUME p1 p2 p3 p4 p5 p6 p7 p8\r
-.endm\r
-\r
-/* MASM needs an end tag for segments */\r
-.macro .endcode16\r
-.endm\r
-\r
-/* MASM compatible ALIGN */\r
-#define ALIGN .align\r
-\r
-/* MASM compatible REPEAT, additional ENDR */\r
-#define REPEAT .rept\r
-#define ENDR .endr\r
-\r
-.macro ljmp segment, offset\r
- jmp far ptr \segment:\offset\r
-.endm\r
-\r
-.macro ljmp16 segment, offset\r
- jmp far ptr \segment:\offset\r
-.endm\r
-\r
-/* MASM compatible EXTERN */\r
-.macro EXTERN name\r
-.endm\r
-\r
-/* MASM needs an END tag */\r
-#define END\r
-\r
-.macro .MODEL model\r
-.endm\r
-\r
-.macro .code\r
- .text\r
-.endm\r
-\r
-/* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx\r
- and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */\r
-.macro FPO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame\r
- /* dummy */\r
-.endm\r
-\r
-/* Macros for x64 stack unwind OPs */\r
-\r
-.macro .allocstack size\r
- .cfi_adjust_cfa_offset \size\r
- .set cfa_current_offset, cfa_current_offset - \size\r
-.endm\r
-\r
-code = 1\r
-.macro .pushframe param=0\r
- .if (\param)\r
- .cfi_adjust_cfa_offset 0x30\r
- .set cfa_current_offset, cfa_current_offset - 0x30\r
- .else\r
- .cfi_adjust_cfa_offset 0x28\r
- .set cfa_current_offset, cfa_current_offset - 0x28\r
- .endif\r
-.endm\r
-\r
-.macro .pushreg reg\r
- .cfi_adjust_cfa_offset 8\r
- .equ cfa_current_offset, cfa_current_offset - 8\r
- .cfi_offset \reg, cfa_current_offset\r
-.endm\r
-\r
-.macro .savereg reg, offset\r
- // checkme!!!\r
- .cfi_offset \reg, \offset\r
-.endm\r
-\r
-.macro .savexmm128 reg, offset\r
- // checkme!!!\r
- .cfi_offset \reg, \offset\r
-.endm\r
-\r
-.macro .setframe reg, offset\r
- .cfi_def_cfa reg, \offset\r
- .equ cfa_current_offset, \offset\r
-.endm\r
-\r
-.macro .endprolog\r
-.endm\r
-\r
-.macro absolute address\r
- __absolute__address__ = \address\r
-.endm\r
-\r
-.macro resb name, size\r
- \name = __absolute__address__\r
- __absolute__address__ = __absolute__address__ + \size\r
-.endm\r
-\r
-.macro UNIMPLEMENTED2 file, line, func\r
- jmp 3f\r
-1: .asciz "\func"\r
-2: .asciz \file\r
-3:\r
- sub rsp, 0x20\r
- lea rcx, MsgUnimplemented[rip]\r
- lea rdx, 1b[rip]\r
- lea r8, 2b[rip]\r
- mov r9, \line\r
- call DbgPrint\r
- add rsp, 0x20\r
-.endm\r
-#define UNIMPLEMENTED UNIMPLEMENTED2 __FILE__, __LINE__,\r
-\r
-/* MASM/ML uses ".if" for runtime conditionals, and "if" for compile time\r
- conditionals. We therefore use "if", too. .if shouldn't be used at all */\r
-#define if .if\r
-#define endif .endif\r
-#define else .else\r
-#define elseif .elseif\r
-\r
-#define CR "\r"\r
-#define LF "\n"\r
-#define NUL "\0"\r
-\r
-#endif\r
-\r
-/* Common definitions for FPO macro\r
- see http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */\r
-#define FRAME_FPO 0\r
-#define FRAME_TRAP 1\r
-#define FRAME_TSS 2\r
-#define FRAME_NONFPO 3\r
-\r
-#endif /* __ASM_INC__ */\r
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel
+ * FILE: include/asm/asm.inc
+ * PURPOSE: ASM macros for GAS and MASM/ML64
+ * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
+ */
+
+#ifndef __ASM_INC__
+#define __ASM_INC__
+
+/* Common definitions for FPO macro
+ see http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */
+#define FRAME_FPO 0
+#define FRAME_TRAP 1
+#define FRAME_TSS 2
+#define FRAME_NONFPO 3
+
+#ifdef _USE_ML
+
+/* Allow ".name" identifiers */
+OPTION DOTNAME
+
+#ifdef _M_IX86
+.686P
+.XMM
+.MODEL FLAT
+ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING
+#endif
+
+/* Explicit radix in MASM syntax */
+#define BIN(x) x##y
+#define OCT(x) x##q
+#define DEC(x) x##t
+#define HEX(x) 0##x##h
+
+/* Macro values need not be marked */
+#define VAL(x) x
+
+/* MASM/ML doesn't want explicit [rip] addressing */
+rip = 0
+
+/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */
+#define MACRO(name, ...) name MACRO __VA_ARGS__
+
+/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */
+.PROC MACRO name
+__current_function_name EQU %name
+#ifdef _M_IX86
+ %name PROC
+#else
+ %name PROC FRAME
+#endif
+ENDM
+#define FUNC .PROC
+
+/* ... and .ENDP, replacing ENDP */
+.ENDP MACRO
+ %__current_function_name ENDP
+ENDM
+#define ENDFUNC .ENDP
+
+/* Global labels need an extra colon */
+GLOBAL_LABEL MACRO label
+ %label::
+ENDM
+
+/* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx
+ and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */
+FPO MACRO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame
+ .FPO (cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame)
+ENDM
+
+/* MASM doesn't have an ASCII macro */
+.ASCII MACRO text:VARARG
+ DB text
+ENDM
+.ascii MACRO text:VARARG
+ DB text
+ENDM
+
+/* MASM doesn't have an ASCIZ macro */
+.ASCIZ MACRO text:VARARG
+ DB text
+ DB 0
+ENDM
+.asciz MACRO text:VARARG
+ DB text
+ DB 0
+ENDM
+
+.code64 MACRO
+ .code
+ENDM
+
+.code32 MACRO
+ .code
+ .586P
+ENDM
+
+.code16 MACRO
+ ASSUME nothing
+ .text SEGMENT use16 PUBLIC 'CODE'
+ .586P
+ENDM
+
+.endcode16 MACRO
+ .text ENDS
+ENDM
+
+.bss MACRO
+ .DATA?
+ ASSUME nothing
+ENDM
+
+//.text MACRO
+//ENDM
+
+.align MACRO alignment
+ ALIGN alignment
+ENDM
+
+.byte MACRO args:VARARG
+ db args
+ENDM
+
+.short MACRO args:VARARG
+ dw args
+ENDM
+
+.word MACRO args:VARARG
+ dw args
+ENDM
+
+.long MACRO args:VARARG
+ dd args
+ENDM
+
+.quad MACRO args:VARARG
+ dq args
+ENDM
+
+.double MACRO args:VARARG
+ real8 args
+ENDM
+
+.org MACRO value
+ ORG value
+ENDM
+
+.fill MACRO count, size, value
+ REPEAT count
+ if (size EQ 1)
+ DB value
+ elseif (size EQ 2)
+ DW value
+ elseif (size EQ 4)
+ DD value
+ endif
+ ENDM
+ENDM
+
+.skip MACRO size, fill:=<0>
+ DB size DUP (fill)
+ENDM
+
+.space MACRO size, fill:=<0>
+ .skip size, fill
+ENDM
+
+ljmp MACRO segment, offset
+ DB 0EAh
+ DD offset
+ DW segment
+ENDM
+
+ljmp16 MACRO segment, offset
+ DB 0EAh
+ DW offset
+ DW segment
+ENDM
+
+data32 MACRO opcode:VARARG
+ DB 66h
+ opcode
+ENDM
+
+UNIMPLEMENTED MACRO name
+ENDM
+
+absolute MACRO address
+ __absolute__address__ = address
+ENDM
+
+resb MACRO name, size
+ name = __absolute__address__
+ __absolute__address__ = __absolute__address__ + size
+ENDM
+
+/* We need this to distinguish repeat from macros */
+#define ENDR ENDM
+
+#define CR 13
+#define LF 10
+#define NUL 0
+
+/* For compatibility with GAS */
+CFI_STARTPROC MACRO start
+ENDM
+CFI_ENDPROC MACRO
+ENDM
+CFI_DEF_CFA MACRO reg:REQ, offset:REQ
+ENDM
+CFI_DEF_CFA_OFFSET MACRO offset:REQ
+ENDM
+CFI_DEF_CFA_REGISTER MACRO reg:REQ
+ENDM
+CFI_ADJUST_CFA_OFFSET MACRO offset:REQ
+ENDM
+CFI_OFFSET MACRO reg:REQ, offset:REQ
+ENDM
+CFI_REGISTER MACRO reg1:REQ, reg2:REQ
+ENDM
+CFI_REL_OFFSET MACRO reg:REQ, offset:REQ
+ENDM
+CFI_SAME_VALUE MACRO reg:REQ
+ENDM
+
+#else /***********************************************************************/
+
+/* Force intel syntax */
+.intel_syntax noprefix
+
+.altmacro
+
+/* Explicit radix in GAS syntax */
+#define BIN(x) 0b##x
+#define OCT(x) 0##x
+#define DEC(x) x
+#define HEX(x) 0x##x
+
+/* Macro values need to be marked */
+#define VAL(x) \x
+
+/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */
+#define MACRO(...) .macro __VA_ARGS__
+#define ENDM .endm
+
+/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */
+.macro .PROC name
+ .func \name
+#ifdef _X86_
+ /* x86 GAS expects a label with _ prefix */
+ _\name:
+#endif
+ \name:
+ .cfi_startproc
+ .equ cfa_current_offset, -8
+.endm
+#define FUNC .PROC
+
+/* ... and .ENDP, replacing ENDP */
+.macro .ENDP
+ .cfi_endproc
+ .endfunc
+.endm
+#define ENDFUNC .ENDP
+
+/* MASM compatible PUBLIC */
+.macro PUBLIC symbol
+ .global \symbol
+.endm
+
+/* No special marking of global labels */
+.macro GLOBAL_LABEL label
+ \label:
+.endm
+
+/* Dummy ASSUME */
+.macro ASSUME p1 p2 p3 p4 p5 p6 p7 p8
+.endm
+
+/* MASM needs an end tag for segments */
+.macro .endcode16
+.endm
+
+/* MASM compatible ALIGN */
+#define ALIGN .align
+
+/* MASM compatible REPEAT, additional ENDR */
+#define REPEAT .rept
+#define ENDR .endr
+
+.macro ljmp segment, offset
+ jmp far ptr \segment:\offset
+.endm
+
+.macro ljmp16 segment, offset
+ jmp far ptr \segment:\offset
+.endm
+
+/* MASM compatible EXTERN */
+.macro EXTERN name
+.endm
+
+/* MASM needs an END tag */
+#define END
+
+.macro .MODEL model
+.endm
+
+.macro .code
+ .text
+.endm
+
+.macro .const
+ .section .rdata
+.endm
+
+/* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx
+ and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */
+.macro FPO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame
+ .if (cbFrame == FRAME_TRAP)
+ .cfi_signal_frame
+ .endif
+.endm
+
+/* Macros for x64 stack unwind OPs */
+
+.macro .allocstack size
+ .cfi_adjust_cfa_offset \size
+ .set cfa_current_offset, cfa_current_offset - \size
+.endm
+
+code = 1
+.macro .pushframe param=0
+ .if (\param)
+ .cfi_adjust_cfa_offset 0x30
+ .set cfa_current_offset, cfa_current_offset - 0x30
+ .else
+ .cfi_adjust_cfa_offset 0x28
+ .set cfa_current_offset, cfa_current_offset - 0x28
+ .endif
+.endm
+
+.macro .pushreg reg
+ .cfi_adjust_cfa_offset 8
+ .equ cfa_current_offset, cfa_current_offset - 8
+ .cfi_offset \reg, cfa_current_offset
+.endm
+
+.macro .savereg reg, offset
+ // checkme!!!
+ .cfi_offset \reg, \offset
+.endm
+
+.macro .savexmm128 reg, offset
+ // checkme!!!
+ .cfi_offset \reg, \offset
+.endm
+
+.macro .setframe reg, offset
+ .cfi_def_cfa reg, \offset
+ .equ cfa_current_offset, \offset
+.endm
+
+.macro .endprolog
+.endm
+
+.macro absolute address
+ __absolute__address__ = \address
+.endm
+
+.macro resb name, size
+ \name = __absolute__address__
+ __absolute__address__ = __absolute__address__ + \size
+.endm
+
+.macro UNIMPLEMENTED2 file, line, func
+ jmp 3f
+1: .asciz "\func"
+2: .asciz \file
+3:
+ sub rsp, 0x20
+ lea rcx, MsgUnimplemented[rip]
+ lea rdx, 1b[rip]
+ lea r8, 2b[rip]
+ mov r9, \line
+ call DbgPrint
+ add rsp, 0x20
+.endm
+#define UNIMPLEMENTED UNIMPLEMENTED2 __FILE__, __LINE__,
+
+/* MASM/ML uses ".if" for runtime conditionals, and "if" for compile time
+ conditionals. We therefore use "if", too. .if shouldn't be used at all */
+#define if .if
+#define endif .endif
+#define else .else
+#define elseif .elseif
+
+#define CR "\r"
+#define LF "\n"
+#define NUL "\0"
+
+/* CFI annotations */
+#define CFI_STARTPROC .cfi_startproc
+#define CFI_ENDPROC .cfi_endproc
+#define CFI_DEF_CFA .cfi_def_cfa
+#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset
+#define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register
+#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset
+#define CFI_OFFSET .cfi_offset
+#define CFI_REGISTER .cfi_register
+#define CFI_REL_OFFSET .cfi_rel_offset
+#define CFI_SAME_VALUE .cfi_same_value
+
+#endif
+
+#endif /* __ASM_INC__ */