From dec021b1ecf014107a2210b68fa7d83190266d15 Mon Sep 17 00:00:00 2001 From: belliash Date: Wed, 28 Dec 2022 23:11:35 +0100 Subject: [PATCH] Reorganize early debug printing; initialize kernel stacks when needed --- sdk/xtdk/xtdebug.h | 20 ++++++++++++++++++++ sdk/xtdk/xtfw.h | 3 ++- sdk/xtdk/xtkmapi.h | 1 + xtldr/modules/xtos/xtos.c | 5 +++-- xtoskrnl/CMakeLists.txt | 4 +++- xtoskrnl/includes/globals.h | 24 ++++++++++++++++++++++++ xtoskrnl/includes/xtos.h | 13 +++++++++++++ xtoskrnl/ke/globals.c | 19 +++++++++++++++++++ xtoskrnl/ke/krnlinit.c | 30 +++++++++++++++++++++++++----- 9 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 sdk/xtdk/xtdebug.h create mode 100644 xtoskrnl/includes/globals.h create mode 100644 xtoskrnl/includes/xtos.h create mode 100644 xtoskrnl/ke/globals.c diff --git a/sdk/xtdk/xtdebug.h b/sdk/xtdk/xtdebug.h new file mode 100644 index 0000000..520c300 --- /dev/null +++ b/sdk/xtdk/xtdebug.h @@ -0,0 +1,20 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: sdk/xtdk/xtdebug.h + * DESCRIPTION: XT debugging support + * DEVELOPERS: Rafal Kupiec + */ + +#ifndef __XTDK_XTDEBUG_H +#define __XTDK_XTDEBUG_H + + +/* XTOS platform debugging macros */ +#ifdef DBG + #define LDRPRINT(Format, ...) if(LdrPrint) LdrPrint(Format, __VA_ARGS__); +#else + #define LDRPRINT(Format, ...) ((VOID)NULL) +#endif + +#endif /* __XTDK_XTDEBUG_H */ diff --git a/sdk/xtdk/xtfw.h b/sdk/xtdk/xtfw.h index c8d12fa..f8e5aae 100644 --- a/sdk/xtdk/xtfw.h +++ b/sdk/xtdk/xtfw.h @@ -104,7 +104,8 @@ typedef struct _KERNEL_INITIALIZATION_BLOCK LIST_ENTRY BootDriverListHead; ULONG Size; ULONG Version; - ULONG_PTR KernelStack; + ULONG_PTR KernelBootStack; + ULONG_PTR KernelFaultStack; LOADER_INFORMATION_BLOCK LoaderInformation; FIRMWARE_INFORMATION_BLOCK FirmwareInformation; } KERNEL_INITIALIZATION_BLOCK, *PKERNEL_INITIALIZATION_BLOCK; diff --git a/sdk/xtdk/xtkmapi.h b/sdk/xtdk/xtkmapi.h index 22d6c5c..42591da 100644 --- a/sdk/xtdk/xtkmapi.h +++ b/sdk/xtdk/xtkmapi.h @@ -20,6 +20,7 @@ /* Architecture-independent XT API */ #include "xtcommon.h" +#include "xtdebug.h" #include "xtimage.h" #include "xtuefi.h" #include "xtfw.h" diff --git a/xtldr/modules/xtos/xtos.c b/xtldr/modules/xtos/xtos.c index d1d5f87..015fbf3 100644 --- a/xtldr/modules/xtos/xtos.c +++ b/xtldr/modules/xtos/xtos.c @@ -283,8 +283,9 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, LoaderBlock->Size = sizeof(KERNEL_INITIALIZATION_BLOCK); LoaderBlock->Version = INITIALIZATION_BLOCK_VERSION; - /* No kernel stack available now */ - LoaderBlock->KernelStack = (ULONG_PTR)NULL; + /* No kernel boot, nor fault stacks available now */ + LoaderBlock->KernelBootStack = (ULONG_PTR)NULL; + LoaderBlock->KernelFaultStack = (ULONG_PTR)NULL; /* Set LoaderInformation block properties */ LoaderBlock->LoaderInformation.DbgPrint = XtLdrProtocol->DbgPrint; diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index 331a868..c978053 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -3,12 +3,14 @@ PROJECT(XTOSKRNL) # Specify include directories include_directories( - ${EXECTOS_SOURCE_DIR}/sdk/xtdk) + ${EXECTOS_SOURCE_DIR}/sdk/xtdk + ${XTOSKRNL_SOURCE_DIR}/includes) # Specify list of source code files list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/hl/cport.c ${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/cpufunc.c + ${XTOSKRNL_SOURCE_DIR}/ke/globals.c ${XTOSKRNL_SOURCE_DIR}/ke/krnlinit.c ${XTOSKRNL_SOURCE_DIR}/rtl/memory.c ${XTOSKRNL_SOURCE_DIR}/rtl/plist.c diff --git a/xtoskrnl/includes/globals.h b/xtoskrnl/includes/globals.h new file mode 100644 index 0000000..9a02d35 --- /dev/null +++ b/xtoskrnl/includes/globals.h @@ -0,0 +1,24 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/includes/globals.h + * DESCRIPTION: XT kernel global variables + * DEVELOPERS: Rafal Kupiec + */ + +#ifndef __XTOSKRNL_GLOBALS_H +#define __XTOSKRNL_GLOBALS_H + +#include + + +/* Kernel own boot stack */ +EXTERN UCHAR KepKernelBootStackData[KERNEL_STACK_SIZE]; + +/* Kernel own fault stack */ +EXTERN UCHAR KepKernelFaultStackData[KERNEL_STACK_SIZE]; + +/* Pointer to boot loader provided DbgPrint() routine */ +EXTERN VOID (*LdrPrint)(IN PWCHAR Format, IN ...); + +#endif /* __XTOSKRNL_GLOBALS_H */ diff --git a/xtoskrnl/includes/xtos.h b/xtoskrnl/includes/xtos.h new file mode 100644 index 0000000..2f6d9e6 --- /dev/null +++ b/xtoskrnl/includes/xtos.h @@ -0,0 +1,13 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/includes/xtos.h + * DESCRIPTION: Top level header for the XT kernel + * DEVELOPERS: Rafal Kupiec + */ + +/* XT Development Kit */ +#include + +/* Kernel specific headers */ +#include "globals.h" diff --git a/xtoskrnl/ke/globals.c b/xtoskrnl/ke/globals.c new file mode 100644 index 0000000..1098de6 --- /dev/null +++ b/xtoskrnl/ke/globals.c @@ -0,0 +1,19 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/ke/globals.c + * DESCRIPTION: XT kernel global variables + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/* Kernel own boot stack */ +UCHAR KepKernelBootStackData[KERNEL_STACK_SIZE] = {0}; + +/* Kernel own fault stack */ +UCHAR KepKernelFaultStackData[KERNEL_STACK_SIZE] = {0}; + +/* Pointer to boot loader provided DbgPrint() routine */ +VOID (*LdrPrint)(IN PWCHAR Format, IN ...) = NULL; diff --git a/xtoskrnl/ke/krnlinit.c b/xtoskrnl/ke/krnlinit.c index e9d1101..daf66ab 100644 --- a/xtoskrnl/ke/krnlinit.c +++ b/xtoskrnl/ke/krnlinit.c @@ -6,7 +6,7 @@ * DEVELOPERS: Rafal Kupiec */ -#include +#include /** @@ -23,14 +23,34 @@ XTAPI VOID KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters) { - /* Use XTLDR provided DbgPrint() routine for early printing to serial console */ - VOID (*DbgPrint)(IN PWCHAR Format, IN ...) = Parameters->LoaderInformation.DbgPrint; + /* Check if debugging enabled and if boot loader provided routine for debug printing */ + if(DBG && Parameters->LoaderInformation.DbgPrint) + { + /* Use loader's provided DbgPrint() routine for early printing to serial console */ + LdrPrint = Parameters->LoaderInformation.DbgPrint; + } + + /* Make sure kernel boot stack is initialized */ + if(!Parameters->KernelBootStack) + { + /* Initialize kernel boot stack */ + LDRPRINT(L"Initializing kernel boot stack\n"); + Parameters->KernelBootStack = (ULONG_PTR)&KepKernelBootStackData[KERNEL_STACK_SIZE]; + } + + /* Make sure kernel fault stack is initialized */ + if(!Parameters->KernelFaultStack) + { + /* Initialize kernel fault stack */ + LDRPRINT(L"Initializing kernel fault stack\n"); + Parameters->KernelFaultStack = (ULONG_PTR)&KepKernelFaultStackData[KERNEL_STACK_SIZE]; + } /* Print some message to serial console */ - DbgPrint(L"Hello world from ExectOS kernel!\n"); + LDRPRINT(L"Hello world from ExectOS kernel!\n"); /* Test kernel parameters */ - DbgPrint(L"\n\n------ Kernel parameters block ------\n" + LDRPRINT(L"\n\n------ Kernel parameters block ------\n" L"Loader block size: %lu\n" L"Loader block version: %lu\n" L"EFI Revision: %lu\n"