Author: tkreuzer Date: Thu Aug 28 19:38:15 2008 New Revision: 35740
URL: http://svn.reactos.org/svn/reactos?rev=35740&view=rev Log: Fix Ki386InitializeTss. Load idt in KeInitExceptions. Implement KiDebugServiceTrap. Add #ifed out threadini.c. Update Stubs. Now DbgPrints are working.
Added: branches/ros-amd64-bringup/reactos/ntoskrnl/kd/amd64/ branches/ros-amd64-bringup/reactos/ntoskrnl/kd/amd64/kd.c (with props) branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/amd64/ branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/amd64/kdb.c (with props) branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/thrdini.c (with props) Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/amd64stubs.c branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/cpu.c branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/except.c branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/trap.S branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl-amd64hack.rbuild
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/amd64stubs.c URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskr... ============================================================================== --- branches/ros-amd64-bringup/reactos/ntoskrnl/amd64stubs.c [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/ntoskrnl/amd64stubs.c [iso-8859-1] Thu Aug 28 19:38:15 2008 @@ -69,7 +69,6 @@ STUB(KeFeatureBits) STUB(KiSystemService) STUB(KdpGdbStubInit) -STUB(KdbpGetCommandLineSettings) STUB(KdbpSafeReadMemory) STUB(RtlFillMemoryUlong) STUB(RtlCaptureContext)
Added: branches/ros-amd64-bringup/reactos/ntoskrnl/kd/amd64/kd.c URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskr... ============================================================================== --- branches/ros-amd64-bringup/reactos/ntoskrnl/kd/amd64/kd.c (added) +++ branches/ros-amd64-bringup/reactos/ntoskrnl/kd/amd64/kd.c [iso-8859-1] Thu Aug 28 19:38:15 2008 @@ -1,0 +1,30 @@ + +#include <ntoskrnl.h> +#define NDEBUG +#include <debug.h> + +VOID +STDCALL +KdbpGetCommandLineSettings(PCHAR p1) +{ + PCHAR p2; + + while (p1 && (p2 = strchr(p1, ' '))) + { + p2++; + + if (!_strnicmp(p2, "KDSERIAL", 8)) + { + p2 += 8; + KdbDebugState |= KD_DEBUG_KDSERIAL; + KdpDebugMode.Serial = TRUE; + } + else if (!_strnicmp(p2, "KDNOECHO", 8)) + { + p2 += 8; + KdbDebugState |= KD_DEBUG_KDNOECHO; + } + + p1 = p2; + } +}
Propchange: branches/ros-amd64-bringup/reactos/ntoskrnl/kd/amd64/kd.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/amd64/kdb.c URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskr... ============================================================================== --- branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/amd64/kdb.c (added) +++ branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/amd64/kdb.c [iso-8859-1] Thu Aug 28 19:38:15 2008 @@ -1,0 +1,47 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/kdbg/kdb.c + * PURPOSE: Kernel Debugger + * + * PROGRAMMERS: Gregor Anich + */ + +/* INCLUDES ******************************************************************/ + +#include <ntoskrnl.h> +#define NDEBUG +#include <internal/debug.h> + +/* GLOBALS *******************************************************************/ + +ULONG KdbDebugState = 0; /* KDBG Settings (NOECHO, KDSERIAL) */ + +/* FUNCTIONS *****************************************************************/ + +VOID +STDCALL +KdbpGetCommandLineSettings(PCHAR p1) +{ + PCHAR p2; + + while (p1 && (p2 = strchr(p1, ' '))) + { + p2++; + + if (!_strnicmp(p2, "KDSERIAL", 8)) + { + p2 += 8; + KdbDebugState |= KD_DEBUG_KDSERIAL; + KdpDebugMode.Serial = TRUE; + } + else if (!_strnicmp(p2, "KDNOECHO", 8)) + { + p2 += 8; + KdbDebugState |= KD_DEBUG_KDNOECHO; + } + + p1 = p2; + } +} +
Propchange: branches/ros-amd64-bringup/reactos/ntoskrnl/kdbg/amd64/kdb.c ------------------------------------------------------------------------------ svn:eol-style = native
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/cpu.c URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskr... ============================================================================== --- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/cpu.c [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/cpu.c [iso-8859-1] Thu Aug 28 19:38:15 2008 @@ -456,30 +456,45 @@ IN PKGDTENTRY Gdt, IN UINT64 Stack) { - PKGDTENTRY TssEntry; - - /* Initialize the boot TSS entry */ - TssEntry = &Gdt[KGDT_TSS / sizeof(KGDTENTRY)]; - TssEntry->Bits.Type = I386_TSS; + PKGDTENTRY64 TssEntry; + + /* Initialize the TSS descriptor entry */ + TssEntry = (PVOID)((ULONG64)Gdt + KGDT_TSS); + TssEntry->Bits.Type = 9;//AMD64_TSS; + TssEntry->Bits.Dpl = 0; TssEntry->Bits.Present = 1; - TssEntry->Bits.Dpl = 0; - - /* FIXME: I/O Map */ + TssEntry->Bits.System = 0; + TssEntry->Bits.LongMode = 0; + TssEntry->Bits.DefaultBig = 0; + TssEntry->Bits.Granularity = 0; + + /* Descriptor base is the TSS address */ + TssEntry->BaseLow = (ULONG64)Tss & 0xffff; + TssEntry->Bits.BaseMiddle = ((ULONG64)Tss >> 16) & 0xff; + TssEntry->Bits.BaseHigh = ((ULONG64)Tss >> 24) & 0xff; + TssEntry->BaseUpper = (ULONG64)Tss >> 32; + + /* Set the limit */ + TssEntry->LimitLow = sizeof(KTSS64) -1; + TssEntry->Bits.LimitHigh = 0; + + /* FIXME: I/O Map? */ + Tss->IoMapBase = 0; + + /* Setup ring 0 stack pointer */ + Tss->Rsp0 = Stack; + + /* Setup a stack for Double Fault Traps */ + Tss->Ist[1] = (ULONG64)KiDoubleFaultStack; + + /* Setup a stack for CheckAbort Traps */ + Tss->Ist[2] = (ULONG64)KiDoubleFaultStack; + + /* Setup a stack for NMI Traps */ + Tss->Ist[3] = (ULONG64)KiDoubleFaultStack;
/* Load the task register */ Ke386SetTr(KGDT_TSS); - - /* Setup stack pointer */ - Tss->Rsp0 = Stack; - - /* Setup a stack for Double Fault Traps */ - Tss->Ist[1] = PtrToUlong(KiDoubleFaultStack); - - /* Setup a stack for CheckAbort Traps */ - Tss->Ist[2] = PtrToUlong(KiDoubleFaultStack); - - /* Setup a stack for NMI Traps */ - Tss->Ist[3] = PtrToUlong(KiDoubleFaultStack);
}
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/except.c URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskr... ============================================================================== --- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/except.c [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/except.c [iso-8859-1] Thu Aug 28 19:38:15 2008 @@ -87,5 +87,6 @@ KiIdt[i].Reserved1 = 0; }
+ __lidt(&KiIdtDescriptor.Limit); }
Added: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/thrdini.c URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskr... ============================================================================== --- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/thrdini.c (added) +++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/thrdini.c [iso-8859-1] Thu Aug 28 19:38:15 2008 @@ -1,0 +1,231 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/ke/i386/thread.c + * PURPOSE: i386 Thread Context Creation + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + */ + +/* INCLUDES ******************************************************************/ + +#include <ntoskrnl.h> +#define NDEBUG +#include <debug.h> +#if 0 +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; + KSTART_FRAME StartFrame; + KTRAP_FRAME TrapFrame; + FX_SAVE_AREA FxSaveArea; +} KUINIT_FRAME, *PKUINIT_FRAME; + +typedef struct _KKINIT_FRAME +{ + KSWITCHFRAME CtxSwitchFrame; + KSTART_FRAME StartFrame; + FX_SAVE_AREA FxSaveArea; +} KKINIT_FRAME, *PKKINIT_FRAME; +#endif +/* FUNCTIONS *****************************************************************/ + +VOID +NTAPI +Ke386InitThreadWithContext(IN PKTHREAD Thread, + IN PKSYSTEM_ROUTINE SystemRoutine, + IN PKSTART_ROUTINE StartRoutine, + IN PVOID StartContext, + IN PCONTEXT ContextPointer) +{ + FrLdrDbgPrint("Ke386InitThreadWithContext stub\n"); +#if 0 + PFX_SAVE_AREA FxSaveArea; + PFXSAVE_FORMAT FxSaveFormat; + PKSTART_FRAME StartFrame; + PKSWITCHFRAME CtxSwitchFrame; + PKTRAP_FRAME TrapFrame; + CONTEXT LocalContext; + PCONTEXT Context = NULL; + ULONG ContextFlags; + + /* Check if this is a With-Context Thread */ + if (ContextPointer) + { + /* Set up the Initial Frame */ + PKUINIT_FRAME InitFrame; + InitFrame = (PKUINIT_FRAME)((ULONG_PTR)Thread->InitialStack - + sizeof(KUINIT_FRAME)); + + /* Copy over the context we got */ + RtlCopyMemory(&LocalContext, ContextPointer, sizeof(CONTEXT)); + Context = &LocalContext; + ContextFlags = CONTEXT_CONTROL; + + /* Zero out the trap frame and save area */ + RtlZeroMemory(&InitFrame->TrapFrame, + KTRAP_FRAME_LENGTH + sizeof(FX_SAVE_AREA)); + + /* Setup the Fx Area */ + FxSaveArea = &InitFrame->FxSaveArea; + + /* Check if we support FXsr */ + if (KeI386FxsrPresent) + { + /* Get the FX Save Format Area */ + FxSaveFormat = (PFXSAVE_FORMAT)Context->ExtendedRegisters; + + /* Set an initial state */ + FxSaveFormat->ControlWord = 0x27F; + FxSaveFormat->StatusWord = 0; + FxSaveFormat->TagWord = 0; + FxSaveFormat->ErrorOffset = 0; + FxSaveFormat->ErrorSelector = 0; + FxSaveFormat->DataOffset = 0; + FxSaveFormat->DataSelector = 0; + FxSaveFormat->MXCsr = 0x1F80; + } + else + { + /* Setup the regular save area */ + Context->FloatSave.ControlWord = 0x27F; + Context->FloatSave.StatusWord = 0; + Context->FloatSave.TagWord = -1; + Context->FloatSave.ErrorOffset = 0; + Context->FloatSave.ErrorSelector = 0; + Context->FloatSave.DataOffset =0; + Context->FloatSave.DataSelector = 0; + } + + /* Check if the CPU has NPX */ + if (KeI386NpxPresent) + { + /* Set an intial NPX State */ + Context->FloatSave.Cr0NpxState = 0; + FxSaveArea->Cr0NpxState = 0; + FxSaveArea->NpxSavedCpu = 0; + + /* Now set the context flags depending on XMM support */ + ContextFlags |= (KeI386FxsrPresent) ? CONTEXT_EXTENDED_REGISTERS : + CONTEXT_FLOATING_POINT; + + /* Set the Thread's NPX State */ + Thread->NpxState = NPX_STATE_NOT_LOADED; + Thread->DispatcherHeader.NpxIrql = PASSIVE_LEVEL; + } + else + { + /* We'll use emulation */ + FxSaveArea->Cr0NpxState = CR0_EM; + Thread->NpxState = NPX_STATE_NOT_LOADED &~ CR0_MP; + } + + /* Disable any debug regiseters */ + Context->ContextFlags &= ~CONTEXT_DEBUG_REGISTERS; + + /* Setup the Trap Frame */ + TrapFrame = &InitFrame->TrapFrame; + + /* Set up a trap frame from the context. */ + KeContextToTrapFrame(Context, + NULL, + TrapFrame, + Context->ContextFlags | ContextFlags, + UserMode); + + /* Set SS, DS, ES's RPL Mask properly */ + TrapFrame->HardwareSegSs |= RPL_MASK; + TrapFrame->SegDs |= RPL_MASK; + TrapFrame->SegEs |= RPL_MASK; + TrapFrame->Dr7 = 0; + + /* Set the debug mark */ + TrapFrame->DbgArgMark = 0xBADB0D00; + + /* Set the previous mode as user */ + TrapFrame->PreviousPreviousMode = UserMode; + + /* Terminate the Exception Handler List */ + TrapFrame->ExceptionList = EXCEPTION_CHAIN_END; + + /* Setup the Stack for KiThreadStartup and Context Switching */ + StartFrame = &InitFrame->StartFrame; + CtxSwitchFrame = &InitFrame->CtxSwitchFrame; + + /* Tell the thread it will run in User Mode */ + Thread->PreviousMode = UserMode; + + /* Tell KiThreadStartup of that too */ + StartFrame->UserThread = TRUE; + } + else + { + /* Set up the Initial Frame for the system thread */ + PKKINIT_FRAME InitFrame; + InitFrame = (PKKINIT_FRAME)((ULONG_PTR)Thread->InitialStack - + sizeof(KKINIT_FRAME)); + + /* Setup the Fx Area */ + FxSaveArea = &InitFrame->FxSaveArea; + RtlZeroMemory(FxSaveArea, sizeof(FX_SAVE_AREA)); + + /* Check if we have Fxsr support */ + if (KeI386FxsrPresent) + { + /* Set the stub FX area */ + FxSaveArea->U.FxArea.ControlWord = 0x27F; + FxSaveArea->U.FxArea.MXCsr = 0x1F80; + } + else + { + /* Set the stub FN area */ + FxSaveArea->U.FnArea.ControlWord = 0x27F; + FxSaveArea->U.FnArea.TagWord = -1; + } + + /* No NPX State */ + Thread->NpxState = NPX_STATE_NOT_LOADED; + + /* Setup the Stack for KiThreadStartup and Context Switching */ + StartFrame = &InitFrame->StartFrame; + CtxSwitchFrame = &InitFrame->CtxSwitchFrame; + + /* Tell the thread it will run in Kernel Mode */ + Thread->PreviousMode = KernelMode; + + /* Tell KiThreadStartup of that too */ + StartFrame->UserThread = FALSE; + } + + /* Now setup the remaining data for KiThreadStartup */ + 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;; + + /* Save back the new value of the kernel stack. */ + Thread->KernelStack = (PVOID)CtxSwitchFrame; +#endif +} + +/* EOF */ + +
Propchange: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/thrdini.c ------------------------------------------------------------------------------ svn:eol-style = native
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/trap.S URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskr... ============================================================================== --- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/trap.S [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/trap.S [iso-8859-1] Thu Aug 28 19:38:15 2008 @@ -17,6 +17,9 @@
.data
+_MsgPageFault: +.ascii "Page fault 0x%x at %p!\n\0" + _MsgGeneralProtFault: .ascii "General protection fault at %p!\n\0"
@@ -33,55 +36,95 @@
.global _KiDivideErrorFault _KiDivideErrorFault: + /* Push pseudo error code */ + push 0 +
.global _KiDebugTrapOrFault _KiDebugTrapOrFault: + /* Push pseudo error code */ + push 0
.global _KiNmiInterrupt _KiNmiInterrupt: + /* Push pseudo error code */ + push 0 + +jmp $
.global _KiBreakpointTrap _KiBreakpointTrap: -// mov rdx, [rsp] + /* Push pseudo error code */ + push 0 + + push rax + push rcx + push rdx + sub rsp, 0x10 -// movabs rcx, offset _MsgBreakpointTrap -// movabs rax, offset _FrLdrDbgPrint -// call [rax] + movabs rcx, offset _MsgBreakpointTrap + mov rdx, [rsp + 0x10 + 24 + 8] + movabs rax, offset _FrLdrDbgPrint + call [rax] add rsp, 0x10 - iret + + pop rdx + pop rcx + pop rax + add rsp, 8 + iretq
.global _KiOverflowTrap _KiOverflowTrap: + /* Push pseudo error code */ + push 0
.global _KiBoundFault _KiBoundFault: + /* Push pseudo error code */ + push 0
.global _KiInvalidOpcodeFault _KiInvalidOpcodeFault: + /* Push pseudo error code */ + push 0
.global _KiNpxNotAvailableFault _KiNpxNotAvailableFault: + /* Push pseudo error code */ + push 0
.global _KiDoubleFaultAbort _KiDoubleFaultAbort: + /* Push pseudo error code */ + push 0
.global _KiNpxSegmentOverrunAbort _KiNpxSegmentOverrunAbort: + /* Push pseudo error code */ + push 0
.global _KiInvalidTssFault _KiInvalidTssFault: + /* We have an error code */ +
.global _KiSegmentNotPresentFault _KiSegmentNotPresentFault: + /* We have an error code */ +
.global _KiStackFault _KiStackFault: + /* We have an error code */
jmp $
.global _KiGeneralProtectionFault _KiGeneralProtectionFault: + /* We have an error code */ + mov rdx, 0 mov dx, ss movabs rcx, offset _MsgGeneralProtFault @@ -92,18 +135,34 @@
.global _KiPageFault _KiPageFault: + /* We have an error code */ + movabs rcx, offset _MsgPageFault + mov rdx, [rsp] + mov r8, [rsp+8] + mov r9, rsp + movabs rax, offset _FrLdrDbgPrint + call [rax] + jmp $ +
.global _KiFloatingErrorFault _KiFloatingErrorFault: + /* Push pseudo error code */ + push 0
.global _KiAlignmentFault _KiAlignmentFault: + /* We have an error code */
.global _KiMcheckAbort _KiMcheckAbort: + /* Push pseudo error code */ + push 0
.global _KiXmmException _KiXmmException: + /* Push pseudo error code */ + push 0
.global _KiApcInterrupt _KiApcInterrupt: @@ -111,9 +170,40 @@
.global _KiRaiseAssertion _KiRaiseAssertion: +jmp $
.global _KiDebugServiceTrap _KiDebugServiceTrap: + /* Push pseudo error code */ + push 0 + + push rax + push rcx + push rdx + push r8 + push r9 + + /* Create stack space for parameters */ + sub rsp, 0x18 + + /* just forward first 3 parameters */ + call _KdpServiceDispatcher + + /* Skip the int 3, increment return rip */ + inc qword ptr [rsp + 0x18 + 48] + + /* Cleanup */ + add rsp, 0x18 + + pop r9 + pop r8 + pop rdx + pop rcx + pop rax + + add rsp, 8 + iretq +
.global _KiDpcInterrupt _KiDpcInterrupt: @@ -121,10 +211,12 @@
.global _KiIpiInterrupt _KiIpiInterrupt: - iret +jmp $ +
.global _KiUnexpectedInterrupt _KiUnexpectedInterrupt: +jmp $ movabs rcx, offset _MsgUnexpectedInterrupt movabs rax, offset _FrLdrDbgPrint call [rax]
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl-amd64hack.rbuild URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskr... ============================================================================== --- branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl-amd64hack.rbuild [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl-amd64hack.rbuild [iso-8859-1] Thu Aug 28 19:38:15 2008 @@ -95,6 +95,7 @@ <file>except.c</file> <file>irql.c</file> <file>kiinit.c</file> + <file>thrdini.c</file> <file>trap.S</file> </directory> </if> @@ -303,6 +304,11 @@ <!-- file>kdb_expr.c</file --> <file>kdb_keyboard.c</file> <file>kdb_serial.c</file> + <if property="ARCH" value="amd64"> + <directory name="amd64"> + <file>kdb.c</file> + </directory> + </if> </if> <if property="DBG_OR_KDBG" value="true"> <file>kdb_symbols.c</file>