Author: ion
Date: Sun Oct 1 10:46:08 2006
New Revision: 24335
URL: http://svn.reactos.org/svn/reactos?rev=24335&view=rev
Log:
- Clear KPCR->TEB during bootstrap as well.
- Use KPCR_PROCESSOR_NUMBER instead of 0x130.
Modified:
trunk/reactos/ntoskrnl/ke/i386/kiinit.c
Modified: trunk/reactos/ntoskrnl/ke/i386/kiinit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/kiinit.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/kiinit.c (original)
+++ trunk/reactos/ntoskrnl/ke/i386/kiinit.c Sun Oct 1 10:46:08 2006
@@ -294,7 +294,7 @@
{
/* If this is the boot CPU, set FS and the CPU Number*/
Ke386SetFs(KGDT_R0_PCR);
- __writefsdword(0x130, Cpu);
+ __writefsdword(KPCR_PROCESSOR_NUMBER, Cpu);
/* Set the initial stack and idle thread as well */
LoaderBlock->KernelStack = (ULONG_PTR)P0BootStack;
@@ -334,6 +334,7 @@
InitialThread->ApcState.Process = &KiInitialProcess.Pcb;
/* Clear DR6/7 to cleanup bootloader debugging */
+ __writefsdword(KPCR_TEB, 0);
__writefsdword(KPCR_DR6, 0);
__writefsdword(KPCR_DR7, 0);
Author: ion
Date: Sun Oct 1 10:43:26 2006
New Revision: 24334
URL: http://svn.reactos.org/svn/reactos?rev=24334&view=rev
Log:
- Add two more lines in boot.S which detect boot-by-NTLDR and jump into KiSystemService (I thought FreeLdr didn't use the entrypoint, but it looks like it does, so this hack is needed). Detection is done by checking for the high bit in the PLOADER_PARAMETER_BLOCK pointer, which will be set on NT.
- Fix a double bug in KiSystemStartup. First, we were setting KPCR->Number instead of KPRCB->Number. Second, we were using KeGetPcr instead of __writefsdword. It worked on ROS because KeGetPcr is hard-coded to ROS's KPCR buffer.
Modified:
trunk/reactos/ntoskrnl/ke/i386/boot.S
trunk/reactos/ntoskrnl/ke/i386/kiinit.c
Modified: trunk/reactos/ntoskrnl/ke/i386/boot.S
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/boot.S?re…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/boot.S (original)
+++ trunk/reactos/ntoskrnl/ke/i386/boot.S Sun Oct 1 10:43:26 2006
@@ -30,6 +30,11 @@
.text
.func NtProcessStartup
_NtProcessStartup:
- /* Call the main kernel initialization */
+
+ /* NTLDR Boot: Call the main kernel initialization */
+ test dword ptr [esp+4], 0x80000000
+ jnz _KiSystemStartup@4
+
+ /* FREELDR Boot: Cal the FreeLDR wrapper */
jmp @KiRosPrepareForSystemStartup@8
.endfunc
Modified: trunk/reactos/ntoskrnl/ke/i386/kiinit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/kiinit.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/kiinit.c (original)
+++ trunk/reactos/ntoskrnl/ke/i386/kiinit.c Sun Oct 1 10:43:26 2006
@@ -294,7 +294,7 @@
{
/* If this is the boot CPU, set FS and the CPU Number*/
Ke386SetFs(KGDT_R0_PCR);
- KeGetPcr()->Number = Cpu;
+ __writefsdword(0x130, Cpu);
/* Set the initial stack and idle thread as well */
LoaderBlock->KernelStack = (ULONG_PTR)P0BootStack;
Author: ion
Date: Sun Oct 1 10:08:05 2006
New Revision: 24333
URL: http://svn.reactos.org/svn/reactos?rev=24333&view=rev
Log:
- Remove all the remaining code in boot.S and make KiRosPrepareForSystemStartup fastcall. Now NtProcessStartup just does a jmp to KiRosPrepareForSystemStartup without any other code.
- Use freeldr's stack during all of freeldr.c, and only switch to the boot stack in KiSystemStartup before calling KiInitializeKernel. This is what NT does as well (it piggybacks on NTLDR's stack until then). This allowed us to clean boot.S and now we can boot from NTLDR properly.
Modified:
trunk/reactos/ntoskrnl/ke/freeldr.c
trunk/reactos/ntoskrnl/ke/i386/boot.S
trunk/reactos/ntoskrnl/ke/i386/kiinit.c
Modified: trunk/reactos/ntoskrnl/ke/freeldr.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/freeldr.c?rev=…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/freeldr.c (original)
+++ trunk/reactos/ntoskrnl/ke/freeldr.c Sun Oct 1 10:08:05 2006
@@ -244,8 +244,9 @@
}
VOID
-NTAPI
-KiRosPrepareForSystemStartup(IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
+FASTCALL
+KiRosPrepareForSystemStartup(IN ULONG Dummy,
+ IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
{
ULONG i;
ULONG size;
Modified: trunk/reactos/ntoskrnl/ke/i386/boot.S
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/boot.S?re…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/boot.S (original)
+++ trunk/reactos/ntoskrnl/ke/i386/boot.S Sun Oct 1 10:08:05 2006
@@ -1,7 +1,7 @@
/*
* FILE: ntoskrnl/ke/i386/boot.S
* COPYRIGHT: See COPYING in the top level directory
- * PURPOSE: Kernel Bootstrap Code
+ * PURPOSE: FreeLDR Wrapper Bootstrap Code
* PROGRAMMER: Alex Ionescu (alex(a)relsoft.net)
*/
@@ -30,16 +30,6 @@
.text
.func NtProcessStartup
_NtProcessStartup:
-
- /* Load the initial kernel stack */
- 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 */
- push edx
- call _KiRosPrepareForSystemStartup@4
+ jmp @KiRosPrepareForSystemStartup@8
.endfunc
Modified: trunk/reactos/ntoskrnl/ke/i386/kiinit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/kiinit.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/kiinit.c (original)
+++ trunk/reactos/ntoskrnl/ke/i386/kiinit.c Sun Oct 1 10:08:05 2006
@@ -281,7 +281,7 @@
{
ULONG Cpu;
PKTHREAD InitialThread;
- PVOID InitialStack;
+ ULONG InitialStack;
PKGDTENTRY Gdt;
PKIDTENTRY Idt;
PKTSS Tss;
@@ -302,7 +302,7 @@
}
/* Save the initial thread and stack */
- InitialStack = (PVOID)LoaderBlock->KernelStack;
+ InitialStack = LoaderBlock->KernelStack;
InitialThread = (PKTHREAD)LoaderBlock->Thread;
/* Clean the APC List Head */
@@ -375,13 +375,21 @@
/* Raise to HIGH_LEVEL */
KfRaiseIrql(HIGH_LEVEL);
+ /* Align stack and make space for the trap frame and NPX frame */
+ InitialStack &= ~KTRAP_FRAME_ALIGN;
+ __asm__ __volatile__("movl %0,%%esp" : :"r" (InitialStack));
+ __asm__ __volatile__("subl %0,%%esp" : :"r" (NPX_FRAME_LENGTH +
+ KTRAP_FRAME_LENGTH +
+ KTRAP_FRAME_ALIGN));
+ __asm__ __volatile__("push %0" : :"r" (CR0_EM + CR0_TS + CR0_MP));
+
/* Call main kernel initialization */
KiInitializeKernel(&KiInitialProcess.Pcb,
InitialThread,
- InitialStack,
+ (PVOID)InitialStack,
(PKPRCB)__readfsdword(KPCR_PRCB),
Cpu,
- LoaderBlock);
+ KeLoaderBlock);
/* Set the priority of this thread to 0 */
KeGetCurrentThread()->Priority = 0;
Author: amunger
Date: Sun Oct 1 08:47:34 2006
New Revision: 24329
URL: http://svn.reactos.org/svn/reactos?rev=24329&view=rev
Log:
Oops. I forgot the branch has a config.rbuild...
Modified:
branches/ros-branch-0_3_1/reactos/config.rbuild
Modified: branches/ros-branch-0_3_1/reactos/config.rbuild
URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_1/reactos/config…
==============================================================================
--- branches/ros-branch-0_3_1/reactos/config.rbuild (original)
+++ branches/ros-branch-0_3_1/reactos/config.rbuild Sun Oct 1 08:47:34 2006
@@ -67,6 +67,6 @@
enable this (except they/you purchased a license from the patent owner).
This settings is disabled (0) by default.
-->
-<property name="NSWPAT" value="1" />
+<property name="NSWPAT" value="0" />
</rbuild>