diff --git a/xtoskrnl/hl/x86/cpu.c b/xtoskrnl/hl/x86/cpu.c index 1afc954..bd00512 100644 --- a/xtoskrnl/hl/x86/cpu.c +++ b/xtoskrnl/hl/x86/cpu.c @@ -12,17 +12,19 @@ /** * Initializes the processor. * + * @param CpuNumber + * Supplies the number of the CPU, that is being initialized. + * * @return This routine does not return any value. * * @since XT 1.0 */ XTAPI VOID -HlInitializeProcessor(VOID) +HlInitializeProcessor(IN ULONG CpuNumber) { PKPROCESSOR_BLOCK ProcessorBlock; KAFFINITY Affinity; - ULONG CpuNumber = 0; /* Get current processor block */ ProcessorBlock = KeGetCurrentProcessorBlock(); @@ -40,7 +42,7 @@ HlInitializeProcessor(VOID) HlpActiveProcessors |= Affinity; /* Initialize APIC for this processor */ - HlpInitializeApic(); + HlpInitializePic(CpuNumber); /* Set the APIC running level */ HlSetRunLevel(KeGetCurrentProcessorBlock()->RunLevel); diff --git a/xtoskrnl/hl/x86/pic.c b/xtoskrnl/hl/x86/pic.c index d59d4dd..56cf77e 100644 --- a/xtoskrnl/hl/x86/pic.c +++ b/xtoskrnl/hl/x86/pic.c @@ -178,20 +178,20 @@ HlpHandlePicSpuriousService(VOID) /** * Initializes the APIC interrupt controller. * + * @param CpuNumber + * Supplies the number of the CPU, that is being initialized. + * * @return This routine does not return any value. * * @since XT 1.0 - * - * @todo Register interrupt handlers for spurious vectors. */ XTAPI VOID -HlpInitializeApic(VOID) +HlpInitializeApic(IN ULONG CpuNumber) { APIC_BASE_REGISTER BaseRegister; APIC_LVT_REGISTER LvtRegister; APIC_SPURIOUS_REGISTER SpuriousRegister; - ULONG CpuNumber = 0; /* Check if this is an x2APIC compatible machine */ if(HlpCheckX2ApicSupport()) @@ -209,7 +209,7 @@ HlpInitializeApic(VOID) BaseRegister.LongLong = ArReadModelSpecificRegister(APIC_LAPIC_MSR_BASE); BaseRegister.Enable = 1; BaseRegister.ExtendedMode = (HlpApicMode == APIC_MODE_X2APIC); - BaseRegister.BootStrapProcessor = 1; + BaseRegister.BootStrapProcessor = (CpuNumber == 0) ? 1 : 0; ArWriteModelSpecificRegister(APIC_LAPIC_MSR_BASE, BaseRegister.LongLong); /* xAPIC compatibility mode specific initialization */ @@ -266,3 +266,24 @@ HlpInitializeApic(VOID) KeSetInterruptHandler(APIC_VECTOR_SPURIOUS, HlpHandleApicSpuriousService); KeSetInterruptHandler(PIC1_VECTOR_SPURIOUS, HlpHandlePicSpuriousService); } + +/** + * Initializes the (A)PIC interrupt controller. + * + * @param CpuNumber + * Supplies the number of the CPU, that is being initialized. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + * + * @todo Initialize APIC only when supported, otherwise fall back to legacy PIC. + */ +XTAPI +VOID +HlpInitializePic(IN ULONG CpuNumber) +{ + /* Disable legacy PIC and initialize APIC */ + HlDisableLegacyPic(); + HlpInitializeApic(CpuNumber); +} diff --git a/xtoskrnl/includes/amd64/hli.h b/xtoskrnl/includes/amd64/hli.h index 9158706..653f6a1 100644 --- a/xtoskrnl/includes/amd64/hli.h +++ b/xtoskrnl/includes/amd64/hli.h @@ -48,7 +48,11 @@ HlpHandlePicSpuriousService(VOID); XTAPI VOID -HlpInitializeApic(VOID); +HlpInitializeApic(IN ULONG CpuNumber); + +XTAPI +VOID +HlpInitializePic(IN ULONG CpuNumber); XTFASTCALL KRUNLEVEL diff --git a/xtoskrnl/includes/hli.h b/xtoskrnl/includes/hli.h index 208390e..e9db2d2 100644 --- a/xtoskrnl/includes/hli.h +++ b/xtoskrnl/includes/hli.h @@ -68,6 +68,6 @@ HlSetRunLevel(IN KRUNLEVEL RunLevel); XTAPI VOID -HlInitializeProcessor(VOID); +HlInitializeProcessor(IN ULONG CpuNumber); #endif /* __XTOSKRNL_HLI_H */ diff --git a/xtoskrnl/includes/i686/hli.h b/xtoskrnl/includes/i686/hli.h index e4d3770..b7d5d2a 100644 --- a/xtoskrnl/includes/i686/hli.h +++ b/xtoskrnl/includes/i686/hli.h @@ -48,7 +48,11 @@ HlpHandlePicSpuriousService(VOID); XTAPI VOID -HlpInitializeApic(VOID); +HlpInitializeApic(IN ULONG CpuNumber); + +XTAPI +VOID +HlpInitializePic(IN ULONG CpuNumber); XTFASTCALL KRUNLEVEL diff --git a/xtoskrnl/ke/amd64/krnlinit.c b/xtoskrnl/ke/amd64/krnlinit.c index c65d900..e51a381 100644 --- a/xtoskrnl/ke/amd64/krnlinit.c +++ b/xtoskrnl/ke/amd64/krnlinit.c @@ -73,14 +73,11 @@ KepInitializeMachine(VOID) HlIoPortOutByte(0x376, 0); HlIoPortOutByte(0x3F6, 0); - /* Disable the legacy PIC */ - HlDisableLegacyPic(); - /* Initialize frame buffer */ HlInitializeFrameBuffer(); /* Initialize processor */ - HlInitializeProcessor(); + HlInitializeProcessor(0); } /** diff --git a/xtoskrnl/ke/i686/krnlinit.c b/xtoskrnl/ke/i686/krnlinit.c index 10467e7..15e75f8 100644 --- a/xtoskrnl/ke/i686/krnlinit.c +++ b/xtoskrnl/ke/i686/krnlinit.c @@ -73,14 +73,11 @@ KepInitializeMachine(VOID) HlIoPortOutByte(0x376, 0); HlIoPortOutByte(0x3F6, 0); - /* Disable the legacy PIC */ - HlDisableLegacyPic(); - /* Initialize frame buffer */ HlInitializeFrameBuffer(); /* Initialize processor */ - HlInitializeProcessor(); + HlInitializeProcessor(0); } /**