- Allocated the initial stacks page aligned.
authorHartmut Birr <osexpert@googlemail.com>
Sun, 15 Jan 2006 18:28:40 +0000 (18:28 +0000)
committerHartmut Birr <osexpert@googlemail.com>
Sun, 15 Jan 2006 18:28:40 +0000 (18:28 +0000)
- Add a guard page for the initial stacks.
- Fixed the size of the initial stacks.

svn path=/trunk/; revision=20897

reactos/ntoskrnl/ke/i386/main_asm.S
reactos/ntoskrnl/ke/main.c
reactos/ntoskrnl/mm/mminit.c

index a7baf97..d83c65d 100644 (file)
@@ -3,8 +3,33 @@
 
 #define AP_MAGIC (0x12481020)
 
+.global _kernel_stack
+.global _kernel_stack_top
+.global _kernel_trap_stack
+.global _kernel_trap_stack_top
+
 .globl _NtProcessStartup
 
+.bss
+.align 4096
+
+
+/* guard page for the kernel stack */
+.fill 4096, 1, 0
+
+_kernel_stack:
+.fill 3*4096, 1, 0
+_kernel_stack_top:
+
+/* guard page for the trap stack */
+.fill 4096, 1, 0
+
+_kernel_trap_stack:
+.fill 3*4096, 1, 0
+_kernel_trap_stack_top:
+       
+.text
+
 _NtProcessStartup:
 
     /* FIXME: Application processors should have their own GDT/IDT */
@@ -34,13 +59,12 @@ _NtProcessStartup:
     
 .m1:     
     /* Load the initial kernel stack */
-    lea _kernel_stack, %eax
-    add $0x2000, %eax
-    and $0xFFFFE000, %eax
-    add $(0x3000 - SIZEOF_FX_SAVE_AREA), %eax
+    lea _kernel_stack_top, %eax
+    sub $(SIZEOF_FX_SAVE_AREA), %eax
     movl %eax, %esp
     
     /* Call the main kernel initialization */
     pushl %edx
     pushl %ecx
     call __main
+
index e138bd3..2bdeb11 100644 (file)
@@ -48,15 +48,17 @@ PVOID KeRaiseUserExceptionDispatcher = NULL;
 
 ULONG KeLargestCacheLine = 0x40; /* FIXME: Arch-specific */
 
-/* We allocate 5 pages, but we only use 4. The 5th is to guarantee page alignment */
-ULONG kernel_stack[5120];
-ULONG double_trap_stack[5120];
+/* 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 init_stack_top;
-ULONG trap_stack;
-ULONG trap_stack_top;
+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];
@@ -155,13 +157,6 @@ _main(ULONG MultiBootMagic,
     PIMAGE_OPTIONAL_HEADER OptHead;
     CHAR* s;
 
-    /* Set up the Stacks (Initial Kernel Stack and Double Trap Stack)
-       and save a page for the fx savings area */
-    trap_stack = PAGE_ROUND_UP(&double_trap_stack) + PAGE_SIZE;
-    trap_stack_top = trap_stack + 3 * PAGE_SIZE;
-    init_stack = PAGE_ROUND_UP(&kernel_stack) + PAGE_SIZE;
-    init_stack_top = init_stack + 3 * PAGE_SIZE;
-
     /* Copy the Loader Block Data locally since Low-Memory will be wiped */
     memcpy(&KeLoaderBlock, _LoaderBlock, sizeof(LOADER_PARAMETER_BLOCK));
     memcpy(&KeLoaderModules[1],
index ff2a54b..0e2b7b8 100644 (file)
@@ -38,6 +38,7 @@ 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);
 
@@ -394,6 +395,10 @@ 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
     */