Set the boot processor as active processor in KeInit1.
[reactos.git] / reactos / ntoskrnl / ke / i386 / kernel.c
index 3ac6e52..7c5442c 100644 (file)
@@ -37,7 +37,7 @@ Ki386GetCpuId(VOID)
    ULONG OrigFlags, Flags, FinalFlags;
    ULONG MaxCpuidLevel;
    ULONG Dummy, Eax, Ecx, Edx;
-   PKPCR Pcr = KeGetCurrentKPCR();
+   PKIPCR Pcr = (PKIPCR)KeGetCurrentKPCR();
 
    Ke386CpuidFlags2 =  Ke386CpuidExFlags = 0;
    Ke386CacheAlignment = 32;
@@ -66,6 +66,10 @@ Ki386GetCpuId(VOID)
    {
       /* Get the feature flags. */
       Ki386Cpuid(1, &Eax, &Ke386CpuidExMisc, &Ke386CpuidFlags2, &Pcr->PrcbData.FeatureBits);
+
+      DPRINT ("Model:  %x\n", (Eax & 0xf00) == 0xf00 ? ((Eax >> 4) & 0xf) | ((Eax >> 12) & 0xf0) : (Eax >> 4) & 0xf);
+      DPRINT ("Family: %x\n", (Eax & 0xf00) == 0xf00 ? ((Eax >> 8) & 0xf) + ((Eax >> 20) & 0xff) : (Eax >> 8) & 0xf);
+
       /* Get the cache alignment, if it is available */
       if (Pcr->PrcbData.FeatureBits & (1<<19))
       {
@@ -161,16 +165,18 @@ KeCreateApplicationProcessorIdleThread(ULONG Id)
           Id, IdleThread->Cid.UniqueThread);
 }
 
-VOID INIT_FUNCTION
+VOID
+INIT_FUNCTION
+NTAPI
 KePrepareForApplicationProcessorInit(ULONG Id)
 {
   DPRINT("KePrepareForApplicationProcessorInit(Id %d)\n", Id);
   PFN_TYPE PrcPfn;
-  PKPCR Pcr;
-  PKPCR BootPcr;
+  PKIPCR Pcr;
+  PKIPCR BootPcr;
 
-  BootPcr = (PKPCR)KPCR_BASE;
-  Pcr = (PKPCR)((ULONG_PTR)KPCR_BASE + Id * PAGE_SIZE);
+  BootPcr = (PKIPCR)KPCR_BASE;
+  Pcr = (PKIPCR)((ULONG_PTR)KPCR_BASE + Id * PAGE_SIZE);
 
   MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &PrcPfn);
   MmCreateVirtualMappingForKernel((PVOID)Pcr,
@@ -182,25 +188,30 @@ KePrepareForApplicationProcessorInit(ULONG Id)
    */
   memset(Pcr, 0, PAGE_SIZE);
   Pcr->Number = Id;
-  Pcr->Tib.Self = &Pcr->Tib;
-  Pcr->Self = Pcr;
+  Pcr->SetMember = 1 << Id;
+  Pcr->NtTib.Self = &Pcr->NtTib;
+  Pcr->Self = (PKPCR)Pcr;
   Pcr->Prcb = &Pcr->PrcbData;
   Pcr->Irql = SYNCH_LEVEL;
 
+  Pcr->PrcbData.SetMember = 1 << Id;
   Pcr->PrcbData.MHz = BootPcr->PrcbData.MHz;
   Pcr->StallScaleFactor = BootPcr->StallScaleFactor;
 
   /* Mark the end of the exception handler list */
-  Pcr->Tib.ExceptionList = (PVOID)-1;
+  Pcr->NtTib.ExceptionList = (PVOID)-1;
 
   KiGdtPrepareForApplicationProcessorInit(Id);
+
+  KeActiveProcessors |= 1 << Id;
 }
 
 VOID
+NTAPI
 KeApplicationProcessorInit(VOID)
 {
   ULONG Offset;
-  PKPCR Pcr;
+  PKIPCR Pcr;
 
   DPRINT("KeApplicationProcessorInit()\n");
 
@@ -212,12 +223,12 @@ KeApplicationProcessorInit(VOID)
 
 
   Offset = InterlockedIncrementUL(&PcrsAllocated) - 1;
-  Pcr = (PKPCR)((ULONG_PTR)KPCR_BASE + Offset * PAGE_SIZE);
+  Pcr = (PKIPCR)((ULONG_PTR)KPCR_BASE + Offset * PAGE_SIZE);
 
   /*
    * Initialize the GDT
    */
-  KiInitializeGdt(Pcr);
+  KiInitializeGdt((PKPCR)Pcr);
 
   /* Get processor information. */
   Ki386GetCpuId();
@@ -258,10 +269,12 @@ KeApplicationProcessorInit(VOID)
   Ke386EnableInterrupts();
 }
 
-VOID INIT_FUNCTION
+VOID
+INIT_FUNCTION
+NTAPI
 KeInit1(PCHAR CommandLine, PULONG LastKernelAddress)
 {
-   PKPCR KPCR;
+   PKIPCR KPCR;
    BOOLEAN Pae = FALSE;
    BOOLEAN NoExecute = FALSE;
    PCHAR p1, p2;
@@ -274,16 +287,19 @@ KeInit1(PCHAR CommandLine, PULONG LastKernelAddress)
     * called, so we use a predefined page in low memory
     */
 
-   KPCR = (PKPCR)KPCR_BASE;
+   KPCR = (PKIPCR)KPCR_BASE;
    memset(KPCR, 0, PAGE_SIZE);
-   KPCR->Self = KPCR;
+   KPCR->Self = (PKPCR)KPCR;
    KPCR->Prcb = &KPCR->PrcbData;
    KPCR->Irql = SYNCH_LEVEL;
-   KPCR->Tib.Self  = &KPCR->Tib;
+   KPCR->NtTib.Self = &KPCR->NtTib;
    KPCR->GDT = KiBootGdt;
    KPCR->IDT = (PUSHORT)KiIdt;
    KPCR->TSS = &KiBootTss;
    KPCR->Number = 0;
+   KPCR->SetMember = 1 << 0;
+   KeActiveProcessors = 1 << 0;
+   KPCR->PrcbData.SetMember = 1 << 0;
    KiPcrInitDone = 1;
    PcrsAllocated++;
 
@@ -298,13 +314,16 @@ KeInit1(PCHAR CommandLine, PULONG LastKernelAddress)
    KiCheckFPU();
 
    /* Mark the end of the exception handler list */
-   KPCR->Tib.ExceptionList = (PVOID)-1;
+   KPCR->NtTib.ExceptionList = (PVOID)-1;
 
    KeInitDpc(KPCR->Prcb);
 
    KeInitExceptions ();
    KeInitInterrupts ();
 
+   KeActiveProcessors |= 1 << 0;
+
+
    if (KPCR->PrcbData.FeatureBits & X86_FEATURE_PGE)
    {
       ULONG Flags;
@@ -388,10 +407,12 @@ KeInit1(PCHAR CommandLine, PULONG LastKernelAddress)
    }
 }
 
-VOID INIT_FUNCTION
+VOID
+INIT_FUNCTION
+NTAPI
 KeInit2(VOID)
 {
-   PKPCR Pcr = KeGetCurrentKPCR();
+   PKIPCR Pcr = (PKIPCR)KeGetCurrentKPCR();
 
    KiInitializeBugCheck();
    KeInitializeDispatcher();
@@ -454,10 +475,11 @@ KeInit2(VOID)
 VOID INIT_FUNCTION
 Ki386SetProcessorFeatures(VOID)
 {
-   PKPCR Pcr = KeGetCurrentKPCR();
+   PKIPCR Pcr = (PKIPCR)KeGetCurrentKPCR();
    OBJECT_ATTRIBUTES ObjectAttributes;
-   UNICODE_STRING KeyName;
-   UNICODE_STRING ValueName;
+   UNICODE_STRING KeyName =
+   RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Session Manager\\Kernel");
+   UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"FastSystemCallDisable");
    HANDLE KeyHandle;
    ULONG ResultLength;
    KEY_VALUE_PARTIAL_INFORMATION ValueData;
@@ -488,10 +510,6 @@ Ki386SetProcessorFeatures(VOID)
         /* FIXME: Check for Family == 6, Model < 3 and Stepping < 3 and disable */
 
         /* Make sure it's not disabled in registry */
-        RtlRosInitUnicodeStringFromLiteral(&KeyName,
-                                           L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Session Manager\\Kernel");
-        RtlRosInitUnicodeStringFromLiteral(&ValueName,
-                                           L"FastSystemCallDisable");
         InitializeObjectAttributes(&ObjectAttributes,
                                    &KeyName,
                                    OBJ_CASE_INSENSITIVE,
@@ -521,25 +539,17 @@ Ki386SetProcessorFeatures(VOID)
     }
 
     if (FastSystemCallDisable) {
-
         /* Use INT2E */
-        SharedUserData->SystemCall[0] = 0x8D;
-        SharedUserData->SystemCall[1] = 0x54;
-        SharedUserData->SystemCall[2] = 0x24;
-        SharedUserData->SystemCall[3] = 0x08;
-        SharedUserData->SystemCall[4] = 0xCD;
-        SharedUserData->SystemCall[5] = 0x2E;
-        SharedUserData->SystemCall[6] = 0xC3;
-
+        const unsigned char Entry[7] = {0x8D, 0x54, 0x24, 0x08,     /* lea    0x8(%esp),%edx    */
+                                        0xCD, 0x2E,                 /* int    0x2e              */
+                                        0xC3};                      /* ret                      */
+        memcpy(&SharedUserData->SystemCall, Entry, sizeof(Entry));
     } else {
-
         /* Use SYSENTER */
-        SharedUserData->SystemCall[0] = 0x8B;
-        SharedUserData->SystemCall[1] = 0xD4;
-        SharedUserData->SystemCall[2] = 0x0F;
-        SharedUserData->SystemCall[3] = 0x34;
-        SharedUserData->SystemCall[4] = 0xC3;
-
+        const unsigned char Entry[5] = {0x8B, 0xD4,                 /* movl    %esp,%edx        */ 
+                                        0x0F, 0x34,                 /* sysenter                 */
+                                        0xC3};                      /* ret                      */    
+        memcpy(&SharedUserData->SystemCall, Entry, sizeof(Entry));
         /* Enable SYSENTER/SYSEXIT */
         KiFastSystemCallDisable = 0;
     }