mirror of
https://github.com/reactos/reactos.git
synced 2025-01-10 16:18:16 +00:00
3947c4313f
Add .org for ML svn path=/branches/cmake-bringup/; revision=49586
262 lines
4.7 KiB
PHP
262 lines
4.7 KiB
PHP
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS Kernel
|
|
* FILE: ntoskrnl/include/amd64/asmmacro.S
|
|
* PURPOSE: ASM macros for for GAS and MASM/ML64
|
|
* PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
|
|
*/
|
|
|
|
#ifdef _USE_ML
|
|
|
|
/* Allow ".name" identifiers */
|
|
OPTION DOTNAME
|
|
|
|
.686P
|
|
.XMM
|
|
.MODEL FLAT
|
|
ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING
|
|
|
|
/* Hex numbers need to be in 01ABh format */
|
|
#define HEX(x) 0##x##h
|
|
|
|
/* Macro values need to 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
|
|
name PROC FRAME
|
|
_name:
|
|
ENDM
|
|
|
|
/* ... and .ENDP, replacing ENDP */
|
|
.ENDP MACRO name
|
|
name ENDP
|
|
ENDM
|
|
|
|
/* MASM doesn't have an ASCII macro */
|
|
.ASCII MACRO text
|
|
DB text
|
|
ENDM
|
|
|
|
/* MASM doesn't have an ASCIZ macro */
|
|
.ASCIZ MACRO text
|
|
DB text, 0
|
|
ENDM
|
|
|
|
#define lgdt lgdt fword ptr ds:
|
|
|
|
#define lidt lidt fword ptr ds:
|
|
|
|
ljmp MACRO segment, offset
|
|
DB 0
|
|
ENDM
|
|
|
|
.code64 MACRO
|
|
.code
|
|
ENDM
|
|
|
|
.code32 MACRO
|
|
.code
|
|
.586P
|
|
ENDM
|
|
|
|
.code16 MACRO
|
|
ASSUME nothing
|
|
.text SEGMENT use16
|
|
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
|
|
|
|
.double MACRO args:VARARG
|
|
dq args
|
|
ENDM
|
|
|
|
.org MACRO value
|
|
ORG value
|
|
ENDM
|
|
|
|
.fill MACRO repeat, size, value
|
|
// FIXME
|
|
ENDM
|
|
|
|
ljmp MACRO segment, offset
|
|
// FIXME
|
|
ENDM
|
|
|
|
UNIMPLEMENTED MACRO name
|
|
ENDM
|
|
|
|
/* We need this to distinguish repeat from macros */
|
|
#define ENDR ENDM
|
|
|
|
#else /***********************************************************************/
|
|
|
|
/* Force intel syntax */
|
|
.intel_syntax noprefix
|
|
|
|
.altmacro
|
|
|
|
/* Hex numbers need to be in 0x1AB format */
|
|
#define HEX(y) 0x##y
|
|
|
|
/* 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
|
|
\name:
|
|
.cfi_startproc
|
|
.equ cfa_current_offset, -8
|
|
.endm
|
|
|
|
/* ... and .ENDP, replacing ENDP */
|
|
.macro .ENDP name
|
|
.cfi_endproc
|
|
.endfunc
|
|
.endm
|
|
|
|
/* MASM compatible PUBLIC */
|
|
.macro PUBLIC symbol
|
|
.global \symbol
|
|
.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
|
|
|
|
/* MASM compatible EXTERN */
|
|
.macro EXTERN name
|
|
.endm
|
|
|
|
/* MASM needs an END tag */
|
|
#define END
|
|
|
|
.macro .MODEL model
|
|
.endm
|
|
|
|
.macro .code
|
|
.text
|
|
.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 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
|
|
|
|
#endif
|