From 76d0b0da01df8f2891002c6bbd27e38263e9f7ba Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Jul 2010 21:18:33 +0000 Subject: [PATCH] [RTL] - Update amd64 specific code to be MSVC compatible - Remove Leading underscores from symbols svn path=/trunk/; revision=48122 --- reactos/lib/rtl/amd64/debug_asm.S | 49 ++++------ reactos/lib/rtl/amd64/except_asm.S | 23 +++-- reactos/lib/rtl/amd64/rtlmem.S | 36 ++++--- reactos/lib/rtl/amd64/slist.S | 152 +++++++++++++++-------------- reactos/lib/rtl/amd64/unwind.c | 2 +- 5 files changed, 135 insertions(+), 127 deletions(-) diff --git a/reactos/lib/rtl/amd64/debug_asm.S b/reactos/lib/rtl/amd64/debug_asm.S index 82c96474b2b..c115feb12fc 100644 --- a/reactos/lib/rtl/amd64/debug_asm.S +++ b/reactos/lib/rtl/amd64/debug_asm.S @@ -3,54 +3,47 @@ * PROJECT: ReactOS Run-Time Library * PURPOSE: Debug Routines * FILE: lib/rtl/i386/debug.S - * PROGRAMER: Alex Ionescu (alex@relsoft.net) + * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -.intel_syntax noprefix +#include /* GLOBALS ****************************************************************/ -.globl _DbgBreakPoint -.globl _DbgBreakPointWithStatus -.globl _DbgUserBreakPoint -.globl _DebugService -.globl _DebugService2 -.globl _DbgBreakPointNoBugCheck -.globl _RtlpBreakWithStatusInstruction +PUBLIC DbgBreakPoint +PUBLIC DbgBreakPointWithStatus +PUBLIC DbgUserBreakPoint +PUBLIC DebugService +PUBLIC DebugService2 +PUBLIC DbgBreakPointNoBugCheck +PUBLIC RtlpBreakWithStatusInstruction /* FUNCTIONS ***************************************************************/ -.func DbgBreakPointNoBugCheck -_DbgBreakPointNoBugCheck: +.code64 + +DbgBreakPointNoBugCheck: int 3 ret -.endfunc -.func DbgBreakPoint -_DbgBreakPoint: -_DbgUserBreakPoint: +DbgBreakPoint: +DbgUserBreakPoint: int 3 ret -.endfunc -.func DbgBreakPointWithStatus -_DbgBreakPointWithStatus: +DbgBreakPointWithStatus: mov eax, ecx - -_RtlpBreakWithStatusInstruction: +RtlpBreakWithStatusInstruction: int 3 ret -.endfunc -.func DebugService2 -_DebugService2: +DebugService2: ret /* Call the interrupt */ // mov eax, [rbp+8] // int 0x2D // int 3 -.endfunc /****************************************************************************** * NTSTATUS NTAPI DebugService( @@ -60,8 +53,7 @@ _DebugService2: * IN PVOID Argument1, // = [rsp + 32] * IN PVOID Argument2); // [rsp + 40] */ -.func DebugService -_DebugService: +DebugService: /* Prepare registers for interrupt */ mov eax, ecx // Service @@ -71,9 +63,10 @@ _DebugService: mov r9, [rsp + 40] // Argument2 /* Call the Interrupt */ - int 0x2D + int HEX(2D) int 3 /* Return */ ret -.endfunc + +END diff --git a/reactos/lib/rtl/amd64/except_asm.S b/reactos/lib/rtl/amd64/except_asm.S index 2937335a45d..a4b35079fcd 100644 --- a/reactos/lib/rtl/amd64/except_asm.S +++ b/reactos/lib/rtl/amd64/except_asm.S @@ -8,24 +8,25 @@ /* INCLUDES ******************************************************************/ -#include -.intel_syntax noprefix +#include +#include /* FUNCTIONS *****************************************************************/ +.code64 + /* * VOID NTAPI * RtlCaptureContext( * PCONTEXT ContextRecord); */ -.func RtlCaptureContext -.global _RtlCaptureContext -_RtlCaptureContext: - .cfi_startproc +PUBLIC RtlCaptureContext +.PROC RtlCaptureContext /* Push rflags */ pushfq - .cfi_adjust_cfa_offset 8 + .ALLOCSTACK 8 + .ENDPROLOG /* Save the basic register context */ mov [rcx + CONTEXT_Rax], rax @@ -47,7 +48,7 @@ _RtlCaptureContext: mov [rcx + CONTEXT_R9], r9 /* Load former stack pointer in rax */ - lea rax, [rsp + 0x10] + lea rax, [rsp + 16] mov [rcx + CONTEXT_R10], r10 mov [rcx + CONTEXT_R11], r11 @@ -95,6 +96,8 @@ _RtlCaptureContext: /* Cleanup stack and return */ add rsp, 8 ret - .cfi_endproc -.endfunc +.ENDP RtlCaptureContext + +END + diff --git a/reactos/lib/rtl/amd64/rtlmem.S b/reactos/lib/rtl/amd64/rtlmem.S index 81154735373..d0a82068251 100644 --- a/reactos/lib/rtl/amd64/rtlmem.S +++ b/reactos/lib/rtl/amd64/rtlmem.S @@ -8,10 +8,12 @@ /* INCLUDES ******************************************************************/ -#include +#include +#include /* FUNCTIONS *****************************************************************/ -.intel_syntax noprefix + +.code64 /* SIZE_T * RtlCompareMemory( @@ -27,6 +29,7 @@ .pushreg rsi push rdi .pushreg rdi + .ENDPROLOG /* Setup registers for compare */ mov rsi, rcx @@ -38,41 +41,48 @@ /* Get number of qwords */ mov rcx, r8 shr rcx, 3 - jz 2f + jz RtlCompareMemory2 /* Compare qwords */ repe cmpsq - jnz 4f + jnz RtlCompareMemory4 -2: /* Compare rest */ +RtlCompareMemory2: + /* Compare rest */ mov rcx, r8 and rcx, 7 - jz 3f + jz RtlCompareMemory3 repe cmpsb - jnz 5f + jnz RtlCompareMemory5 -3: /* All equal */ +RtlCompareMemory3: + /* All equal */ /* Return the full count */ mov rax, rcx - jmp 6f + jmp RtlCompareMemory6 -4: /* Not equal after comparing qwords */ +RtlCompareMemory4: + /* Not equal after comparing qwords */ /* Compare the last qword */ sub rsi, 8 sub rdi, 8 mov rcx, 8 repe cmpsb -5: /* Not equal after comparing bytes */ +RtlCompareMemory5: + /* Not equal after comparing bytes */ /* Return difference */ sub rdi, rdx dec rdi mov rax, rdi -6: /* Cleanup and return */ +RtlCompareMemory6: + /* Cleanup and return */ pop rdi pop rsi ret -.endproc +.endp RtlCompareMemory + +END diff --git a/reactos/lib/rtl/amd64/slist.S b/reactos/lib/rtl/amd64/slist.S index 3488fb5a8f3..ca1ed3905d5 100644 --- a/reactos/lib/rtl/amd64/slist.S +++ b/reactos/lib/rtl/amd64/slist.S @@ -6,49 +6,54 @@ * PROGRAMMERS: Timo Kreuzer */ -#include -#include -.intel_syntax noprefix +#include +#include -#define SLIST8A_DEPTH_MASK 0x000000000000FFFF -#define SLIST8A_DEPTH_INC 0x0000000000000001 -#define SLIST8A_SEQUENCE_MASK 0x0000000001FF0000 -#define SLIST8A_SEQUENCE_INC 0x0000000000010000 -#define SLIST8A_NEXTENTRY_MASK 0xFFFFFFFFFE000000 +#define SLIST8A_DEPTH_MASK HEX(000000000000FFFF) +#define SLIST8A_DEPTH_INC HEX(0000000000000001) +#define SLIST8A_SEQUENCE_MASK HEX(0000000001FF0000) +#define SLIST8A_SEQUENCE_INC HEX(0000000000010000) +#define SLIST8A_NEXTENTRY_MASK HEX(FFFFFFFFFE000000) #define SLIST8A_NEXTENTRY_SHIFT 21 -#define SLIST8B_HEADERTYPE_MASK 0x0000000000000001 -#define SLIST8B_INIT_MASK 0x0000000000000002 -#define SLIST8B_REGION_MASK 0xE000000000000000 -#define SLIST8_POINTER_MASK 0x000007FFFFFFFFF0 +#define SLIST8B_HEADERTYPE_MASK HEX(0000000000000001) +#define SLIST8B_INIT_MASK HEX(0000000000000002) +#define SLIST8B_REGION_MASK HEX(E000000000000000) +#define SLIST8_POINTER_MASK HEX(000007FFFFFFFFF0) -#define SLIST16A_DEPTH_MASK 0x000000000000FFFF -#define SLIST16A_DEPTH_INC 0x0000000000000001 -#define SLIST16A_SEQUENCE_MASK 0xFFFFFFFFFFFF0000 -#define SLIST16A_SEQUENCE_INC 0x0000000000010000 -#define SLIST16B_HEADERTYPE_MASK 0x0000000000000001 -#define SLIST16B_INIT_MASK 0x0000000000000002 -#define SLIST16B_NEXTENTY_MASK 0xFFFFFFFFFFFFFFF0 +#define SLIST16A_DEPTH_MASK HEX(000000000000FFFF) +#define SLIST16A_DEPTH_INC HEX(0000000000000001) +#define SLIST16A_SEQUENCE_MASK HEX(FFFFFFFFFFFF0000) +#define SLIST16A_SEQUENCE_INC HEX(0000000000010000) +#define SLIST16B_HEADERTYPE_MASK HEX(0000000000000001) +#define SLIST16B_INIT_MASK HEX(0000000000000002) +#define SLIST16B_NEXTENTY_MASK HEX(FFFFFFFFFFFFFFF0) /* FUNCTIONS ****************************************************************/ -.global _ExpInterlockedPopEntrySList -.global _ExpInterlockedPopEntrySListResume -.global _ExpInterlockedPopEntrySListFault -.global _ExpInterlockedPopEntrySListEnd -.global _ExpInterlockedPopEntrySListResume16 -.global _ExpInterlockedPopEntrySListFault16 -.global _ExpInterlockedPopEntrySListEnd16 -.global _ExpInterlockedPushEntrySList -.global _ExpInterlockedFlushSList +.code64 + +PUBLIC ExpInterlockedPopEntrySList +PUBLIC ExpInterlockedPopEntrySListResume +PUBLIC ExpInterlockedPopEntrySListFault +PUBLIC ExpInterlockedPopEntrySListEnd +PUBLIC ExpInterlockedPopEntrySListResume16 +PUBLIC ExpInterlockedPopEntrySListFault16 +PUBLIC ExpInterlockedPopEntrySListEnd16 +PUBLIC ExpInterlockedPushEntrySList +PUBLIC ExpInterlockedFlushSList + +PUBLIC RtlInterlockedFlushSList +PUBLIC RtlInterlockedPopEntrySList +PUBLIC RtlInterlockedPushEntrySList /* PSLIST_ENTRY * NTAPI * RtlInterlockedPopEntrySList( * IN PSLIST_HEADER ListHead); */ -.proc RtlInterlockedPopEntrySList -_ExpInterlockedPopEntrySList: +RtlInterlockedPopEntrySList: +ExpInterlockedPopEntrySList: /* Load ListHead->Region into rdx */ mov rdx, [rcx + 8] @@ -58,23 +63,23 @@ _ExpInterlockedPopEntrySList: /* Check what kind of header this is */ test rdx, SLIST8B_HEADERTYPE_MASK - jnz _RtlInterlockedPopEntrySList16 + jnz RtlInterlockedPopEntrySList16 /* We have an 8 byte header */ -_ExpInterlockedPopEntrySListResume: +ExpInterlockedPopEntrySListResume: /* Check if ListHead->NextEntry is NULL */ mov r9, rax and r9, SLIST8A_NEXTENTRY_MASK - jz _RtlInterlockedPopEntrySListEmpty + jz RtlInterlockedPopEntrySListEmpty /* Copy Depth and Sequence number and adjust Depth */ lea r8, [rax - SLIST8A_DEPTH_INC] - and r8, SLIST8A_SEQUENCE_MASK | SLIST8A_DEPTH_MASK + and r8, (SLIST8A_SEQUENCE_MASK OR SLIST8A_DEPTH_MASK) /* Create a pointer template from rcx in rdx */ - mov rdx, ~SLIST8_POINTER_MASK + mov rdx, (NOT SLIST8_POINTER_MASK) and rdx, rcx /* Shift the NextEntry pointer */ @@ -83,7 +88,7 @@ _ExpInterlockedPopEntrySListResume: /* Combine to new pointer in rdx */ or rdx, r9 -_ExpInterlockedPopEntrySListFault: +ExpInterlockedPopEntrySListFault: /* Load the next NextEntry pointer to r9 */ mov r9, [rdx] @@ -94,31 +99,31 @@ _ExpInterlockedPopEntrySListFault: /* Combine into r8 */ or r8, r9 -_ExpInterlockedPopEntrySListEnd: +ExpInterlockedPopEntrySListEnd: /* If [rcx] equals rax, exchange it with r8 */ lock cmpxchg [rcx], r8 /* If not equal, retry with rax, being the content of [rcx] now */ - jnz _ExpInterlockedPopEntrySListResume + jnz ExpInterlockedPopEntrySListResume /* Shift the pointer bits in place */ and rax, SLIST8A_NEXTENTRY_MASK shr rax, SLIST8A_NEXTENTRY_SHIFT /* Use rcx as pointer template */ - mov rdx, ~SLIST8_POINTER_MASK + mov rdx, (NOT SLIST8_POINTER_MASK) and rdx, rcx /* Combine result and return */ or rax, rdx ret -_RtlInterlockedPopEntrySListEmpty: +RtlInterlockedPopEntrySListEmpty: xor rax, rax ret -_RtlInterlockedPopEntrySList16: +RtlInterlockedPopEntrySList16: /* This is a 16 byte header */ /* Save rbx */ @@ -127,31 +132,31 @@ _RtlInterlockedPopEntrySList16: /* Copy rcx to r8, as we need rcx for the exchange */ mov r8, rcx -_ExpInterlockedPopEntrySListResume16: +ExpInterlockedPopEntrySListResume16: /* Check if ListHead->NextEntry is NULL */ mov r9, rdx and r9, SLIST16B_NEXTENTY_MASK - jz _RtlInterlockedPopEntrySListEmpty16 + jz RtlInterlockedPopEntrySListEmpty16 -_ExpInterlockedPopEntrySListFault16: +ExpInterlockedPopEntrySListFault16: /* Get next pointer */ mov rcx, [r9] /* Set ListHead->HeaderType = 1 and ListHead->Init = 1 */ - or rcx, 0x3 + or rcx, 3 /* Copy Depth and Sequence number and adjust Depth */ lea rbx, [rax - SLIST16A_DEPTH_INC] -_ExpInterlockedPopEntrySListEnd16: +ExpInterlockedPopEntrySListEnd16: /* If [r8] equals rdx:rax, exchange it with rcx:rbx */ lock cmpxchg16b [r8] /* If not equal, retry with rdx:rax, being the content of [r8] now */ - jnz _ExpInterlockedPopEntrySListResume16 + jnz ExpInterlockedPopEntrySListResume16 /* Copy the old NextEntry pointer to rax */ mov rax, rdx @@ -161,13 +166,11 @@ _ExpInterlockedPopEntrySListEnd16: pop rbx ret -_RtlInterlockedPopEntrySListEmpty16: +RtlInterlockedPopEntrySListEmpty16: xor rax, rax pop rbx ret -.endproc - /* PSLIST_ENTRY * NTAPI @@ -175,8 +178,8 @@ _RtlInterlockedPopEntrySListEmpty16: * IN PSLIST_HEADER ListHead, * IN PSLIST_ENTRY ListEntry); */ -.proc RtlInterlockedPushEntrySList -_ExpInterlockedPushEntrySList: +RtlInterlockedPushEntrySList: +ExpInterlockedPushEntrySList: /* Load ListHead->Alignment into rax */ mov rax, [rcx] @@ -186,28 +189,28 @@ _ExpInterlockedPushEntrySList: /* Check what kind of header this is */ test r9, SLIST8B_HEADERTYPE_MASK - jnz _RtlInterlockedPushEntrySList16 + jnz RtlInterlockedPushEntrySList16 /* We have an 8 byte header */ -_RtlInterlockedPushEntrySListLoop: +RtlInterlockedPushEntrySListLoop: /* Get ListHead->NextEntry */ mov r8, rax and r8, SLIST8A_NEXTENTRY_MASK - jz _RtlInterlockedPushEntrySListEmpty + jz RtlInterlockedPushEntrySListEmpty /* Shift the NextEntry pointer */ shr r8, SLIST8A_NEXTENTRY_SHIFT /* Create a pointer template from rcx in rdx */ - mov r9, ~SLIST8_POINTER_MASK + mov r9, (NOT SLIST8_POINTER_MASK) and r9, rcx /* Combine to new pointer and save as ListEntry->NextEntry */ or r8, r9 -_RtlInterlockedPushEntrySListEmpty: +RtlInterlockedPushEntrySListEmpty: /* Store the NextEntry pointer in the new ListEntry */ mov [rdx], r8 @@ -218,7 +221,7 @@ _RtlInterlockedPushEntrySListEmpty: /* Copy and adjust depth and sequence number */ lea r9, [rax + SLIST8A_DEPTH_INC + SLIST8A_SEQUENCE_INC] - and r9, SLIST8A_SEQUENCE_MASK | SLIST8A_DEPTH_MASK + and r9, SLIST8A_SEQUENCE_MASK OR SLIST8A_DEPTH_MASK /* Combine to exchange value in r8 */ or r8, r9 @@ -230,13 +233,13 @@ _RtlInterlockedPushEntrySListEmpty: lock cmpxchg [rcx], r8 /* If not equal, retry with rax, being the content of [rcx] now */ - jnz _RtlInterlockedPushEntrySListLoop + jnz RtlInterlockedPushEntrySListLoop /* Return the old NextEntry pointer */ mov rax, r9 ret -_RtlInterlockedPushEntrySList16: +RtlInterlockedPushEntrySList16: /* This is a 16 byte header */ /* Save rbx */ @@ -248,11 +251,11 @@ _RtlInterlockedPushEntrySList16: /* Set ListHead->HeaderType = 1 and ListHead->Init = 1 */ mov rcx, rdx - or rcx, 0x3 + or rcx, 3 mov rdx, [r8 + 8] -_RtlInterlockedPushEntrySListLoop16: +RtlInterlockedPushEntrySListLoop16: /* Move ListHead->NextEntry to rbx */ mov rbx, rdx @@ -268,7 +271,7 @@ _RtlInterlockedPushEntrySListLoop16: lock cmpxchg16b [r8] /* If not equal, retry with rdx:rax, being the content of [r8] now */ - jnz _RtlInterlockedPushEntrySListLoop16 + jnz RtlInterlockedPushEntrySListLoop16 /* Copy the old NextEntry pointer to rax */ mov rax, rdx @@ -278,26 +281,25 @@ _RtlInterlockedPushEntrySListLoop16: pop rbx ret -.endproc /* PSLIST_ENTRY * NTAPI * RtlInterlockedFlushSList( * IN PSINGLE_LIST_ENTRY ListHead); */ -.proc RtlInterlockedFlushSList -_ExpInterlockedFlushSList: +RtlInterlockedFlushSList: +ExpInterlockedFlushSList: /* Load ListHead->Region into rdx */ mov rax, [rcx + 8] /* Check what kind of header this is */ test rax, SLIST8B_HEADERTYPE_MASK - jnz _RtlInterlockedFlushSList16 + jnz RtlInterlockedFlushSList16 /* We have an 8 byte header */ -_RtlInterlockedFlushSListLoop: +RtlInterlockedFlushSListLoop: /* Zero ListHead->Alignment */ xor r8, r8 @@ -306,31 +308,31 @@ _RtlInterlockedFlushSListLoop: lock cmpxchg [rcx], r8 /* If not equal, retry with rax, being the content of [rcx] now */ - jnz _RtlInterlockedFlushSListLoop + jnz RtlInterlockedFlushSListLoop /* Use rcx as pointer template */ - mov rdx, ~SLIST8_POINTER_MASK + mov rdx, (not SLIST8_POINTER_MASK) or rdx, rcx /* Combine result and return */ or rax, rdx ret -_RtlInterlockedFlushSList16: +RtlInterlockedFlushSList16: /* We have a 16 byte header */ push rbx mov rdx, [rcx + 8] xor rbx, rbx - mov rcx, 0x3 + mov rcx, 3 -_RtlInterlockedFlushSListLoop16: +RtlInterlockedFlushSListLoop16: /* If [r8] equals rdx:rax, exchange it with rcx:rbx */ lock cmpxchg16b [r8] /* If not equal, retry with rdx:rax, being the content of [r8] now */ - jnz _RtlInterlockedFlushSListLoop16 + jnz RtlInterlockedFlushSListLoop16 /* Copy the old NextEntry pointer to rax */ mov rax, rdx @@ -340,4 +342,4 @@ _RtlInterlockedFlushSListLoop16: pop rbx ret -.endproc +END diff --git a/reactos/lib/rtl/amd64/unwind.c b/reactos/lib/rtl/amd64/unwind.c index 914317f1717..d0a4f2e9c45 100644 --- a/reactos/lib/rtl/amd64/unwind.c +++ b/reactos/lib/rtl/amd64/unwind.c @@ -232,7 +232,7 @@ PopReg(PCONTEXT Context, BYTE Reg) */ BOOLEAN static -inline +__inline RtlpTryToUnwindEpilog( PCONTEXT Context, ULONG64 ImageBase,