From f6c621c2a61e00243b524c1d7eb566b62c1f096c Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Tue, 28 Nov 2023 22:31:39 +0100 Subject: [PATCH] Basic processor initialization code --- sdk/xtdk/amd64/hltypes.h | 13 ++++++++++ sdk/xtdk/i686/hltypes.h | 13 ++++++++++ xtoskrnl/CMakeLists.txt | 1 + xtoskrnl/hl/cpu.c | 47 +++++++++++++++++++++++++++++++++++++ xtoskrnl/hl/globals.c | 6 +++++ xtoskrnl/includes/globals.h | 6 +++++ xtoskrnl/includes/hl.h | 4 ++++ 7 files changed, 90 insertions(+) create mode 100644 xtoskrnl/hl/cpu.c diff --git a/sdk/xtdk/amd64/hltypes.h b/sdk/xtdk/amd64/hltypes.h index ab06ce2..e50334b 100644 --- a/sdk/xtdk/amd64/hltypes.h +++ b/sdk/xtdk/amd64/hltypes.h @@ -70,6 +70,9 @@ /* Serial port I/O addresses */ #define COMPORT_ADDRESSES {0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8} +/* Initial stall factor */ +#define INITIAL_STALL_FACTOR 100 + /* APIC Base Register */ typedef union _APIC_BASE_REGISTER { @@ -118,4 +121,14 @@ typedef union _APIC_SPURIOUS_REGISTER }; } APIC_SPURIOUS_REGISTER, *PAPIC_SPURIOUS_REGISTER; +/* Processor identity structure */ +typedef struct _HAL_PROCESSOR_IDENTITY +{ + UCHAR ProcessorId; + UCHAR LApicId; + BOOLEAN Bsp; + BOOLEAN Started; + PKPROCESSOR_BLOCK ProcessorBlock; +} HAL_PROCESSOR_IDENTITY, *PHAL_PROCESSOR_IDENTITY; + #endif /* __XTDK_AMD64_HLTYPES_H */ diff --git a/sdk/xtdk/i686/hltypes.h b/sdk/xtdk/i686/hltypes.h index 386175c..322e9c9 100644 --- a/sdk/xtdk/i686/hltypes.h +++ b/sdk/xtdk/i686/hltypes.h @@ -75,6 +75,9 @@ /* Serial port I/O addresses */ #define COMPORT_ADDRESSES {0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8} +/* Initial stall factor */ +#define INITIAL_STALL_FACTOR 100 + /* APIC Base Register */ typedef union _APIC_BASE_REGISTER { @@ -123,4 +126,14 @@ typedef union _APIC_SPURIOUS_REGISTER }; } APIC_SPURIOUS_REGISTER, *PAPIC_SPURIOUS_REGISTER; +/* Processor identity structure */ +typedef struct _HAL_PROCESSOR_IDENTITY +{ + UCHAR ProcessorId; + UCHAR LApicId; + BOOLEAN Bsp; + BOOLEAN Started; + PKPROCESSOR_BLOCK ProcessorBlock; +} HAL_PROCESSOR_IDENTITY, *PHAL_PROCESSOR_IDENTITY; + #endif /* __XTDK_I686_HLTYPES_H */ diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index 175a3e6..d0fde8d 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -14,6 +14,7 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/ar/${ARCH}/traps.c ${XTOSKRNL_SOURCE_DIR}/ex/rundown.c ${XTOSKRNL_SOURCE_DIR}/hl/cport.c + ${XTOSKRNL_SOURCE_DIR}/hl/cpu.c ${XTOSKRNL_SOURCE_DIR}/hl/efifb.c ${XTOSKRNL_SOURCE_DIR}/hl/globals.c ${XTOSKRNL_SOURCE_DIR}/hl/pic.c diff --git a/xtoskrnl/hl/cpu.c b/xtoskrnl/hl/cpu.c new file mode 100644 index 0000000..7a4cf69 --- /dev/null +++ b/xtoskrnl/hl/cpu.c @@ -0,0 +1,47 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/hl/cpu.c + * DESCRIPTION: HAL Processor support + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * Initializes the processor. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +HlInitializeProcessor(VOID) +{ + PKPROCESSOR_BLOCK ProcessorBlock; + KAFFINITY Affinity; + ULONG CpuNumber = 0; + + /* Get current processor block */ + ProcessorBlock = KeGetCurrentProcessorBlock(); + + /* Set initial stall factor */ + ProcessorBlock->StallScaleFactor = INITIAL_STALL_FACTOR; + + /* Record processor block in the processors table */ + HlpProcessorsIdentity[CpuNumber].ProcessorBlock = ProcessorBlock; + + /* Set processor affinity */ + Affinity = (KAFFINITY) 1 << CpuNumber; + + /* Apply affinity to a set of processors */ + HlpActiveProcessors |= Affinity; + + /* Initialize APIC for this processor */ + HlpInitializeApic(); + + /* Set the APIC running level */ + HlSetRunLevel(KeGetCurrentProcessorBlock()->RunLevel); +} diff --git a/xtoskrnl/hl/globals.c b/xtoskrnl/hl/globals.c index 8bf7ecb..440f324 100644 --- a/xtoskrnl/hl/globals.c +++ b/xtoskrnl/hl/globals.c @@ -9,8 +9,14 @@ #include +/* Active processors count */ +KAFFINITY HlpActiveProcessors; + /* APIC mode */ HAL_APIC_MODE HlpApicMode; /* FrameBuffer information */ HAL_FRAMEBUFFER_DATA HlpFrameBufferData; + +/* Processors identity table */ +HAL_PROCESSOR_IDENTITY HlpProcessorsIdentity[MAXIMUM_PROCESSORS] = {{0}}; diff --git a/xtoskrnl/includes/globals.h b/xtoskrnl/includes/globals.h index 70b111a..cc426ab 100644 --- a/xtoskrnl/includes/globals.h +++ b/xtoskrnl/includes/globals.h @@ -12,12 +12,18 @@ #include +/* Active processors count */ +EXTERN KAFFINITY HlpActiveProcessors; + /* APIC mode */ EXTERN HAL_APIC_MODE HlpApicMode; /* FrameBuffer information */ EXTERN HAL_FRAMEBUFFER_DATA HlpFrameBufferData; +/* Processors identity table */ +EXTERN HAL_PROCESSOR_IDENTITY HlpProcessorsIdentity[MAXIMUM_PROCESSORS]; + /* Pointer to boot loader provided DbgPrint() routine */ EXTERN VOID (*KeDbgPrint)(IN PWCHAR Format, IN ...); diff --git a/xtoskrnl/includes/hl.h b/xtoskrnl/includes/hl.h index 78301b0..96d0986 100644 --- a/xtoskrnl/includes/hl.h +++ b/xtoskrnl/includes/hl.h @@ -85,6 +85,10 @@ XTAPI VOID HlpInitializeApic(VOID); +XTAPI +VOID +HlInitializeProcessor(VOID); + XTFASTCALL KRUNLEVEL HlpTransformApicTprToRunLevel(IN UCHAR Tpr);