From a0de230f73ee22f47fb6c99fe199d9ed3d266672 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 19 Nov 2008 21:24:52 +0000 Subject: [PATCH] Some asm macros for x64. They allow creating unwind info in a MASM like way, As a general rule for all asm functions changing the stack pointer, use ".proc FunctionName" (without '_' prefix) before the function and ".endproc" after the function and use .allocstack, .pushreg, etc. after the corresponding opcode. svn path=/branches/ros-amd64-bringup/; revision=37469 --- .../include/internal/amd64/asmmacro.S | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 reactos/ntoskrnl/include/internal/amd64/asmmacro.S diff --git a/reactos/ntoskrnl/include/internal/amd64/asmmacro.S b/reactos/ntoskrnl/include/internal/amd64/asmmacro.S new file mode 100644 index 00000000000..9d7a1807321 --- /dev/null +++ b/reactos/ntoskrnl/include/internal/amd64/asmmacro.S @@ -0,0 +1,81 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel + * FILE: ntoskrnl/include/amd64/asmmacro.S + * PURPOSE: Macros for x64 assembly + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +.intel_syntax noprefix +.code64 + +/* Macros for x64 stack unwind OPs */ + +.macro .proc name + .func name + .global _\name + _\name: + .cfi_startproc + .equ cfa_current_offset, -8 +.endm + +.macro .endproc + .cfi_endproc + .endfunc +.endm + +.macro .allocstack size + .cfi_adjust_cfa_offset \size + .set cfa_current_offset, cfa_current_offset - \size +.endm + +.macro .pushframe code + .if (\code == 0) + .cfi_adjust_cfa_offset 0x28 + .set cfa_current_offset, cfa_current_offset - 0x28 + .else + .cfi_adjust_cfa_offset 0x30 + .set cfa_current_offset, cfa_current_offset - 0x30 + .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 line, func + jmp 3f + .equ expr, 12 +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 __LINE__, +