Merge all amd64 related changes from cmake branch

svn path=/trunk/; revision=50640
This commit is contained in:
Timo Kreuzer 2011-02-10 10:30:43 +00:00
parent 7c7511301a
commit fee844b6ff
28 changed files with 283 additions and 162 deletions

View file

@ -81,6 +81,7 @@ Author:
#define CR4_PGE 0x80 #define CR4_PGE 0x80
#define CR4_FXSR 0x200 #define CR4_FXSR 0x200
#define CR4_XMMEXCPT 0x400 #define CR4_XMMEXCPT 0x400
#define CR4_CHANNELS 0x800
// //
// EFlags // EFlags
@ -98,6 +99,39 @@ Author:
#define EFLAGS_USER_SANITIZE 0x3F4DD7 #define EFLAGS_USER_SANITIZE 0x3F4DD7
#define EFLAG_SIGN 0x8000 #define EFLAG_SIGN 0x8000
#define EFLAG_ZERO 0x4000 #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 // IPI Types
@ -115,6 +149,15 @@ Author:
#define PRCB_BUILD_DEBUG 1 #define PRCB_BUILD_DEBUG 1
#define PRCB_BUILD_UNIPROCESSOR 2 #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 // HAL Variables
// //
@ -144,6 +187,8 @@ Author:
#define SYNCH_LEVEL (IPI_LEVEL - 2) #define SYNCH_LEVEL (IPI_LEVEL - 2)
#endif #endif
#define NMI_STACK_SIZE 0x2000
// //
// Trap Frame Definition // Trap Frame Definition
// //
@ -863,6 +908,56 @@ typedef struct _KEXCEPTION_FRAME
UINT64 Return; UINT64 Return;
} KEXCEPTION_FRAME, *PKEXCEPTION_FRAME; } 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 // Inline function to get current KPRCB
// //

View file

@ -67,7 +67,7 @@ KfRaiseIrql(IN KIRQL NewIrql)
{ {
KIRQL OldIrql; KIRQL OldIrql;
OldIrql = __readcr8(); OldIrql = (KIRQL)__readcr8();
//ASSERT(OldIrql <= NewIrql); //ASSERT(OldIrql <= NewIrql);
__writecr8(NewIrql); __writecr8(NewIrql);
return OldIrql; return OldIrql;

View file

@ -10,21 +10,25 @@
#include <asm.inc> #include <asm.inc>
/* CODE **********************************************************************/
.code64
PUBLIC MsgUnimplemented PUBLIC MsgUnimplemented
MsgUnimplemented: MsgUnimplemented:
.asciz "WARNING: %s at %s:%d is UNIMPLEMENTED!\n" .asciz "WARNING: %s at %s:%d is UNIMPLEMENTED!\n"
.proc _chkstk FUNC _chkstk
.endprolog
UNIMPLEMENTED chkstk UNIMPLEMENTED chkstk
ret ret
.endp ENDFUNC _chkstk
.proc _alloca_probe FUNC _alloca_probe
.endprolog
UNIMPLEMENTED alloca_probe UNIMPLEMENTED alloca_probe
ret ret
.endp ENDFUNC _alloca_probe
END END
/* EOF */ /* EOF */

View file

@ -17,42 +17,43 @@
/* GLOBALS *******************************************************************/ /* GLOBALS *******************************************************************/
.globl _global_unwind2 PUBLIC _global_unwind2
.globl _local_unwind2 PUBLIC _local_unwind2
.globl _abnormal_termination PUBLIC _abnormal_termination
.globl _except_handler2 PUBLIC _except_handler2
.globl _except_handler3 PUBLIC _except_handler3
/* FUNCTIONS *****************************************************************/ /* CODE **********************************************************************/
.code64
.func _unwind_handler FUNC _unwind_handler
_unwind_handler: .endprolog
ret ret
.endfunc ENDFUNC _unwind_handler
.func _global_unwind2 FUNC _global_unwind2
_global_unwind2: .endprolog
ret ret
.endfunc ENDFUNC _global_unwind2
.func _abnormal_termination FUNC _abnormal_termination
_abnormal_termination: .endprolog
ret ret
.endfunc ENDFUNC _abnormal_termination
.func _local_unwind2 FUNC _local_unwind2
_local_unwind2: .endprolog
ret ret
.endfunc ENDFUNC _local_unwind2
.func _except_handler2 FUNC _except_handler2
_except_handler2: .endprolog
ret ret
.endfunc ENDFUNC _except_handler2
.func _except_handler3 FUNC _except_handler3
_except_handler3: .endprolog
ret ret
.endfunc ENDFUNC _except_handler3
END END

View file

@ -10,18 +10,21 @@
#include <asm.inc> #include <asm.inc>
/* DATA *********************************************************************/ /* DATA **********************************************************************/
.code64
PUBLIC _fltused PUBLIC _fltused
_fltused: _fltused:
.long 0x9875 .long HEX(9875)
/* FUNCTIONS ****************************************************************/
/* CODE **********************************************************************/
.code64 .code64
.proc alldiv FUNC alldiv
.endprolog
UNIMPLEMENTED alldiv UNIMPLEMENTED alldiv
ret ret
.endp alldiv ENDFUNC alldiv
END

View file

@ -11,11 +11,12 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* FUNCTIONS ****************************************************************/ /* CODE **********************************************************************/
.code64 .code64
PUBLIC atan PUBLIC atan
atan: atan:
UNIMPLEMENTED atan UNIMPLEMENTED atan
ret ret
END

View file

@ -11,11 +11,12 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* FUNCTIONS ****************************************************************/ /* CODE **********************************************************************/
.code64 .code64
PUBLIC atan2 PUBLIC atan2
atan2: atan2:
UNIMPLEMENTED atan2 UNIMPLEMENTED atan2
ret ret
END

View file

@ -11,8 +11,7 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* FUNCTIONS ****************************************************************/ /* CODE **********************************************************************/
.code64 .code64
PUBLIC ceil PUBLIC ceil
@ -20,3 +19,4 @@ ceil:
UNIMPLEMENTED ceil UNIMPLEMENTED ceil
ret ret
END

View file

@ -11,8 +11,7 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* FUNCTIONS ****************************************************************/ /* CODE **********************************************************************/
.code64 .code64
PUBLIC ceilf PUBLIC ceilf
@ -39,7 +38,7 @@ ceilf:
fstp dword ptr [rsp] fstp dword ptr [rsp]
movss xmm0, [rsp] movss xmm0, [rsp]
add rsp, 16 add rsp, 16
ret ret

View file

@ -11,8 +11,7 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* FUNCTIONS ****************************************************************/ /* CODE **********************************************************************/
.code64 .code64
PUBLIC exp PUBLIC exp

View file

@ -10,12 +10,12 @@
#include <asm.inc> #include <asm.inc>
/* FUNCTIONS ****************************************************************/ /* CODE **********************************************************************/
.code64 .code64
PUBLIC fabs PUBLIC _fabs
fabs: _fabs:
UNIMPLEMENTED fabs UNIMPLEMENTED fabs
ret ret
END

View file

@ -11,8 +11,7 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* FUNCTIONS ****************************************************************/ /* CODE **********************************************************************/
.code64 .code64
PUBLIC floor PUBLIC floor

View file

@ -11,8 +11,7 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* FUNCTIONS ****************************************************************/ /* CODE **********************************************************************/
.code64 .code64
PUBLIC floorf PUBLIC floorf

View file

@ -10,10 +10,11 @@
#include <asm.inc> #include <asm.inc>
/* DATA *********************************************************************/ /* CODE **********************************************************************/
.code64
PUBLIC fmod PUBLIC _fmod
fmod: _fmod:
UNIMPLEMENTED fmod UNIMPLEMENTED fmod
ret ret

View file

@ -10,7 +10,8 @@
#include <asm.inc> #include <asm.inc>
/* DATA *********************************************************************/ /* CODE **********************************************************************/
.code64
PUBLIC fmodf PUBLIC fmodf
fmodf: fmodf:

View file

@ -10,7 +10,8 @@
#include <asm.inc> #include <asm.inc>
/* DATA *********************************************************************/ /* CODE **********************************************************************/
.code64
PUBLIC ldexp PUBLIC ldexp
ldexp: ldexp:

View file

@ -10,9 +10,12 @@
#include <asm.inc> #include <asm.inc>
/* DATA *********************************************************************/ /* CODE **********************************************************************/
.code64
PUBLIC log PUBLIC log
log: log:
UNIMPLEMENTED log UNIMPLEMENTED log
ret ret
END

View file

@ -10,10 +10,12 @@
#include <asm.inc> #include <asm.inc>
/* DATA *********************************************************************/ /* CODE **********************************************************************/
.code64
PUBLIC log10 PUBLIC log10
log10: log10:
UNIMPLEMENTED log10 UNIMPLEMENTED log10
ret ret
END

View file

@ -11,10 +11,12 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* DATA *********************************************************************/ /* CODE **********************************************************************/
.code64
PUBLIC pow PUBLIC pow
pow: pow:
UNIMPLEMENTED pow UNIMPLEMENTED pow
ret ret
END

View file

@ -11,7 +11,8 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* DATA *********************************************************************/ /* CODE **********************************************************************/
.code64
PUBLIC sqrt PUBLIC sqrt
sqrt: sqrt:

View file

@ -11,7 +11,8 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* DATA *********************************************************************/ /* CODE **********************************************************************/
.code64
PUBLIC sqrtf PUBLIC sqrtf
sqrtf: sqrtf:

View file

@ -11,7 +11,8 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
/* DATA *********************************************************************/ /* CODE **********************************************************************/
.code64
PUBLIC tan PUBLIC tan
tan: tan:

View file

@ -11,41 +11,45 @@
#include <asm.inc> #include <asm.inc>
#include <ksamd64.inc> #include <ksamd64.inc>
#define JUMP_BUFFER_Frame 0x00 #define JUMP_BUFFER_Frame 0 /* 0x00 */
#define JUMP_BUFFER_Rbx 0x08 #define JUMP_BUFFER_Rbx 8 /* 0x08 */
#define JUMP_BUFFER_Rsp 0x10 #define JUMP_BUFFER_Rsp 16 /* 0x10 */
#define JUMP_BUFFER_Rbp 0x18 #define JUMP_BUFFER_Rbp 24 /* 0x18 */
#define JUMP_BUFFER_Rsi 0x20 #define JUMP_BUFFER_Rsi 32 /* 0x20 */
#define JUMP_BUFFER_Rdi 0x28 #define JUMP_BUFFER_Rdi 40 /* 0x28 */
#define JUMP_BUFFER_R12 0x30 #define JUMP_BUFFER_R12 48 /* 0x30 */
#define JUMP_BUFFER_R13 0x38 #define JUMP_BUFFER_R13 56 /* 0x38 */
#define JUMP_BUFFER_R14 0x40 #define JUMP_BUFFER_R14 64 /* 0x40 */
#define JUMP_BUFFER_R15 0x48 #define JUMP_BUFFER_R15 72 /* 0x48 */
#define JUMP_BUFFER_Rip 0x50 #define JUMP_BUFFER_Rip 80 /* 0x50 */
#define JUMP_BUFFER_Spare 0x58 #define JUMP_BUFFER_Spare 88 /* 0x58 */
#define JUMP_BUFFER_Xmm6 0x60 #define JUMP_BUFFER_Xmm6 96 /* 0x60 */
#define JUMP_BUFFER_Xmm7 0x70 #define JUMP_BUFFER_Xmm7 112 /* 0x70 */
#define JUMP_BUFFER_Xmm8 0x80 #define JUMP_BUFFER_Xmm8 128 /* 0x80 */
#define JUMP_BUFFER_Xmm9 0x90 #define JUMP_BUFFER_Xmm9 144 /* 0x90 */
#define JUMP_BUFFER_Xmm10 0xa0 #define JUMP_BUFFER_Xmm10 160 /* 0xa0 */
#define JUMP_BUFFER_Xmm11 0xb0 #define JUMP_BUFFER_Xmm11 176 /* 0xb0 */
#define JUMP_BUFFER_Xmm12 0xc0 #define JUMP_BUFFER_Xmm12 192 /* 0xc0 */
#define JUMP_BUFFER_Xmm13 0xd0 #define JUMP_BUFFER_Xmm13 208 /* 0xd0 */
#define JUMP_BUFFER_Xmm14 0xe0 #define JUMP_BUFFER_Xmm14 224 /* 0xe0 */
#define JUMP_BUFFER_Xmm15 0xf0 #define JUMP_BUFFER_Xmm15 240 /* 0xf0 */
/* FUNCTIONS ******************************************************************/ /* FUNCTIONS ******************************************************************/
.code64
/* /*!
* int _setjmp(jmp_buf env); * int _setjmp(jmp_buf env);
* *
* Parameters: <rcx> - jmp_buf env * \param <rcx> - jmp_buf env
* Returns: 0 * \return 0
* Notes: Sets up the jmp_buf * \note Sets up the jmp_buf
*/ */
PUBLIC _setjmp PUBLIC _setjmp
.proc _setjmp FUNC _setjmp
.endprolog
/* Load rsp as it was before the call into rax */ /* Load rsp as it was before the call into rax */
lea rax, [rsp + 8] lea rax, [rsp + 8]
/* Load return address into r8 */ /* Load return address into r8 */
@ -73,18 +77,21 @@ PUBLIC _setjmp
movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15 movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15
xor rax, rax xor rax, rax
ret ret
.endp setjmp ENDFUNC _setjmp
/* /*!
* int _setjmpex(jmp_buf _Buf,void *_Ctx); * int _setjmpex(jmp_buf _Buf,void *_Ctx);
* *
* Parameters: <rcx> - jmp_buf env * \param <rcx> - jmp_buf env
* <rdx> - frame * \param <rdx> - frame
* Returns: 0 * \return 0
* Notes: Sets up the jmp_buf * \note Sets up the jmp_buf
*/ */
PUBLIC _setjmpex PUBLIC _setjmpex
.proc _setjmpex FUNC _setjmpex
.endprolog
/* Load rsp as it was before the call into rax */ /* Load rsp as it was before the call into rax */
lea rax, [rsp + 8] lea rax, [rsp + 8]
/* Load return address into r8 */ /* Load return address into r8 */
@ -112,19 +119,21 @@ PUBLIC _setjmpex
movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15 movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15
xor rax, rax xor rax, rax
ret ret
.endp setjmpex ENDFUNC _setjmpex
/* /*!
* void longjmp(jmp_buf env, int value); * void longjmp(jmp_buf env, int value);
* *
* Parameters: <rcx> - jmp_buf setup by _setjmp * \param <rcx> - jmp_buf setup by _setjmp
* <rdx> - int value to return * \param <rdx> - int value to return
* Returns: Doesn't return * \return Doesn't return
* Notes: Non-local goto * \note Non-local goto
*/ */
PUBLIC longjmp PUBLIC longjmp
.proc longjmp FUNC longjmp
.endprolog
// FIXME: handle frame // FIXME: handle frame
@ -152,9 +161,9 @@ PUBLIC longjmp
/* return param2 or 1 if it was 0 */ /* return param2 or 1 if it was 0 */
mov rax, rdx mov rax, rdx
test rax, rax test rax, rax
jnz 2f jnz l2
inc rax inc rax
2: jmp r8 l2: jmp r8
.endp longjmp ENDFUNC longjmp
END END

View file

@ -131,6 +131,7 @@ MiPteToAddress(PMMPTE Pte)
Temp >>= 16; Temp >>= 16;
return (PVOID)Temp; return (PVOID)Temp;
} }
#define MiPdeToAddress MiPteToAddress
BOOLEAN BOOLEAN
FORCEINLINE FORCEINLINE
@ -157,8 +158,6 @@ VOID
MI_MAKE_PROTOTYPE_PTE(IN PMMPTE NewPte, MI_MAKE_PROTOTYPE_PTE(IN PMMPTE NewPte,
IN PMMPTE PointerPte) IN PMMPTE PointerPte)
{ {
ULONG_PTR Offset;
/* Store the Address */ /* Store the Address */
NewPte->u.Long = (ULONG64)PointerPte; NewPte->u.Long = (ULONG64)PointerPte;
@ -197,9 +196,11 @@ MmInitGlobalKernelPageDirectory(VOID)
// FIXME, only copied from x86 // FIXME, only copied from x86
#define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.Global = 0) #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_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_DISABLE_CACHE(x) ((x)->u.Hard.CacheDisable = 1)
#define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.WriteThrough = 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_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.WriteThrough = 0)
#define MI_IS_PAGE_LARGE(x) ((x)->u.Hard.LargePage == 1)
#if !defined(CONFIG_SMP) #if !defined(CONFIG_SMP)
#define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.Write == 1) #define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.Write == 1)
#else #else
@ -231,8 +232,13 @@ MmInitGlobalKernelPageDirectory(VOID)
#define MI_MAPPING_RANGE_START (ULONG)HYPER_SPACE #define MI_MAPPING_RANGE_START (ULONG)HYPER_SPACE
#define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \ #define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \
MI_HYPERSPACE_PTES * PAGE_SIZE) MI_HYPERSPACE_PTES * PAGE_SIZE)
#define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \ #define MI_DUMMY_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \
PAGE_SIZE) 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 */ /* On x86, these two are the same */
#define MMPDE MMPTE #define MMPDE MMPTE

View file

@ -12,24 +12,9 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
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 typedef struct _KUINIT_FRAME
{ {
KSWITCHFRAME CtxSwitchFrame; KSWITCH_FRAME CtxSwitchFrame;
KSTART_FRAME StartFrame; KSTART_FRAME StartFrame;
KTRAP_FRAME TrapFrame; KTRAP_FRAME TrapFrame;
//FX_SAVE_AREA FxSaveArea; //FX_SAVE_AREA FxSaveArea;
@ -37,7 +22,7 @@ typedef struct _KUINIT_FRAME
typedef struct _KKINIT_FRAME typedef struct _KKINIT_FRAME
{ {
KSWITCHFRAME CtxSwitchFrame; KSWITCH_FRAME CtxSwitchFrame;
KSTART_FRAME StartFrame; KSTART_FRAME StartFrame;
//FX_SAVE_AREA FxSaveArea; //FX_SAVE_AREA FxSaveArea;
} KKINIT_FRAME, *PKKINIT_FRAME; } KKINIT_FRAME, *PKKINIT_FRAME;
@ -55,7 +40,7 @@ KiInitializeContextThread(IN PKTHREAD Thread,
//PFX_SAVE_AREA FxSaveArea; //PFX_SAVE_AREA FxSaveArea;
//PFXSAVE_FORMAT FxSaveFormat; //PFXSAVE_FORMAT FxSaveFormat;
PKSTART_FRAME StartFrame; PKSTART_FRAME StartFrame;
PKSWITCHFRAME CtxSwitchFrame; PKSWITCH_FRAME CtxSwitchFrame;
PKTRAP_FRAME TrapFrame; PKTRAP_FRAME TrapFrame;
CONTEXT LocalContext; CONTEXT LocalContext;
PCONTEXT Context = NULL; PCONTEXT Context = NULL;
@ -140,7 +125,7 @@ KiInitializeContextThread(IN PKTHREAD Thread,
Thread->PreviousMode = UserMode; Thread->PreviousMode = UserMode;
/* Tell KiThreadStartup of that too */ /* Tell KiThreadStartup of that too */
StartFrame->UserThread = TRUE; // StartFrame->UserThread = TRUE;
} }
else else
{ {
@ -170,18 +155,18 @@ KiInitializeContextThread(IN PKTHREAD Thread,
Thread->PreviousMode = KernelMode; Thread->PreviousMode = KernelMode;
/* Tell KiThreadStartup of that too */ /* Tell KiThreadStartup of that too */
StartFrame->UserThread = FALSE; // StartFrame->UserThread = FALSE;
} }
/* Now setup the remaining data for KiThreadStartup */ /* Now setup the remaining data for KiThreadStartup */
StartFrame->StartContext = StartContext; // StartFrame->StartContext = StartContext;
StartFrame->StartRoutine = StartRoutine; // StartFrame->StartRoutine = StartRoutine;
StartFrame->SystemRoutine = SystemRoutine; // StartFrame->SystemRoutine = SystemRoutine;
/* And set up the Context Switch Frame */ /* And set up the Context Switch Frame */
CtxSwitchFrame->RetAddr = KiThreadStartup; // CtxSwitchFrame->RetAddr = KiThreadStartup;
CtxSwitchFrame->ApcBypassDisable = TRUE; // CtxSwitchFrame->ApcBypassDisable = TRUE;
CtxSwitchFrame->ExceptionList = EXCEPTION_CHAIN_END;; // CtxSwitchFrame->ExceptionList = EXCEPTION_CHAIN_END;;
/* Save back the new value of the kernel stack. */ /* Save back the new value of the kernel stack. */
Thread->KernelStack = (PVOID)CtxSwitchFrame; Thread->KernelStack = (PVOID)CtxSwitchFrame;

View file

@ -76,7 +76,7 @@ ENDM
#define TRAPFLAG_SYSTEMSERVICE (TRAPFLAG_VOLATILES|TRAPFLAG_DEBUG) #define TRAPFLAG_SYSTEMSERVICE (TRAPFLAG_VOLATILES|TRAPFLAG_DEBUG)
#define TRAPFLAG_ALL HEX(ff) #define TRAPFLAG_ALL HEX(ff)
/* /*
* Stack Layout: * Stack Layout:
* |-------------------| * |-------------------|
* | KTRAP_FRAME | * | 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) MACRO(ENTER_TRAP_FRAME, Flags)
LOCAL dont_swap LOCAL dont_swap
@ -107,8 +107,8 @@ else
endif endif
/* Make room for a KTRAP_FRAME */ /* Make room for a KTRAP_FRAME */
sub rsp, (SIZE_KTRAP_FRAME - SIZE_INITIAL_FRAME) sub rsp, (KTRAP_FRAME_LENGTH - SIZE_INITIAL_FRAME)
.allocstack (SIZE_KTRAP_FRAME - SIZE_INITIAL_FRAME) .allocstack (KTRAP_FRAME_LENGTH - SIZE_INITIAL_FRAME)
.endprolog .endprolog
/* Save rbp */ /* Save rbp */
@ -278,12 +278,12 @@ ENDR
.PROC InternalDispatchException .PROC InternalDispatchException
/* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */ /* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */
sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME sub rsp, EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH
.allocstack (SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME) .allocstack (EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH)
.endprolog .endprolog
/* Set up EXCEPTION_RECORD */ /* Set up EXCEPTION_RECORD */
lea rcx, [rsp + SIZE_KEXCEPTION_FRAME] lea rcx, [rsp + KEXCEPTION_FRAME_LENGTH]
mov [rcx + EXCEPTION_RECORD_ExceptionCode], eax mov [rcx + EXCEPTION_RECORD_ExceptionCode], eax
xor rax, rax xor rax, rax
mov [rcx + EXCEPTION_RECORD_ExceptionFlags], eax mov [rcx + EXCEPTION_RECORD_ExceptionFlags], eax
@ -341,7 +341,7 @@ ENDR
movdqa xmm14, [rsp + KEXCEPTION_FRAME_Xmm14] movdqa xmm14, [rsp + KEXCEPTION_FRAME_Xmm14]
movdqa xmm15, [rsp + KEXCEPTION_FRAME_Xmm15] movdqa xmm15, [rsp + KEXCEPTION_FRAME_Xmm15]
add rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME add rsp, EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH
ret ret
.ENDP InternalDispatchException .ENDP InternalDispatchException
@ -516,7 +516,7 @@ PUBLIC KiInvalidOpcodeFault
KiInvalidOpcodeKernel: KiInvalidOpcodeKernel:
/* Kernel mode fault */ /* Kernel mode fault */
/* Dispatch the exception */ /* Dispatch the exception */
mov eax, STATUS_ILLEGAL_INSTRUCTION mov eax, STATUS_ILLEGAL_INSTRUCTION
mov edx, 3 mov edx, 3
@ -837,7 +837,7 @@ PUBLIC KiRaiseAssertion
mov r10, 0 mov r10, 0
mov r11, 0 mov r11, 0
call InternalDispatchException call InternalDispatchException
LEAVE_TRAP_FRAME LEAVE_TRAP_FRAME
iretq iretq
.ENDP KiRaiseAssertion .ENDP KiRaiseAssertion

View file

@ -27,10 +27,16 @@ HalInitializeBios(ULONG Unknown, PLOADER_PARAMETER_BLOCK LoaderBlock);
/* GLOBALS *****************************************************************/ /* GLOBALS *****************************************************************/
/* Template PTE and PDE for a kernel page */ /* 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 ValidKernelPde = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}};
MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; MMPTE ValidKernelPte = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}};
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}; /* 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 */ /* Sizes */
///SIZE_T MmSessionSize = MI_SESSION_SIZE; ///SIZE_T MmSessionSize = MI_SESSION_SIZE;
@ -413,7 +419,7 @@ MiInitializePageTable()
TmplPte.u.Flush.Write = 1; TmplPte.u.Flush.Write = 1;
HyperTemplatePte = TmplPte; 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 */ * skip page tables and hyperspace */
/* Loop the PXEs */ /* Loop the PXEs */
@ -492,7 +498,7 @@ MiBuildNonPagedPool(VOID)
/* Page-align the nonpaged pool size */ /* Page-align the nonpaged pool size */
MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1); MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1);
/* Now, check if there was a registry size for the maximum size */ /* Now, check if there was a registry size for the maximum size */
if (!MmMaximumNonPagedPoolInBytes) if (!MmMaximumNonPagedPoolInBytes)
{ {
@ -501,7 +507,7 @@ MiBuildNonPagedPool(VOID)
MmMaximumNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) / MmMaximumNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) /
256 * MmMaxAdditionNonPagedPoolPerMb; 256 * MmMaxAdditionNonPagedPoolPerMb;
} }
/* Don't let the maximum go too high */ /* Don't let the maximum go too high */
if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE) if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE)
{ {
@ -517,7 +523,7 @@ MiBuildNonPagedPool(VOID)
{ {
/* Put non paged pool after the PFN database */ /* Put non paged pool after the PFN database */
MmNonPagedPoolStart = (PCHAR)MmPfnDatabase + MxPfnSizeInBytes; MmNonPagedPoolStart = (PCHAR)MmPfnDatabase + MxPfnSizeInBytes;
MmMaximumNonPagedPoolInBytes = (ULONG64)MmNonPagedPoolEnd - MmMaximumNonPagedPoolInBytes = (ULONG64)MmNonPagedPoolEnd -
(ULONG64)MmNonPagedPoolStart; (ULONG64)MmNonPagedPoolStart;
} }
@ -688,7 +694,7 @@ MiBuildPagedPool_x(VOID)
PMMPTE Pte; PMMPTE Pte;
MMPTE TmplPte; MMPTE TmplPte;
ULONG Size, BitMapSize; ULONG Size, BitMapSize;
/* Default size for paged pool is 4 times non paged pool */ /* Default size for paged pool is 4 times non paged pool */
MmSizeOfPagedPoolInBytes = 4 * MmMaximumNonPagedPoolInBytes; MmSizeOfPagedPoolInBytes = 4 * MmMaximumNonPagedPoolInBytes;
@ -767,7 +773,7 @@ MiBuildPagedPool_x(VOID)
// Allocate the allocation bitmap, which tells us which regions have not yet // Allocate the allocation bitmap, which tells us which regions have not yet
// been mapped into memory // been mapped into memory
MmPagedPoolInfo.PagedPoolAllocationMap = MmPagedPoolInfo.PagedPoolAllocationMap =
ExAllocatePoolWithTag(NonPagedPool, Size, ' mM'); ExAllocatePoolWithTag(NonPagedPool, Size, ' mM');
ASSERT(MmPagedPoolInfo.PagedPoolAllocationMap); ASSERT(MmPagedPoolInfo.PagedPoolAllocationMap);
@ -783,7 +789,7 @@ MiBuildPagedPool_x(VOID)
// Given the allocation bitmap and a base address, we can therefore figure // 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 // out which page is the last page of that allocation, and thus how big the
// entire allocation is. // entire allocation is.
MmPagedPoolInfo.EndOfPagedPoolBitmap = MmPagedPoolInfo.EndOfPagedPoolBitmap =
ExAllocatePoolWithTag(NonPagedPool, Size, ' mM'); ExAllocatePoolWithTag(NonPagedPool, Size, ' mM');
ASSERT(MmPagedPoolInfo.EndOfPagedPoolBitmap); ASSERT(MmPagedPoolInfo.EndOfPagedPoolBitmap);
@ -859,7 +865,7 @@ MmArmInitSystem_x(IN ULONG Phase,
//MmPagedPoolSize = MM_PAGED_POOL_SIZE; //MmPagedPoolSize = MM_PAGED_POOL_SIZE;
//ASSERT((PCHAR)MmPagedPoolBase + MmPagedPoolSize < (PCHAR)MmNonPagedSystemStart); //ASSERT((PCHAR)MmPagedPoolBase + MmPagedPoolSize < (PCHAR)MmNonPagedSystemStart);
HalInitializeBios(0, LoaderBlock); HalInitializeBios(0, LoaderBlock);
} }
@ -871,7 +877,7 @@ FASTCALL
MiSyncARM3WithROS(IN PVOID AddressStart, MiSyncARM3WithROS(IN PVOID AddressStart,
IN PVOID AddressEnd) IN PVOID AddressEnd)
{ {
} }
NTSTATUS NTSTATUS

View file

@ -10,6 +10,7 @@ typedef uint64_t ULONG64;
#endif #endif
#define IMAGE_FILE_MACHINE_I386 0x14c
#define IMAGE_FILE_MACHINE_AMD64 0x8664 #define IMAGE_FILE_MACHINE_AMD64 0x8664
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 #define IMAGE_DIRECTORY_ENTRY_IMPORT 1
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3