From 98797fa1bfe8e60321d45254de7d4aca86e97f35 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 29 Jul 2008 15:22:17 +0000 Subject: [PATCH] - fix InterlockedExchangeAddSizeT - fix __writecrx instrinsics - fix some mmtypes svn path=/branches/ros-amd64-bringup/; revision=34925 --- reactos/include/ddk/winddk.h | 2 +- reactos/include/ndk/amd64/mmtypes.h | 92 ++++++++++++----------------- reactos/include/ndk/arch/mmtypes.h | 4 +- reactos/include/psdk/intrin_x86.h | 17 ++++++ 4 files changed, 60 insertions(+), 55 deletions(-) diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h index a5f24146366..37df8515841 100644 --- a/reactos/include/ddk/winddk.h +++ b/reactos/include/ddk/winddk.h @@ -5772,7 +5772,7 @@ InterlockedExchangeAdd( #if defined (_M_AMD64) -#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG *)a, b) +#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b) #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a) #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a) #define InterlockedAnd _InterlockedAnd diff --git a/reactos/include/ndk/amd64/mmtypes.h b/reactos/include/ndk/amd64/mmtypes.h index 88f8c51e76f..a1af46be561 100644 --- a/reactos/include/ndk/amd64/mmtypes.h +++ b/reactos/include/ndk/amd64/mmtypes.h @@ -1,18 +1,20 @@ /*++ NDK Version: 0095 Copyright (c) Alex Ionescu. All rights reserved. +Copyright (c) Timo Kreuzer All rights reserved. Header Name: - mmtypes.h (X86) + mmtypes.h (AMD64) Abstract: - i386 Type definitions for the Memory Manager + AMD64 Type definitions for the Memory Manager Author: Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004 + Timo Kreuzer (timo.kreuzer@reactos.com) 29-Jul-2008 --*/ @@ -42,30 +44,27 @@ C_ASSERT(MM_ALLOCATION_GRANULARITY && C_ASSERT(MM_ALLOCATION_GRANULARITY >= PAGE_SIZE); #endif -// -// PAE SEG0 Base? -// -#define KSEG0_BASE_PAE 0xE0000000 - // // Page Table Entry Definitions // -typedef struct _HARDWARE_PTE_X86 +typedef struct _HARDWARE_PTE_AMD64 { - ULONG Valid:1; - ULONG Write:1; - ULONG Owner:1; - ULONG WriteThrough:1; - ULONG CacheDisable:1; - ULONG Accessed:1; - ULONG Dirty:1; - ULONG LargePage:1; - ULONG Global:1; - ULONG CopyOnWrite:1; - ULONG Prototype: 1; - ULONG reserved: 1; - ULONG PageFrameNumber:20; -} HARDWARE_PTE_X86, *PHARDWARE_PTE_X86; + ULONGLONG Valid:1; + ULONGLONG Write:1; + ULONGLONG Owner:1; + ULONGLONG WriteThrough:1; + ULONGLONG CacheDisable:1; + ULONGLONG Accessed:1; + ULONGLONG Dirty:1; + ULONGLONG LargePage:1; + ULONGLONG Global:1; + ULONGLONG CopyOnWrite:1; + ULONGLONG Prototype: 1; + ULONGLONG reserved1: 1; + ULONGLONG PageFrameNumber:40; + ULONGLONG reserved2:11; + ULONGLONG NoExecute:1; +} HARDWARE_PTE_AMD64, *PHARDWARE_PTE_AMD64; typedef struct _MMPTE_SOFTWARE { @@ -124,46 +123,33 @@ typedef struct _MMPTE_LIST typedef struct _MMPTE_HARDWARE { - ULONG Valid:1; - ULONG Write:1; - ULONG Owner:1; - ULONG WriteThrough:1; - ULONG CacheDisable:1; - ULONG Accessed:1; - ULONG Dirty:1; - ULONG LargePage:1; - ULONG Global:1; - ULONG CopyOnWrite:1; - ULONG Prototype:1; - ULONG reserved:1; - ULONG PageFrameNumber:20; + ULONGLONG Valid:1; + ULONGLONG Write:1; + ULONGLONG Owner:1; + ULONGLONG WriteThrough:1; + ULONGLONG CacheDisable:1; + ULONGLONG Accessed:1; + ULONGLONG Dirty:1; + ULONGLONG LargePage:1; + ULONGLONG Global:1; + ULONGLONG CopyOnWrite:1; + ULONGLONG Prototype: 1; + ULONGLONG reserved1: 1; + ULONGLONG PageFrameNumber:40; + ULONGLONG reserved2:11; + ULONGLONG NoExecute:1; } MMPTE_HARDWARE, *PMMPTE_HARDWARE; #else -typedef struct _MMPTE_HARDWARE -{ - ULONG Valid:1; - ULONG Writable:1; - ULONG Owner:1; - ULONG WriteThrough:1; - ULONG CacheDisable:1; - ULONG Accessed:1; - ULONG Dirty:1; - ULONG LargePage:1; - ULONG Global:1; - ULONG CopyOnWrite:1; - ULONG Prototype:1; - ULONG Write:1; - ULONG PageFrameNumber:20; -} MMPTE_HARDWARE, *PMMPTE_HARDWARE; +#error MMPTE_HARDWARE undeclared #endif // // Use the right PTE structure // -#define HARDWARE_PTE HARDWARE_PTE_X86 -#define PHARDWARE_PTE PHARDWARE_PTE_X86 +#define HARDWARE_PTE HARDWARE_PTE_AMD64 +#define PHARDWARE_PTE PHARDWARE_PTE_AMD64 #endif diff --git a/reactos/include/ndk/arch/mmtypes.h b/reactos/include/ndk/arch/mmtypes.h index 41df8085086..e83c9579e64 100644 --- a/reactos/include/ndk/arch/mmtypes.h +++ b/reactos/include/ndk/arch/mmtypes.h @@ -22,12 +22,14 @@ Author: // // Include the right file for this architecture. // -#if defined(_M_IX86) || defined(_M_AMD64) +#if defined(_M_IX86) #include #elif defined(_M_PPC) #include #elif defined(_M_ARM) #include +#elif defined(_M_AMD64) +#include #else #error "Unknown processor" #endif diff --git a/reactos/include/psdk/intrin_x86.h b/reactos/include/psdk/intrin_x86.h index 6ae583fb968..aa5ed0b4b4a 100644 --- a/reactos/include/psdk/intrin_x86.h +++ b/reactos/include/psdk/intrin_x86.h @@ -1078,6 +1078,22 @@ static __inline__ __attribute__((always_inline)) unsigned long __readcr4(void) return value; } +#ifdef _M_AMD64 +static __inline__ __attribute__((always_inline)) void __writecr0(const unsigned long long Data) +{ + __asm__("movq %q[Data], %%cr0" : : [Data] "q" (Data) : "memory"); +} + +static __inline__ __attribute__((always_inline)) void __writecr3(const unsigned long long Data) +{ + __asm__("movq %q[Data], %%cr3" : : [Data] "q" (Data) : "memory"); +} + +static __inline__ __attribute__((always_inline)) void __writecr4(const unsigned long long Data) +{ + __asm__("movq %q[Data], %%cr4" : : [Data] "q" (Data) : "memory"); +} +#else static __inline__ __attribute__((always_inline)) void __writecr0(const unsigned long long Data) { __asm__("mov %[Data], %%cr0" : : [Data] "q" ((const unsigned long)(Data & 0xFFFFFFFF)) : "memory"); @@ -1092,6 +1108,7 @@ static __inline__ __attribute__((always_inline)) void __writecr4(const unsigned { __asm__("mov %[Data], %%cr4" : : [Data] "q" ((const unsigned long)(Data & 0xFFFFFFFF)) : "memory"); } +#endif static __inline__ __attribute__((always_inline)) void __invlpg(void * const Address) {