From fee844b6ffcaf491beb3a7ec5d38e6c466fd0693 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 10 Feb 2011 10:30:43 +0000 Subject: [PATCH] Merge all amd64 related changes from cmake branch svn path=/trunk/; revision=50640 --- reactos/include/ndk/amd64/ketypes.h | 95 ++++++++++++++++++ reactos/include/xdk/amd64/ke.h | 2 +- reactos/lib/sdk/crt/except/amd64/chkstk_asm.s | 12 ++- reactos/lib/sdk/crt/except/amd64/seh.s | 49 +++++----- reactos/lib/sdk/crt/math/amd64/alldiv.S | 15 +-- reactos/lib/sdk/crt/math/amd64/atan.S | 5 +- reactos/lib/sdk/crt/math/amd64/atan2.S | 5 +- reactos/lib/sdk/crt/math/amd64/ceil.S | 4 +- reactos/lib/sdk/crt/math/amd64/ceilf.S | 5 +- reactos/lib/sdk/crt/math/amd64/exp.S | 3 +- reactos/lib/sdk/crt/math/amd64/fabs.S | 8 +- reactos/lib/sdk/crt/math/amd64/floor.S | 3 +- reactos/lib/sdk/crt/math/amd64/floorf.S | 3 +- reactos/lib/sdk/crt/math/amd64/fmod.S | 7 +- reactos/lib/sdk/crt/math/amd64/fmodf.S | 3 +- reactos/lib/sdk/crt/math/amd64/ldexp.S | 3 +- reactos/lib/sdk/crt/math/amd64/log.S | 5 +- reactos/lib/sdk/crt/math/amd64/log10.S | 4 +- reactos/lib/sdk/crt/math/amd64/pow.S | 4 +- reactos/lib/sdk/crt/math/amd64/sqrt.S | 3 +- reactos/lib/sdk/crt/math/amd64/sqrtf.S | 3 +- reactos/lib/sdk/crt/math/amd64/tan.S | 3 +- reactos/lib/sdk/crt/setjmp/amd64/setjmp.s | 97 ++++++++++--------- reactos/ntoskrnl/include/internal/amd64/mm.h | 14 ++- reactos/ntoskrnl/ke/amd64/thrdini.c | 37 +++---- reactos/ntoskrnl/ke/amd64/trap.S | 20 ++-- reactos/ntoskrnl/mm/amd64/init.c | 32 +++--- reactos/tools/rsym/rsym64.h | 1 + 28 files changed, 283 insertions(+), 162 deletions(-) diff --git a/reactos/include/ndk/amd64/ketypes.h b/reactos/include/ndk/amd64/ketypes.h index 9e9042fa19a..9a9ee6f39cc 100644 --- a/reactos/include/ndk/amd64/ketypes.h +++ b/reactos/include/ndk/amd64/ketypes.h @@ -81,6 +81,7 @@ Author: #define CR4_PGE 0x80 #define CR4_FXSR 0x200 #define CR4_XMMEXCPT 0x400 +#define CR4_CHANNELS 0x800 // // EFlags @@ -98,6 +99,39 @@ Author: #define EFLAGS_USER_SANITIZE 0x3F4DD7 #define EFLAG_SIGN 0x8000 #define EFLAG_ZERO 0x4000 +#define EFLAGS_TF_MASK 0x0100 +#define EFLAGS_TF_SHIFT 0x0008 +#define EFLAGS_ID_MASK 0x200000 +#define EFLAGS_IF_MASK 0x0200 +#define EFLAGS_IF_SHIFT 0x0009 + +// +// Machine Specific Registers +// +#define MSR_EFER 0xC0000080 +#define MSR_STAR 0xC0000081 +#define MSR_LSTAR 0xC0000082 +#define MSR_CSTAR 0xC0000083 +#define MSR_SYSCALL_MASK 0xC0000084 +#define MSR_FS_BASE 0xC0000100 +#define MSR_GS_BASE 0xC0000101 +#define MSR_GS_SWAP 0xC0000102 +#define MSR_MCG_STATUS 0x017A +#define MSR_AMD_ACCESS 0x9C5A203A + +// +// Flags in MSR_EFER +// +#define MSR_LMA 0x0400 +#define MSR_LME 0x0100 +#define MSR_SCE 0x0001 +#define MSR_NXE 0x0800 +#define MSR_PAT 0x0277 +#define MSR_DEGUG_CTL 0x01D9 +#define MSR_LAST_BRANCH_FROM 0x01DB +#define MSR_LAST_BRANCH_TO 0x01DC +#define MSR_LAST_EXCEPTION_FROM 0x01DD +#define MSR_LAST_EXCEPTION_TO 0x01DE // // IPI Types @@ -115,6 +149,15 @@ Author: #define PRCB_BUILD_DEBUG 1 #define PRCB_BUILD_UNIPROCESSOR 2 +// +// Service Table +// +#define NUMBER_SERVICE_TABLES 2 +#define SERVICE_NUMBER_MASK 0xFFF +#define SERVICE_TABLE_SHIFT 7 +#define SERVICE_TABLE_MASK 0x20 +#define SERVICE_TABLE_TEST 0x20 + // // HAL Variables // @@ -144,6 +187,8 @@ Author: #define SYNCH_LEVEL (IPI_LEVEL - 2) #endif +#define NMI_STACK_SIZE 0x2000 + // // Trap Frame Definition // @@ -863,6 +908,56 @@ typedef struct _KEXCEPTION_FRAME UINT64 Return; } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME; +typedef struct _DISPATCHER_CONTEXT +{ + ULONG64 ControlPc; + PVOID ImageBase; + PVOID FunctionEntry; + PVOID EstablisherFrame; + ULONG64 TargetIp; + PVOID ContextRecord; + PVOID LanguageHandler; + PVOID HandlerData; + PVOID HistoryTable; + ULONG ScopeIndex; +} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT; + + +typedef struct _KSTART_FRAME +{ + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5Home; + ULONG64 Return; +} KSTART_FRAME, *PKSTART_FRAME; + +typedef struct _KSWITCH_FRAME +{ + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5Home; + ULONG64 ApcBypass; + ULONG64 Rbp; + ULONG64 Return; +} KSWITCH_FRAME, *PKSWITCH_FRAME; + +typedef struct _KTIMER_TABLE_ENTRY +{ + ULONG_PTR Lock; + LIST_ENTRY Entry; + ULARGE_INTEGER Time; +} KTIMER_TABLE_ENTRY, *PKTIMER_TABLE_ENTRY; + +typedef struct _KTIMER_TABLE +{ + KTIMER* TimerExpiry[64]; + KTIMER_TABLE_ENTRY TimerEntries[256]; +} KTIMER_TABLE, *PKTIMER_TABLE; + // // Inline function to get current KPRCB // diff --git a/reactos/include/xdk/amd64/ke.h b/reactos/include/xdk/amd64/ke.h index 833aca8bee0..f63add4d7b6 100644 --- a/reactos/include/xdk/amd64/ke.h +++ b/reactos/include/xdk/amd64/ke.h @@ -67,7 +67,7 @@ KfRaiseIrql(IN KIRQL NewIrql) { KIRQL OldIrql; - OldIrql = __readcr8(); + OldIrql = (KIRQL)__readcr8(); //ASSERT(OldIrql <= NewIrql); __writecr8(NewIrql); return OldIrql; diff --git a/reactos/lib/sdk/crt/except/amd64/chkstk_asm.s b/reactos/lib/sdk/crt/except/amd64/chkstk_asm.s index b1486dea898..113b45bc100 100644 --- a/reactos/lib/sdk/crt/except/amd64/chkstk_asm.s +++ b/reactos/lib/sdk/crt/except/amd64/chkstk_asm.s @@ -10,21 +10,25 @@ #include +/* CODE **********************************************************************/ +.code64 PUBLIC MsgUnimplemented MsgUnimplemented: .asciz "WARNING: %s at %s:%d is UNIMPLEMENTED!\n" -.proc _chkstk +FUNC _chkstk + .endprolog UNIMPLEMENTED chkstk ret -.endp +ENDFUNC _chkstk -.proc _alloca_probe +FUNC _alloca_probe + .endprolog UNIMPLEMENTED alloca_probe ret -.endp +ENDFUNC _alloca_probe END /* EOF */ diff --git a/reactos/lib/sdk/crt/except/amd64/seh.s b/reactos/lib/sdk/crt/except/amd64/seh.s index 9d44d3ffd4d..b714dda8ef9 100644 --- a/reactos/lib/sdk/crt/except/amd64/seh.s +++ b/reactos/lib/sdk/crt/except/amd64/seh.s @@ -17,42 +17,43 @@ /* GLOBALS *******************************************************************/ -.globl _global_unwind2 -.globl _local_unwind2 -.globl _abnormal_termination -.globl _except_handler2 -.globl _except_handler3 +PUBLIC _global_unwind2 +PUBLIC _local_unwind2 +PUBLIC _abnormal_termination +PUBLIC _except_handler2 +PUBLIC _except_handler3 -/* FUNCTIONS *****************************************************************/ +/* CODE **********************************************************************/ +.code64 -.func _unwind_handler -_unwind_handler: +FUNC _unwind_handler + .endprolog ret -.endfunc +ENDFUNC _unwind_handler -.func _global_unwind2 -_global_unwind2: +FUNC _global_unwind2 + .endprolog ret -.endfunc +ENDFUNC _global_unwind2 -.func _abnormal_termination -_abnormal_termination: +FUNC _abnormal_termination + .endprolog ret -.endfunc +ENDFUNC _abnormal_termination -.func _local_unwind2 -_local_unwind2: +FUNC _local_unwind2 + .endprolog ret -.endfunc +ENDFUNC _local_unwind2 -.func _except_handler2 -_except_handler2: +FUNC _except_handler2 + .endprolog ret -.endfunc +ENDFUNC _except_handler2 -.func _except_handler3 -_except_handler3: +FUNC _except_handler3 + .endprolog ret -.endfunc +ENDFUNC _except_handler3 END diff --git a/reactos/lib/sdk/crt/math/amd64/alldiv.S b/reactos/lib/sdk/crt/math/amd64/alldiv.S index b4018cc4739..f4608b2102a 100644 --- a/reactos/lib/sdk/crt/math/amd64/alldiv.S +++ b/reactos/lib/sdk/crt/math/amd64/alldiv.S @@ -10,18 +10,21 @@ #include -/* DATA *********************************************************************/ +/* DATA **********************************************************************/ +.code64 PUBLIC _fltused _fltused: - .long 0x9875 - -/* FUNCTIONS ****************************************************************/ + .long HEX(9875) +/* CODE **********************************************************************/ .code64 -.proc alldiv +FUNC alldiv + .endprolog UNIMPLEMENTED alldiv ret -.endp alldiv +ENDFUNC alldiv + +END diff --git a/reactos/lib/sdk/crt/math/amd64/atan.S b/reactos/lib/sdk/crt/math/amd64/atan.S index 889f10e2825..b649ec0398a 100644 --- a/reactos/lib/sdk/crt/math/amd64/atan.S +++ b/reactos/lib/sdk/crt/math/amd64/atan.S @@ -11,11 +11,12 @@ #include #include -/* FUNCTIONS ****************************************************************/ - +/* CODE **********************************************************************/ .code64 PUBLIC atan atan: UNIMPLEMENTED atan ret + +END diff --git a/reactos/lib/sdk/crt/math/amd64/atan2.S b/reactos/lib/sdk/crt/math/amd64/atan2.S index fd611101f0a..bccaeaf9a3d 100644 --- a/reactos/lib/sdk/crt/math/amd64/atan2.S +++ b/reactos/lib/sdk/crt/math/amd64/atan2.S @@ -11,11 +11,12 @@ #include #include -/* FUNCTIONS ****************************************************************/ - +/* CODE **********************************************************************/ .code64 PUBLIC atan2 atan2: UNIMPLEMENTED atan2 ret + +END diff --git a/reactos/lib/sdk/crt/math/amd64/ceil.S b/reactos/lib/sdk/crt/math/amd64/ceil.S index 17ae0150717..c5b7d6dfc63 100644 --- a/reactos/lib/sdk/crt/math/amd64/ceil.S +++ b/reactos/lib/sdk/crt/math/amd64/ceil.S @@ -11,8 +11,7 @@ #include #include -/* FUNCTIONS ****************************************************************/ - +/* CODE **********************************************************************/ .code64 PUBLIC ceil @@ -20,3 +19,4 @@ ceil: UNIMPLEMENTED ceil ret +END diff --git a/reactos/lib/sdk/crt/math/amd64/ceilf.S b/reactos/lib/sdk/crt/math/amd64/ceilf.S index 2b2d14b03f0..fd04e4da046 100644 --- a/reactos/lib/sdk/crt/math/amd64/ceilf.S +++ b/reactos/lib/sdk/crt/math/amd64/ceilf.S @@ -11,8 +11,7 @@ #include #include -/* FUNCTIONS ****************************************************************/ - +/* CODE **********************************************************************/ .code64 PUBLIC ceilf @@ -39,7 +38,7 @@ ceilf: fstp dword ptr [rsp] movss xmm0, [rsp] - + add rsp, 16 ret diff --git a/reactos/lib/sdk/crt/math/amd64/exp.S b/reactos/lib/sdk/crt/math/amd64/exp.S index 44b324e4267..8fda82ba07b 100644 --- a/reactos/lib/sdk/crt/math/amd64/exp.S +++ b/reactos/lib/sdk/crt/math/amd64/exp.S @@ -11,8 +11,7 @@ #include #include -/* FUNCTIONS ****************************************************************/ - +/* CODE **********************************************************************/ .code64 PUBLIC exp diff --git a/reactos/lib/sdk/crt/math/amd64/fabs.S b/reactos/lib/sdk/crt/math/amd64/fabs.S index 3c1e8f2dcf1..84452dc1942 100644 --- a/reactos/lib/sdk/crt/math/amd64/fabs.S +++ b/reactos/lib/sdk/crt/math/amd64/fabs.S @@ -10,12 +10,12 @@ #include -/* FUNCTIONS ****************************************************************/ - +/* CODE **********************************************************************/ .code64 -PUBLIC fabs -fabs: +PUBLIC _fabs +_fabs: UNIMPLEMENTED fabs ret +END diff --git a/reactos/lib/sdk/crt/math/amd64/floor.S b/reactos/lib/sdk/crt/math/amd64/floor.S index c0fba3dd066..ee39d77955f 100644 --- a/reactos/lib/sdk/crt/math/amd64/floor.S +++ b/reactos/lib/sdk/crt/math/amd64/floor.S @@ -11,8 +11,7 @@ #include #include -/* FUNCTIONS ****************************************************************/ - +/* CODE **********************************************************************/ .code64 PUBLIC floor diff --git a/reactos/lib/sdk/crt/math/amd64/floorf.S b/reactos/lib/sdk/crt/math/amd64/floorf.S index 0ac9098b9a3..bfb35816f47 100644 --- a/reactos/lib/sdk/crt/math/amd64/floorf.S +++ b/reactos/lib/sdk/crt/math/amd64/floorf.S @@ -11,8 +11,7 @@ #include #include -/* FUNCTIONS ****************************************************************/ - +/* CODE **********************************************************************/ .code64 PUBLIC floorf diff --git a/reactos/lib/sdk/crt/math/amd64/fmod.S b/reactos/lib/sdk/crt/math/amd64/fmod.S index 697257ab368..5117d8bc358 100644 --- a/reactos/lib/sdk/crt/math/amd64/fmod.S +++ b/reactos/lib/sdk/crt/math/amd64/fmod.S @@ -10,10 +10,11 @@ #include -/* DATA *********************************************************************/ +/* CODE **********************************************************************/ +.code64 -PUBLIC fmod -fmod: +PUBLIC _fmod +_fmod: UNIMPLEMENTED fmod ret diff --git a/reactos/lib/sdk/crt/math/amd64/fmodf.S b/reactos/lib/sdk/crt/math/amd64/fmodf.S index d0e24ef9529..711ef59f6ad 100644 --- a/reactos/lib/sdk/crt/math/amd64/fmodf.S +++ b/reactos/lib/sdk/crt/math/amd64/fmodf.S @@ -10,7 +10,8 @@ #include -/* DATA *********************************************************************/ +/* CODE **********************************************************************/ +.code64 PUBLIC fmodf fmodf: diff --git a/reactos/lib/sdk/crt/math/amd64/ldexp.S b/reactos/lib/sdk/crt/math/amd64/ldexp.S index a83660ae7a3..4635d754e27 100644 --- a/reactos/lib/sdk/crt/math/amd64/ldexp.S +++ b/reactos/lib/sdk/crt/math/amd64/ldexp.S @@ -10,7 +10,8 @@ #include -/* DATA *********************************************************************/ +/* CODE **********************************************************************/ +.code64 PUBLIC ldexp ldexp: diff --git a/reactos/lib/sdk/crt/math/amd64/log.S b/reactos/lib/sdk/crt/math/amd64/log.S index 1289a745cba..f7ffc57f612 100644 --- a/reactos/lib/sdk/crt/math/amd64/log.S +++ b/reactos/lib/sdk/crt/math/amd64/log.S @@ -10,9 +10,12 @@ #include -/* DATA *********************************************************************/ +/* CODE **********************************************************************/ +.code64 PUBLIC log log: UNIMPLEMENTED log ret + +END diff --git a/reactos/lib/sdk/crt/math/amd64/log10.S b/reactos/lib/sdk/crt/math/amd64/log10.S index f8014aa5bc6..5038d178530 100644 --- a/reactos/lib/sdk/crt/math/amd64/log10.S +++ b/reactos/lib/sdk/crt/math/amd64/log10.S @@ -10,10 +10,12 @@ #include -/* DATA *********************************************************************/ +/* CODE **********************************************************************/ +.code64 PUBLIC log10 log10: UNIMPLEMENTED log10 ret +END diff --git a/reactos/lib/sdk/crt/math/amd64/pow.S b/reactos/lib/sdk/crt/math/amd64/pow.S index 48adf3961f3..fd8d104ee4e 100644 --- a/reactos/lib/sdk/crt/math/amd64/pow.S +++ b/reactos/lib/sdk/crt/math/amd64/pow.S @@ -11,10 +11,12 @@ #include #include -/* DATA *********************************************************************/ +/* CODE **********************************************************************/ +.code64 PUBLIC pow pow: UNIMPLEMENTED pow ret +END diff --git a/reactos/lib/sdk/crt/math/amd64/sqrt.S b/reactos/lib/sdk/crt/math/amd64/sqrt.S index 282419e78a5..4c234eb0739 100644 --- a/reactos/lib/sdk/crt/math/amd64/sqrt.S +++ b/reactos/lib/sdk/crt/math/amd64/sqrt.S @@ -11,7 +11,8 @@ #include #include -/* DATA *********************************************************************/ +/* CODE **********************************************************************/ +.code64 PUBLIC sqrt sqrt: diff --git a/reactos/lib/sdk/crt/math/amd64/sqrtf.S b/reactos/lib/sdk/crt/math/amd64/sqrtf.S index da75fcf42f5..e4d35085d8f 100644 --- a/reactos/lib/sdk/crt/math/amd64/sqrtf.S +++ b/reactos/lib/sdk/crt/math/amd64/sqrtf.S @@ -11,7 +11,8 @@ #include #include -/* DATA *********************************************************************/ +/* CODE **********************************************************************/ +.code64 PUBLIC sqrtf sqrtf: diff --git a/reactos/lib/sdk/crt/math/amd64/tan.S b/reactos/lib/sdk/crt/math/amd64/tan.S index 93e5d01d762..53d82877e86 100644 --- a/reactos/lib/sdk/crt/math/amd64/tan.S +++ b/reactos/lib/sdk/crt/math/amd64/tan.S @@ -11,7 +11,8 @@ #include #include -/* DATA *********************************************************************/ +/* CODE **********************************************************************/ +.code64 PUBLIC tan tan: diff --git a/reactos/lib/sdk/crt/setjmp/amd64/setjmp.s b/reactos/lib/sdk/crt/setjmp/amd64/setjmp.s index a969bc43db5..3c4b449c621 100644 --- a/reactos/lib/sdk/crt/setjmp/amd64/setjmp.s +++ b/reactos/lib/sdk/crt/setjmp/amd64/setjmp.s @@ -11,41 +11,45 @@ #include #include -#define JUMP_BUFFER_Frame 0x00 -#define JUMP_BUFFER_Rbx 0x08 -#define JUMP_BUFFER_Rsp 0x10 -#define JUMP_BUFFER_Rbp 0x18 -#define JUMP_BUFFER_Rsi 0x20 -#define JUMP_BUFFER_Rdi 0x28 -#define JUMP_BUFFER_R12 0x30 -#define JUMP_BUFFER_R13 0x38 -#define JUMP_BUFFER_R14 0x40 -#define JUMP_BUFFER_R15 0x48 -#define JUMP_BUFFER_Rip 0x50 -#define JUMP_BUFFER_Spare 0x58 -#define JUMP_BUFFER_Xmm6 0x60 -#define JUMP_BUFFER_Xmm7 0x70 -#define JUMP_BUFFER_Xmm8 0x80 -#define JUMP_BUFFER_Xmm9 0x90 -#define JUMP_BUFFER_Xmm10 0xa0 -#define JUMP_BUFFER_Xmm11 0xb0 -#define JUMP_BUFFER_Xmm12 0xc0 -#define JUMP_BUFFER_Xmm13 0xd0 -#define JUMP_BUFFER_Xmm14 0xe0 -#define JUMP_BUFFER_Xmm15 0xf0 +#define JUMP_BUFFER_Frame 0 /* 0x00 */ +#define JUMP_BUFFER_Rbx 8 /* 0x08 */ +#define JUMP_BUFFER_Rsp 16 /* 0x10 */ +#define JUMP_BUFFER_Rbp 24 /* 0x18 */ +#define JUMP_BUFFER_Rsi 32 /* 0x20 */ +#define JUMP_BUFFER_Rdi 40 /* 0x28 */ +#define JUMP_BUFFER_R12 48 /* 0x30 */ +#define JUMP_BUFFER_R13 56 /* 0x38 */ +#define JUMP_BUFFER_R14 64 /* 0x40 */ +#define JUMP_BUFFER_R15 72 /* 0x48 */ +#define JUMP_BUFFER_Rip 80 /* 0x50 */ +#define JUMP_BUFFER_Spare 88 /* 0x58 */ +#define JUMP_BUFFER_Xmm6 96 /* 0x60 */ +#define JUMP_BUFFER_Xmm7 112 /* 0x70 */ +#define JUMP_BUFFER_Xmm8 128 /* 0x80 */ +#define JUMP_BUFFER_Xmm9 144 /* 0x90 */ +#define JUMP_BUFFER_Xmm10 160 /* 0xa0 */ +#define JUMP_BUFFER_Xmm11 176 /* 0xb0 */ +#define JUMP_BUFFER_Xmm12 192 /* 0xc0 */ +#define JUMP_BUFFER_Xmm13 208 /* 0xd0 */ +#define JUMP_BUFFER_Xmm14 224 /* 0xe0 */ +#define JUMP_BUFFER_Xmm15 240 /* 0xf0 */ /* FUNCTIONS ******************************************************************/ +.code64 -/* +/*! * int _setjmp(jmp_buf env); * - * Parameters: - jmp_buf env - * Returns: 0 - * Notes: Sets up the jmp_buf + * \param - jmp_buf env + * \return 0 + * \note Sets up the jmp_buf */ PUBLIC _setjmp -.proc _setjmp +FUNC _setjmp + + .endprolog + /* Load rsp as it was before the call into rax */ lea rax, [rsp + 8] /* Load return address into r8 */ @@ -73,18 +77,21 @@ PUBLIC _setjmp movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15 xor rax, rax ret -.endp setjmp +ENDFUNC _setjmp -/* +/*! * int _setjmpex(jmp_buf _Buf,void *_Ctx); * - * Parameters: - jmp_buf env - * - frame - * Returns: 0 - * Notes: Sets up the jmp_buf + * \param - jmp_buf env + * \param - frame + * \return 0 + * \note Sets up the jmp_buf */ PUBLIC _setjmpex -.proc _setjmpex +FUNC _setjmpex + + .endprolog + /* Load rsp as it was before the call into rax */ lea rax, [rsp + 8] /* Load return address into r8 */ @@ -112,19 +119,21 @@ PUBLIC _setjmpex movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15 xor rax, rax ret -.endp setjmpex +ENDFUNC _setjmpex -/* +/*! * void longjmp(jmp_buf env, int value); * - * Parameters: - jmp_buf setup by _setjmp - * - int value to return - * Returns: Doesn't return - * Notes: Non-local goto + * \param - jmp_buf setup by _setjmp + * \param - int value to return + * \return Doesn't return + * \note Non-local goto */ PUBLIC longjmp -.proc longjmp +FUNC longjmp + + .endprolog // FIXME: handle frame @@ -152,9 +161,9 @@ PUBLIC longjmp /* return param2 or 1 if it was 0 */ mov rax, rdx test rax, rax - jnz 2f + jnz l2 inc rax -2: jmp r8 -.endp longjmp +l2: jmp r8 +ENDFUNC longjmp END diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index d6343ed2d2c..38380cfd90e 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -131,6 +131,7 @@ MiPteToAddress(PMMPTE Pte) Temp >>= 16; return (PVOID)Temp; } +#define MiPdeToAddress MiPteToAddress BOOLEAN FORCEINLINE @@ -157,8 +158,6 @@ VOID MI_MAKE_PROTOTYPE_PTE(IN PMMPTE NewPte, IN PMMPTE PointerPte) { - ULONG_PTR Offset; - /* Store the Address */ NewPte->u.Long = (ULONG64)PointerPte; @@ -197,9 +196,11 @@ MmInitGlobalKernelPageDirectory(VOID) // FIXME, only copied from x86 #define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.Global = 0) #define MI_MAKE_DIRTY_PAGE(x) ((x)->u.Hard.Dirty = 1) +#define MI_MAKE_ACCESSED_PAGE(x) ((x)->u.Hard.Accessed = 1) #define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.CacheDisable = 1) #define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.WriteThrough = 1) #define MI_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.WriteThrough = 0) +#define MI_IS_PAGE_LARGE(x) ((x)->u.Hard.LargePage == 1) #if !defined(CONFIG_SMP) #define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.Write == 1) #else @@ -231,8 +232,13 @@ MmInitGlobalKernelPageDirectory(VOID) #define MI_MAPPING_RANGE_START (ULONG)HYPER_SPACE #define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \ MI_HYPERSPACE_PTES * PAGE_SIZE) -#define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \ - PAGE_SIZE) +#define MI_DUMMY_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \ + PAGE_SIZE) +#define MI_VAD_BITMAP (PMMPTE)(MI_DUMMY_PTE + \ + PAGE_SIZE) +#define MI_WORKING_SET_LIST (PMMPTE)(MI_VAD_BITMAP + \ + PAGE_SIZE) + /* On x86, these two are the same */ #define MMPDE MMPTE diff --git a/reactos/ntoskrnl/ke/amd64/thrdini.c b/reactos/ntoskrnl/ke/amd64/thrdini.c index 616cd303264..ce81b1398d6 100644 --- a/reactos/ntoskrnl/ke/amd64/thrdini.c +++ b/reactos/ntoskrnl/ke/amd64/thrdini.c @@ -12,24 +12,9 @@ #define NDEBUG #include -typedef struct _KSWITCHFRAME -{ - PVOID ExceptionList; - BOOLEAN ApcBypassDisable; - PVOID RetAddr; -} KSWITCHFRAME, *PKSWITCHFRAME; - -typedef struct _KSTART_FRAME -{ - PKSYSTEM_ROUTINE SystemRoutine; - PKSTART_ROUTINE StartRoutine; - PVOID StartContext; - BOOLEAN UserThread; -} KSTART_FRAME, *PKSTART_FRAME; - typedef struct _KUINIT_FRAME { - KSWITCHFRAME CtxSwitchFrame; + KSWITCH_FRAME CtxSwitchFrame; KSTART_FRAME StartFrame; KTRAP_FRAME TrapFrame; //FX_SAVE_AREA FxSaveArea; @@ -37,7 +22,7 @@ typedef struct _KUINIT_FRAME typedef struct _KKINIT_FRAME { - KSWITCHFRAME CtxSwitchFrame; + KSWITCH_FRAME CtxSwitchFrame; KSTART_FRAME StartFrame; //FX_SAVE_AREA FxSaveArea; } KKINIT_FRAME, *PKKINIT_FRAME; @@ -55,7 +40,7 @@ KiInitializeContextThread(IN PKTHREAD Thread, //PFX_SAVE_AREA FxSaveArea; //PFXSAVE_FORMAT FxSaveFormat; PKSTART_FRAME StartFrame; - PKSWITCHFRAME CtxSwitchFrame; + PKSWITCH_FRAME CtxSwitchFrame; PKTRAP_FRAME TrapFrame; CONTEXT LocalContext; PCONTEXT Context = NULL; @@ -140,7 +125,7 @@ KiInitializeContextThread(IN PKTHREAD Thread, Thread->PreviousMode = UserMode; /* Tell KiThreadStartup of that too */ - StartFrame->UserThread = TRUE; +// StartFrame->UserThread = TRUE; } else { @@ -170,18 +155,18 @@ KiInitializeContextThread(IN PKTHREAD Thread, Thread->PreviousMode = KernelMode; /* Tell KiThreadStartup of that too */ - StartFrame->UserThread = FALSE; +// StartFrame->UserThread = FALSE; } /* Now setup the remaining data for KiThreadStartup */ - StartFrame->StartContext = StartContext; - StartFrame->StartRoutine = StartRoutine; - StartFrame->SystemRoutine = SystemRoutine; +// StartFrame->StartContext = StartContext; +// StartFrame->StartRoutine = StartRoutine; +// StartFrame->SystemRoutine = SystemRoutine; /* And set up the Context Switch Frame */ - CtxSwitchFrame->RetAddr = KiThreadStartup; - CtxSwitchFrame->ApcBypassDisable = TRUE; - CtxSwitchFrame->ExceptionList = EXCEPTION_CHAIN_END;; +// CtxSwitchFrame->RetAddr = KiThreadStartup; +// CtxSwitchFrame->ApcBypassDisable = TRUE; +// CtxSwitchFrame->ExceptionList = EXCEPTION_CHAIN_END;; /* Save back the new value of the kernel stack. */ Thread->KernelStack = (PVOID)CtxSwitchFrame; diff --git a/reactos/ntoskrnl/ke/amd64/trap.S b/reactos/ntoskrnl/ke/amd64/trap.S index 2b95b42894d..e0831d24f1e 100644 --- a/reactos/ntoskrnl/ke/amd64/trap.S +++ b/reactos/ntoskrnl/ke/amd64/trap.S @@ -76,7 +76,7 @@ ENDM #define TRAPFLAG_SYSTEMSERVICE (TRAPFLAG_VOLATILES|TRAPFLAG_DEBUG) #define TRAPFLAG_ALL HEX(ff) -/* +/* * Stack Layout: * |-------------------| * | KTRAP_FRAME | @@ -89,7 +89,7 @@ ENDM */ /* - * ENTER_TRAP_FRAME - Allocate SIZE_KTRAP_FRAME and save registers to it + * ENTER_TRAP_FRAME - Allocate KTRAP_FRAME_LENGTH and save registers to it */ MACRO(ENTER_TRAP_FRAME, Flags) LOCAL dont_swap @@ -107,8 +107,8 @@ else endif /* Make room for a KTRAP_FRAME */ - sub rsp, (SIZE_KTRAP_FRAME - SIZE_INITIAL_FRAME) - .allocstack (SIZE_KTRAP_FRAME - SIZE_INITIAL_FRAME) + sub rsp, (KTRAP_FRAME_LENGTH - SIZE_INITIAL_FRAME) + .allocstack (KTRAP_FRAME_LENGTH - SIZE_INITIAL_FRAME) .endprolog /* Save rbp */ @@ -278,12 +278,12 @@ ENDR .PROC InternalDispatchException /* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */ - sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME - .allocstack (SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME) + sub rsp, EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH + .allocstack (EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH) .endprolog /* Set up EXCEPTION_RECORD */ - lea rcx, [rsp + SIZE_KEXCEPTION_FRAME] + lea rcx, [rsp + KEXCEPTION_FRAME_LENGTH] mov [rcx + EXCEPTION_RECORD_ExceptionCode], eax xor rax, rax mov [rcx + EXCEPTION_RECORD_ExceptionFlags], eax @@ -341,7 +341,7 @@ ENDR movdqa xmm14, [rsp + KEXCEPTION_FRAME_Xmm14] movdqa xmm15, [rsp + KEXCEPTION_FRAME_Xmm15] - add rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME + add rsp, EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH ret .ENDP InternalDispatchException @@ -516,7 +516,7 @@ PUBLIC KiInvalidOpcodeFault KiInvalidOpcodeKernel: /* Kernel mode fault */ - + /* Dispatch the exception */ mov eax, STATUS_ILLEGAL_INSTRUCTION mov edx, 3 @@ -837,7 +837,7 @@ PUBLIC KiRaiseAssertion mov r10, 0 mov r11, 0 call InternalDispatchException - + LEAVE_TRAP_FRAME iretq .ENDP KiRaiseAssertion diff --git a/reactos/ntoskrnl/mm/amd64/init.c b/reactos/ntoskrnl/mm/amd64/init.c index 3211b99440d..bf2dad4a894 100644 --- a/reactos/ntoskrnl/mm/amd64/init.c +++ b/reactos/ntoskrnl/mm/amd64/init.c @@ -27,10 +27,16 @@ HalInitializeBios(ULONG Unknown, PLOADER_PARAMETER_BLOCK LoaderBlock); /* GLOBALS *****************************************************************/ /* Template PTE and PDE for a kernel page */ -MMPTE ValidKernelPde = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; -MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; -MMPDE DemandZeroPde = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)}; -MMPTE PrototypePte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | PTE_PROTOTYPE | 0xFFFFF000}; +MMPTE ValidKernelPde = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}}; +MMPTE ValidKernelPte = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}}; + +/* Template PDE for a demand-zero page */ +MMPDE DemandZeroPde = {{MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS}}; +MMPTE DemandZeroPte = {{MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS}}; + +/* Template PTE for prototype page */ +MMPTE PrototypePte = {{(MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | + PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << PAGE_SHIFT)}}; /* Sizes */ ///SIZE_T MmSessionSize = MI_SESSION_SIZE; @@ -413,7 +419,7 @@ MiInitializePageTable() TmplPte.u.Flush.Write = 1; HyperTemplatePte = TmplPte; - /* Create PDPTs (72 KB) for shared system address space, + /* Create PDPTs (72 KB) for shared system address space, * skip page tables and hyperspace */ /* Loop the PXEs */ @@ -492,7 +498,7 @@ MiBuildNonPagedPool(VOID) /* Page-align the nonpaged pool size */ MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1); - + /* Now, check if there was a registry size for the maximum size */ if (!MmMaximumNonPagedPoolInBytes) { @@ -501,7 +507,7 @@ MiBuildNonPagedPool(VOID) MmMaximumNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) / 256 * MmMaxAdditionNonPagedPoolPerMb; } - + /* Don't let the maximum go too high */ if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE) { @@ -517,7 +523,7 @@ MiBuildNonPagedPool(VOID) { /* Put non paged pool after the PFN database */ MmNonPagedPoolStart = (PCHAR)MmPfnDatabase + MxPfnSizeInBytes; - MmMaximumNonPagedPoolInBytes = (ULONG64)MmNonPagedPoolEnd - + MmMaximumNonPagedPoolInBytes = (ULONG64)MmNonPagedPoolEnd - (ULONG64)MmNonPagedPoolStart; } @@ -688,7 +694,7 @@ MiBuildPagedPool_x(VOID) PMMPTE Pte; MMPTE TmplPte; ULONG Size, BitMapSize; - + /* Default size for paged pool is 4 times non paged pool */ MmSizeOfPagedPoolInBytes = 4 * MmMaximumNonPagedPoolInBytes; @@ -767,7 +773,7 @@ MiBuildPagedPool_x(VOID) // Allocate the allocation bitmap, which tells us which regions have not yet // been mapped into memory - MmPagedPoolInfo.PagedPoolAllocationMap = + MmPagedPoolInfo.PagedPoolAllocationMap = ExAllocatePoolWithTag(NonPagedPool, Size, ' mM'); ASSERT(MmPagedPoolInfo.PagedPoolAllocationMap); @@ -783,7 +789,7 @@ MiBuildPagedPool_x(VOID) // Given the allocation bitmap and a base address, we can therefore figure // out which page is the last page of that allocation, and thus how big the // entire allocation is. - MmPagedPoolInfo.EndOfPagedPoolBitmap = + MmPagedPoolInfo.EndOfPagedPoolBitmap = ExAllocatePoolWithTag(NonPagedPool, Size, ' mM'); ASSERT(MmPagedPoolInfo.EndOfPagedPoolBitmap); @@ -859,7 +865,7 @@ MmArmInitSystem_x(IN ULONG Phase, //MmPagedPoolSize = MM_PAGED_POOL_SIZE; //ASSERT((PCHAR)MmPagedPoolBase + MmPagedPoolSize < (PCHAR)MmNonPagedSystemStart); - + HalInitializeBios(0, LoaderBlock); } @@ -871,7 +877,7 @@ FASTCALL MiSyncARM3WithROS(IN PVOID AddressStart, IN PVOID AddressEnd) { - + } NTSTATUS diff --git a/reactos/tools/rsym/rsym64.h b/reactos/tools/rsym/rsym64.h index cae44f545b4..0249ebc7945 100644 --- a/reactos/tools/rsym/rsym64.h +++ b/reactos/tools/rsym/rsym64.h @@ -10,6 +10,7 @@ typedef uint64_t ULONG64; #endif +#define IMAGE_FILE_MACHINE_I386 0x14c #define IMAGE_FILE_MACHINE_AMD64 0x8664 #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3