From 63f8dbc59b35db45edc017a8ba3dd039f0f00d22 Mon Sep 17 00:00:00 2001 From: belliash Date: Thu, 2 Nov 2023 23:07:11 +0100 Subject: [PATCH] Initialize CPU power structures, idle process and idle thread --- xtoskrnl/includes/amd64/ke.h | 4 ++++ xtoskrnl/includes/globals.h | 3 +++ xtoskrnl/includes/i686/ke.h | 4 ++++ xtoskrnl/ke/amd64/krnlinit.c | 44 ++++++++++++++++++++++++++++++++++++ xtoskrnl/ke/globals.c | 3 +++ xtoskrnl/ke/i686/krnlinit.c | 35 ++++++++++++++++++++++++++++ 6 files changed, 93 insertions(+) diff --git a/xtoskrnl/includes/amd64/ke.h b/xtoskrnl/includes/amd64/ke.h index a6315d34..1229d720 100644 --- a/xtoskrnl/includes/amd64/ke.h +++ b/xtoskrnl/includes/amd64/ke.h @@ -25,6 +25,10 @@ XTAPI PKTHREAD KeGetCurrentThread(VOID); +XTAPI +VOID +KepInitializeKernel(VOID); + XTAPI VOID KepInitializeMachine(VOID); diff --git a/xtoskrnl/includes/globals.h b/xtoskrnl/includes/globals.h index d84d7bdc..98a36717 100644 --- a/xtoskrnl/includes/globals.h +++ b/xtoskrnl/includes/globals.h @@ -30,4 +30,7 @@ EXTERN ETHREAD KeInitialThread; /* Kernel service descriptor table */ EXTERN KSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable[KSERVICE_TABLES_COUNT]; +/* Kernel process list */ +EXTERN LIST_ENTRY KepProcessListHead; + #endif /* __XTOSKRNL_GLOBALS_H */ diff --git a/xtoskrnl/includes/i686/ke.h b/xtoskrnl/includes/i686/ke.h index cbf68325..76e1e3d9 100644 --- a/xtoskrnl/includes/i686/ke.h +++ b/xtoskrnl/includes/i686/ke.h @@ -25,6 +25,10 @@ XTAPI PKTHREAD KeGetCurrentThread(VOID); +XTAPI +VOID +KepInitializeKernel(VOID); + XTAPI VOID KepInitializeMachine(VOID); diff --git a/xtoskrnl/ke/amd64/krnlinit.c b/xtoskrnl/ke/amd64/krnlinit.c index ced88a8e..b411f02d 100644 --- a/xtoskrnl/ke/amd64/krnlinit.c +++ b/xtoskrnl/ke/amd64/krnlinit.c @@ -9,6 +9,45 @@ #include +/** + * This routine initializes XT kernel. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +KepInitializeKernel(VOID) +{ + PKPROCESSOR_CONTROL_BLOCK Prcb; + ULONG_PTR PageDirectory[2]; + PKTHREAD CurrentThread; + + /* Get processor control block and current thread */ + Prcb = KeGetCurrentProcessorControlBlock(); + CurrentThread = KeGetCurrentThread(); + + /* Initialize CPU power state structures */ + PoInitializeProcessorControlBlock(Prcb); + + /* Initialize Idle process */ + RtlInitializeListHead(&KepProcessListHead); + PageDirectory[0] = 0; + PageDirectory[1] = 0; + KeInitializeProcess(CurrentThread->ApcState.Process, 0, 0xFFFFFFFF, PageDirectory, FALSE); + CurrentThread->ApcState.Process->Quantum = MAXCHAR; + + /* Initialize Idle thread */ + KeInitializeThread(CurrentThread->ApcState.Process, CurrentThread, NULL, NULL, NULL, NULL, NULL, Prcb->DpcStack); + CurrentThread->NextProcessor = Prcb->Number; + CurrentThread->Priority = THREAD_HIGH_PRIORITY; + CurrentThread->State = Running; + CurrentThread->Affinity = (ULONG_PTR)1 << Prcb->Number; + CurrentThread->WaitIrql = DISPATCH_LEVEL; + CurrentThread->ApcState.Process->ActiveProcessors |= (ULONG_PTR)1 << Prcb->Number; +} + /** * Performs architecture-specific initialization for the kernel executive. * @@ -39,6 +78,11 @@ KepStartKernel(VOID) /* Print debug message */ DebugPrint(L"Starting ExectOS ...\n"); + /* Initialize XTOS kernel */ + KepInitializeKernel(); + + /* Enter infinite loop */ + DebugPrint(L"KepStartKernel() finished. Entering infinite loop.\n"); for(;;); } diff --git a/xtoskrnl/ke/globals.c b/xtoskrnl/ke/globals.c index e2c6f042..b0c3e68e 100644 --- a/xtoskrnl/ke/globals.c +++ b/xtoskrnl/ke/globals.c @@ -23,3 +23,6 @@ ETHREAD KeInitialThread; /* Kernel service descriptor table */ KSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable[KSERVICE_TABLES_COUNT]; + +/* Kernel process list */ +LIST_ENTRY KepProcessListHead; diff --git a/xtoskrnl/ke/i686/krnlinit.c b/xtoskrnl/ke/i686/krnlinit.c index 671abebf..654f80c0 100644 --- a/xtoskrnl/ke/i686/krnlinit.c +++ b/xtoskrnl/ke/i686/krnlinit.c @@ -9,6 +9,36 @@ #include +/** + * This routine initializes XT kernel. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +KepInitializeKernel(VOID) +{ + PKPROCESSOR_CONTROL_BLOCK Prcb; + ULONG_PTR PageDirectory[2]; + PKTHREAD CurrentThread; + + /* Get processor control block and current thread */ + Prcb = KeGetCurrentProcessorControlBlock(); + CurrentThread = KeGetCurrentThread(); + + /* Initialize CPU power state structures */ + PoInitializeProcessorControlBlock(Prcb); + + /* Initialize Idle process */ + RtlInitializeListHead(&KepProcessListHead); + PageDirectory[0] = 0; + PageDirectory[1] = 0; + KeInitializeProcess(CurrentThread->ApcState.Process, 0, 0xFFFFFFFF, PageDirectory, FALSE); + CurrentThread->ApcState.Process->Quantum = MAXCHAR; +} + /** * Performs architecture-specific initialization for the kernel executive. * @@ -39,6 +69,11 @@ KepStartKernel(VOID) /* Print debug message */ DebugPrint(L"Starting ExectOS ...\n"); + /* Initialize XTOS kernel */ + KepInitializeKernel(); + + /* Enter infinite loop */ + DebugPrint(L"KepStartKernel() finished. Entering infinite loop.\n"); for(;;); }