From e88b1c8624b445bf9509a05288b599de3b7bf49e Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 6 Feb 2009 13:04:18 +0000 Subject: [PATCH] merge from amd64 branch: 37868: Add CONTEXT flags for x64 (Timo Kreuzer) 39346: Use intrinsics for rtl byteswap functions for GNUC, too. Only include them if NTOS_MODE_USER. (Timo Kreuzer) 39347: Move rtl byteswap functions to wdm.h and add intrinsic definitions (Timo Kreuzer) svn path=/trunk/; revision=39439 --- reactos/include/ddk/wdm.h | 43 ++++++++++++++++++++++++++++++++++ reactos/include/ddk/winddk.h | 32 +++++++++++++------------ reactos/include/ndk/rtlfuncs.h | 11 +++++++++ 3 files changed, 71 insertions(+), 15 deletions(-) diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 72e901e51ff..660958e96a4 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -646,5 +646,48 @@ typedef struct _QUOTA_LIMITS { #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 +// +// Byte Swap Functions +// +#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \ + ((defined(_M_AMD64) || \ + defined(_M_IA64)) && (_MSC_FULL_VER > 13009175)) + +unsigned short __cdecl _byteswap_ushort(unsigned short); +unsigned long __cdecl _byteswap_ulong (unsigned long); +unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64); +#pragma intrinsic(_byteswap_ushort) +#pragma intrinsic(_byteswap_ulong) +#pragma intrinsic(_byteswap_uint64) +#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x)) +#define RtlUlongByteSwap(_x) _byteswap_ulong((_x)) +#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x)) + +#elif defined(__GNUC__) + +#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x)) +#define RtlUlongByteSwap(_x) _byteswap_ulong((_x)) +#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x)) + +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +USHORT +FASTCALL +RtlUshortByteSwap(IN USHORT Source); + +NTSYSAPI +ULONG +FASTCALL +RtlUlongByteSwap(IN ULONG Source); + +NTSYSAPI +ULONGLONG +FASTCALL +RtlUlonglongByteSwap(IN ULONGLONG Source); +#endif + +#endif #endif // _WDMDDK_ diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h index 669547feac4..bd3f5691c77 100644 --- a/reactos/include/ddk/winddk.h +++ b/reactos/include/ddk/winddk.h @@ -5632,6 +5632,23 @@ extern NTKERNELAPI ULONG_PTR MmUserProbeAddress; #elif defined(__x86_64__) +#define CONTEXT_AMD64 0x100000 +#if !defined(RC_INVOKED) +#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) +#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) +#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) +#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) + +#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) +#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) + +#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 +#define CONTEXT_SERVICE_ACTIVE 0x10000000 +#define CONTEXT_EXCEPTION_REQUEST 0x40000000 +#define CONTEXT_EXCEPTION_REPORTING 0x80000000 +#endif + typedef struct DECLSPEC_ALIGN(16) _M128A { ULONGLONG Low; LONGLONG High; @@ -7166,16 +7183,6 @@ RtlTimeToTimeFields( IN PLARGE_INTEGER Time, IN PTIME_FIELDS TimeFields); -ULONG -FASTCALL -RtlUlongByteSwap( - IN ULONG Source); - -ULONGLONG -FASTCALL -RtlUlonglongByteSwap( - IN ULONGLONG Source); - #define RtlUnicodeStringToAnsiSize(STRING) ( \ NLS_MB_CODE_PAGE_TAG ? \ RtlxUnicodeStringToAnsiSize(STRING) : \ @@ -7247,11 +7254,6 @@ RtlUpperString( IN OUT PSTRING DestinationString, IN PSTRING SourceString); -USHORT -FASTCALL -RtlUshortByteSwap( - IN USHORT Source); - NTSYSAPI BOOLEAN NTAPI diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 8f2c85f6686..8203b5e600f 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -1370,6 +1370,8 @@ RtlCharToInteger( // // Byte Swap Functions // +#ifdef NTOS_MODE_USER + #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \ ((defined(_M_AMD64) || \ defined(_M_IA64)) && (_MSC_FULL_VER > 13009175)) @@ -1384,8 +1386,15 @@ unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64); #define RtlUlongByteSwap(_x) _byteswap_ulong((_x)) #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x)) +#elif defined (__GNUC__) + +#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x)) +#define RtlUlongByteSwap(_x) _byteswap_ulong((_x)) +#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x)) + #else +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSAPI USHORT FASTCALL @@ -1400,8 +1409,10 @@ NTSYSAPI ULONGLONG FASTCALL RtlUlonglongByteSwap(IN ULONGLONG Source); +#endif #endif +#endif // NTOS_MODE_USER // // Unicode->Ansi String Functions