diff --git a/reactos/include/ndk/asm.h b/reactos/include/ndk/asm.h index a7c1b54e957..57ecee2eca1 100644 --- a/reactos/include/ndk/asm.h +++ b/reactos/include/ndk/asm.h @@ -493,6 +493,11 @@ Author: // Kernel Feature Bits // #define KF_RDTSC 0x00000002 + +// +// Kernel Stack Size +// +#define KERNEL_STACK_SIZE 0x3000 #endif // diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index 7d0e521a54e..9925e96ad06 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -145,6 +145,10 @@ KiThreadStartup(PKSYSTEM_ROUTINE SystemRoutine, __asm__("lldt %0\n\t" \ : /* no outputs */ \ : "m" (X)); +#define Ke386SetInterruptDescriptorTable(X) \ + __asm__("lidt %0\n\t" \ + : /* no outputs */ \ + : "m" (X)); #define Ke386SetGlobalDescriptorTable(X) \ __asm__("lgdt %0\n\t" \ : /* no outputs */ \ diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 06d785692f4..a1c1e6e9c0c 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -96,7 +96,11 @@ extern ULONG KeI386EFlagsOrMaskV86; extern BOOLEAN KeI386VirtualIntExtensions; extern KIDTENTRY KiIdt[]; extern KGDTENTRY KiBootGdt[]; +extern KDESCRIPTOR KiGdtDescriptor; +extern KDESCRIPTOR KiIdtDescriptor; extern KTSS KiBootTss; +extern UCHAR P0BootStack[]; +extern UCHAR KiDoubleFaultStack[]; extern FAST_MUTEX KernelAddressSpaceLock; extern ULONG KiMaximumDpcQueueDepth; extern ULONG KiMinimumDpcRate; @@ -119,7 +123,6 @@ extern KEVENT KiSwapEvent; extern PKPRCB KiProcessorBlock[]; extern ULONG KiMask32Array[MAXIMUM_PRIORITY]; extern ULONG IdleProcessorMask; -extern ULONG trap_stack_top; extern VOID KiTrap8(VOID); extern VOID KiTrap2(VOID); diff --git a/reactos/ntoskrnl/ke/i386/cpu.c b/reactos/ntoskrnl/ke/i386/cpu.c index daa2e252a90..7f275dfd792 100644 --- a/reactos/ntoskrnl/ke/i386/cpu.c +++ b/reactos/ntoskrnl/ke/i386/cpu.c @@ -582,7 +582,7 @@ Ki386InitializeTss(VOID) Tss = (PKTSS)KiDoubleFaultTSS; KiInitializeTSS(Tss); Tss->CR3 = _Ke386GetCr(3); - Tss->Esp0 = trap_stack_top; + Tss->Esp0 = PtrToUlong(KiDoubleFaultStack); Tss->Eip = PtrToUlong(KiTrap8); Tss->Cs = KGDT_R0_CODE; Tss->Fs = KGDT_R0_PCR; @@ -613,7 +613,7 @@ Ki386InitializeTss(VOID) Tss = (PKTSS)KiNMITSS; KiInitializeTSS(Tss); Tss->CR3 = _Ke386GetCr(3); - Tss->Esp0 = trap_stack_top; + Tss->Esp0 = PtrToUlong(KiDoubleFaultStack); Tss->Eip = PtrToUlong(KiTrap2); Tss->Cs = KGDT_R0_CODE; Tss->Fs = KGDT_R0_PCR; diff --git a/reactos/ntoskrnl/ke/i386/kernel.c b/reactos/ntoskrnl/ke/i386/kernel.c index 07c69b8d4f7..5ce3cbcd50f 100644 --- a/reactos/ntoskrnl/ke/i386/kernel.c +++ b/reactos/ntoskrnl/ke/i386/kernel.c @@ -26,7 +26,7 @@ ETHREAD KiInitialThread; EPROCESS KiInitialProcess; extern ULONG Ke386GlobalPagesEnabled; -extern PVOID trap_stack, init_stack; +extern PVOID trap_stack; /* System-defined Spinlocks */ KSPIN_LOCK KiDispatcherLock; @@ -514,7 +514,7 @@ KiSystemStartup(IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock) KiBootGdt, &KiBootTss, &KiInitialThread.Tcb, - trap_stack); + KiDoubleFaultStack); /* Set us as the current process */ KiInitialThread.Tcb.ApcState.Process = &KiInitialProcess.Pcb; @@ -554,7 +554,7 @@ AppCpuInit: /* Call main kernel intialization */ KiInitializeKernel(&KiInitialProcess.Pcb, &KiInitialThread.Tcb, - init_stack, + P0BootStack, Prcb, Cpu, LoaderBlock); diff --git a/reactos/ntoskrnl/ke/i386/main_asm.S b/reactos/ntoskrnl/ke/i386/main_asm.S index 93e2834dbb5..3a64b052999 100644 --- a/reactos/ntoskrnl/ke/i386/main_asm.S +++ b/reactos/ntoskrnl/ke/i386/main_asm.S @@ -1,46 +1,45 @@ -#include -#include +/* + * FILE: ntoskrnl/ke/i386/main_asm.S + * COPYRIGHT: See COPYING in the top level directory + * PURPOSE: Kernel Bootstrap Code + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + */ -#define AP_MAGIC (0x12481020) +/* INCLUDES ******************************************************************/ -.global _kernel_stack -.global _kernel_stack_top -.global _kernel_trap_stack -.global _kernel_trap_stack_top +#include +.intel_syntax noprefix -.globl _NtProcessStartup +/* GLOBALS *******************************************************************/ .bss -.align 4096 +.align 16 +/* Kernel Boot Stack */ +.globl _P0BootStack +.space KERNEL_STACK_SIZE +_P0BootStack: -/* guard page for the kernel stack */ -.fill 4096, 1, 0 +/* Kernel Double-Fault and Temporary DPC Stack */ +.globl _KiDoubleFaultStack +.space KERNEL_STACK_SIZE +_KiDoubleFaultStack: -_kernel_stack: -.fill 3*4096, 1, 0 -_kernel_stack_top: +/* FUNCTIONS *****************************************************************/ -/* guard page for the trap stack */ -.fill 4096, 1, 0 - -_kernel_trap_stack: -.fill 3*4096, 1, 0 -_kernel_trap_stack_top: - .text - +.func NtProcessStartup _NtProcessStartup: - /* FIXME: Application processors should have their own GDT/IDT */ - lgdt _KiGdtDescriptor - lidt _KiIdtDescriptor - /* Load the initial kernel stack */ - lea _kernel_stack_top, %eax - sub $(SIZEOF_FX_SAVE_AREA), %eax - movl %eax, %esp + lea eax, _P0BootStack + sub eax, (NPX_FRAME_LENGTH + KTRAP_FRAME_LENGTH + KTRAP_FRAME_ALIGN) + mov esp, eax + + /* Save initial CR0 state */ + push CR0_EM + CR0_TS + CR0_MP /* Call the main kernel initialization */ - pushl %edx + push edx call _KiRosPrepareForSystemStartup@4 +.endfunc diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index cb17cd448b4..5ceffb3c0f3 100644 --- a/reactos/ntoskrnl/ke/i386/trap.s +++ b/reactos/ntoskrnl/ke/i386/trap.s @@ -86,9 +86,6 @@ _KiUnexpectedEntrySize: _UnexpectedMsg: .asciz "\n\x7\x7!!! Unexpected Interrupt %02lx !!!\n" -Broken: - .asciz "\n\x7\x7!!! Broken TrapFrame. Magic: %08lx MagicB: %08lx!!!\n" - /* SOFTWARE INTERRUPT SERVICES ***********************************************/ _KiGetTickCount: diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index acd30662f7e..de99ddaa1fc 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -48,18 +48,6 @@ PVOID KeRaiseUserExceptionDispatcher = NULL; ULONG KeLargestCacheLine = 0x40; /* FIXME: Arch-specific */ -/* the initial stacks are declared in main_asm.S */ -extern ULONG kernel_stack; -extern ULONG kernel_stack_top; -extern ULONG kernel_trap_stack; -extern ULONG kernel_trap_stack_top; - -/* These point to the aligned 3 pages */ -ULONG init_stack = (ULONG)&kernel_stack; -ULONG init_stack_top = (ULONG)&kernel_stack_top; -ULONG trap_stack = (ULONG)&kernel_trap_stack; -ULONG trap_stack_top = (ULONG)&kernel_trap_stack_top; - /* Cached modules from the loader block */ PLOADER_MODULE CachedModules[MaximumCachedModuleType]; @@ -97,6 +85,10 @@ KiRosPrepareForSystemStartup(IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock) PIMAGE_OPTIONAL_HEADER OptHead; CHAR* s; + /* Load the GDT and IDT */ + Ke386SetGlobalDescriptorTable(KiGdtDescriptor); + Ke386SetInterruptDescriptorTable(KiIdtDescriptor); + /* Copy the Loader Block Data locally since Low-Memory will be wiped */ memcpy(&KeLoaderBlock, LoaderBlock, sizeof(ROS_LOADER_PARAMETER_BLOCK)); memcpy(&KeLoaderModules[1], diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index a1d94ab2d3d..c4fcb0d16d7 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -36,10 +36,6 @@ PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress; PVOID MiNonPagedPoolStart; ULONG MiNonPagedPoolLength; -extern ULONG init_stack; -extern ULONG init_stack_top; -extern ULONG trap_stack; - VOID INIT_FUNCTION NTAPI MmInitVirtualMemory(ULONG_PTR LastKernelAddress, ULONG KernelLength); #if defined (ALLOC_PRAGMA) @@ -394,10 +390,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr, AddressRangeCount); kernel_len = LastKrnlPhysAddr - FirstKrnlPhysAddr; - /* Unmap the guard pages from the initial stacks */ - MmDeleteVirtualMapping(NULL, (PVOID)(init_stack - PAGE_SIZE), FALSE, NULL, NULL); - MmDeleteVirtualMapping(NULL, (PVOID)(trap_stack - PAGE_SIZE), FALSE, NULL, NULL); - /* * Unmap low memory */ diff --git a/reactos/ntoskrnl/ps/idle.c b/reactos/ntoskrnl/ps/idle.c index 61b0c5a895d..575c12ca78a 100644 --- a/reactos/ntoskrnl/ps/idle.c +++ b/reactos/ntoskrnl/ps/idle.c @@ -59,19 +59,19 @@ PsInitializeIdleOrFirstThread(PEPROCESS Process, BOOLEAN First) { PETHREAD Thread; - ULONG_PTR KernelStack; - extern unsigned int init_stack_top; + PVOID KernelStack; Thread = ExAllocatePool(NonPagedPool, sizeof(ETHREAD)); RtlZeroMemory(Thread, sizeof(ETHREAD)); Thread->ThreadsProcess = Process; if (First) { - KernelStack = init_stack_top; + KernelStack = P0BootStack; } else { - KernelStack = (ULONG_PTR)MmCreateKernelStack(FALSE) + KERNEL_STACK_SIZE; + KernelStack = (PVOID)((ULONG_PTR)MmCreateKernelStack(FALSE) + + KERNEL_STACK_SIZE); } KeInitializeThread(&Process->Pcb, &Thread->Tcb, @@ -80,7 +80,7 @@ PsInitializeIdleOrFirstThread(PEPROCESS Process, NULL, NULL, NULL, - (PVOID)KernelStack); + KernelStack); InitializeListHead(&Thread->IrpList); *ThreadPtr = Thread; return STATUS_SUCCESS;