From a3c28cee73b068ef294acb8311a20bf008428985 Mon Sep 17 00:00:00 2001 From: belliash Date: Mon, 20 Nov 2023 15:18:22 +0100 Subject: [PATCH 01/10] Initial XTLDR APIC support, finds and maps base APIC address for kernel --- sdk/xtdk/amd64/arfuncs.h | 4 +++ sdk/xtdk/amd64/hltypes.h | 3 ++ sdk/xtdk/i686/arfuncs.h | 4 +++ sdk/xtdk/i686/hltypes.h | 3 ++ xtldr/modules/xtos/includes/xtos.h | 4 +++ xtldr/modules/xtos/xtos.c | 56 ++++++++++++++++++++++++++++++ 6 files changed, 74 insertions(+) diff --git a/sdk/xtdk/amd64/arfuncs.h b/sdk/xtdk/amd64/arfuncs.h index 6e059dd..0ec7341 100644 --- a/sdk/xtdk/amd64/arfuncs.h +++ b/sdk/xtdk/amd64/arfuncs.h @@ -32,6 +32,10 @@ XTCDECL ULONG_PTR ArReadControlRegister(IN USHORT ControlRegister); +XTCDECL +ULONGLONG +ArReadModelSpecificRegister(IN ULONG Register); + XTCDECL VOID ArWriteControlRegister(IN USHORT ControlRegister, diff --git a/sdk/xtdk/amd64/hltypes.h b/sdk/xtdk/amd64/hltypes.h index 33926fe..55a3717 100644 --- a/sdk/xtdk/amd64/hltypes.h +++ b/sdk/xtdk/amd64/hltypes.h @@ -14,6 +14,9 @@ #include +/* APIC base address */ +#define APIC_BASE 0xFFFFFFFFFFFE0000ULL + /* Serial port I/O addresses */ #define COMPORT_ADDRESSES {0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8} diff --git a/sdk/xtdk/i686/arfuncs.h b/sdk/xtdk/i686/arfuncs.h index ceab1ec..176313f 100644 --- a/sdk/xtdk/i686/arfuncs.h +++ b/sdk/xtdk/i686/arfuncs.h @@ -32,6 +32,10 @@ XTCDECL ULONG_PTR ArReadControlRegister(IN USHORT ControlRegister); +XTCDECL +ULONGLONG +ArReadModelSpecificRegister(IN ULONG Register); + XTCDECL VOID ArWriteControlRegister(IN USHORT ControlRegister, diff --git a/sdk/xtdk/i686/hltypes.h b/sdk/xtdk/i686/hltypes.h index f368b1c..c171d81 100644 --- a/sdk/xtdk/i686/hltypes.h +++ b/sdk/xtdk/i686/hltypes.h @@ -14,6 +14,9 @@ #include +/* APIC base address */ +#define APIC_BASE 0xFFFE0000 + /* Serial port I/O addresses */ #define COMPORT_ADDRESSES {0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8, 0x5F8, 0x4F8, 0x5E8, 0x4E8} diff --git a/xtldr/modules/xtos/includes/xtos.h b/xtldr/modules/xtos/includes/xtos.h index 3fe323e..272b93f 100644 --- a/xtldr/modules/xtos/includes/xtos.h +++ b/xtldr/modules/xtos/includes/xtos.h @@ -29,6 +29,10 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, IN PXT_BOOT_PROTOCOL_PARAMETERS Parameters); +XTCDECL +EFI_STATUS +XtpInitializeApicBase(IN PLIST_ENTRY MemoryMappings); + XTCDECL EFI_STATUS XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, diff --git a/xtldr/modules/xtos/xtos.c b/xtldr/modules/xtos/xtos.c index 1a40f3c..c45b169 100644 --- a/xtldr/modules/xtos/xtos.c +++ b/xtldr/modules/xtos/xtos.c @@ -229,6 +229,21 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, /* Setup and map kernel initialization block */ Status = XtpInitializeLoaderBlock(&MemoryMappings, &VirtualAddress); + if(Status != STATUS_EFI_SUCCESS) + { + /* Failed to setup kernel initialization block */ + XtLdrProtocol->DbgPrint(L"Failed to setup kernel initialization block (Status Code: %lx)\n", Status); + return Status; + } + + /* Find and map APIC base address */ + Status = XtpInitializeApicBase(&MemoryMappings); + if(Status != STATUS_EFI_SUCCESS) + { + /* Failed to setup kernel initialization block */ + XtLdrProtocol->DbgPrint(L"Failed to initialize APIC (Status Code: %lx)\n", Status); + return Status; + } /* Get kernel entry point */ XtPeCoffProtocol->GetEntryPoint(ImageContext, (PVOID)&KernelEntryPoint); @@ -254,6 +269,47 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, return STATUS_EFI_SUCCESS; } +/** + * Checks if APIC is present in the system and finds its base address. + * + * @param MemoryMappings + * Supplies a pointer to linked list containing all memory mappings. + * + * @return This routine returns an EFI status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +XtpInitializeApicBase(IN PLIST_ENTRY MemoryMappings) +{ + PCPUID_REGISTERS CpuRegisters = NULL; + PVOID ApicBaseAddress; + + /* Get CPU features list */ + CpuRegisters->Leaf = CPUID_GET_CPU_FEATURES; + CpuRegisters->SubLeaf = 0; + CpuRegisters->Eax = 0; + CpuRegisters->Ebx = 0; + CpuRegisters->Ecx = 0; + CpuRegisters->Edx = 0; + ArCpuId(CpuRegisters); + + /* Check if APIC is present */ + if((CpuRegisters->Edx & CPUID_FEATURES_EDX_APIC) == 0) + { + /* APIC is not supported by the CPU */ + return STATUS_EFI_UNSUPPORTED; + } + + /* Get APIC base address */ + ApicBaseAddress = (PVOID)((UINT_PTR)ArReadModelSpecificRegister(0x1B) & 0xFFFFF000); + + /* Map APIC base address */ + XtLdrProtocol->AddVirtualMemoryMapping(MemoryMappings, (PVOID)APIC_BASE, ApicBaseAddress, 1, LoaderFirmwarePermanent); + return STATUS_EFI_SUCCESS; +} + /** * Initializes and maps the kernel initialization block. * From 1eecad21db3a9f4ae91c6c32504c1c6e3b74461a Mon Sep 17 00:00:00 2001 From: belliash Date: Mon, 20 Nov 2023 15:26:03 +0100 Subject: [PATCH 02/10] Implement HlReadApicRegister() and HlWriteApicRegister() routines for basic APIC support --- xtoskrnl/CMakeLists.txt | 1 + xtoskrnl/hl/apic.c | 48 +++++++++++++++++++++++++++++++++++++++++ xtoskrnl/includes/hl.h | 9 ++++++++ 3 files changed, 58 insertions(+) create mode 100644 xtoskrnl/hl/apic.c diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index 730f302..8cb0c0e 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -13,6 +13,7 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/ar/${ARCH}/procsup.c ${XTOSKRNL_SOURCE_DIR}/ar/${ARCH}/traps.c ${XTOSKRNL_SOURCE_DIR}/ex/rundown.c + ${XTOSKRNL_SOURCE_DIR}/hl/apic.c ${XTOSKRNL_SOURCE_DIR}/hl/cport.c ${XTOSKRNL_SOURCE_DIR}/hl/efifb.c ${XTOSKRNL_SOURCE_DIR}/hl/globals.c diff --git a/xtoskrnl/hl/apic.c b/xtoskrnl/hl/apic.c new file mode 100644 index 0000000..59a5566 --- /dev/null +++ b/xtoskrnl/hl/apic.c @@ -0,0 +1,48 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/hl/apic.c + * DESCRIPTION: Advanced Programmable Interrupt Controller (APIC) support + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * Reads from the local APIC register. + * + * @param Register + * Supplies the APIC register to read from. + * + * @return This routine returns the value read from the APIC register. + * + * @since XT 1.0 + */ +XTFASTCALL +ULONG +HlReadApicRegister(IN APIC_REGISTER Register) +{ + return RtlReadRegisterLong((PULONG)APIC_BASE + (Register << 4)); +} + +/** + * Writes to the local APIC register. + * + * @param Register + * Supplies the APIC register to write to. + * + * @param Value + * Supplies the value to write to the APIC register. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTFASTCALL +VOID +HlWriteApicRegister(IN APIC_REGISTER Register, + IN ULONG Value) +{ + RtlWriteRegisterLong((PULONG)APIC_BASE + (Register << 4), Value); +} diff --git a/xtoskrnl/includes/hl.h b/xtoskrnl/includes/hl.h index 918e9e5..4d976fc 100644 --- a/xtoskrnl/includes/hl.h +++ b/xtoskrnl/includes/hl.h @@ -51,4 +51,13 @@ XTAPI XTSTATUS HlInitializeDisplay(VOID); +XTFASTCALL +ULONG +HlReadApicRegister(IN APIC_REGISTER Register); + +XTFASTCALL +VOID +HlWriteApicRegister(IN APIC_REGISTER Register, + IN ULONG Value); + #endif /* __XTOSKRNL_HL_H */ From d2fb0a683047a7bb70b756aa28a673286999e315 Mon Sep 17 00:00:00 2001 From: belliash Date: Mon, 20 Nov 2023 16:44:21 +0100 Subject: [PATCH 03/10] Update ideas file --- IDEAS.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/IDEAS.md b/IDEAS.md index f982f9c..dc6eb78 100644 --- a/IDEAS.md +++ b/IDEAS.md @@ -5,7 +5,8 @@ This is a list of ideas that migh but not must be realized. - [ ] Currently XT Development Kit (XTDK) is a garbage. It should be cleaned up the way, it contains all structures and definitions, as well as all routines that are exported and can be used by other components or software dynamically linked. All other routines should be available as well in some form, as some libraries can share - code with others (eg. XTLDR calls routines exported by XTOSKRNL). + code with others (eg. XTLDR calls routines exported by XTOSKRNL). This is partially done, as XTDK has been + cleaned up, but still there are routines used by XTLDR. ### XTLDR - [ ] Rewrite memory mapping and paging support in bootloader to make it more flexible and architecture independent. @@ -17,3 +18,5 @@ This is a list of ideas that migh but not must be realized. ### XTOSKRNL - [ ] Implement mechanism for detecting CPU features and checking hardware requirements. If CPU does not meet requirements, it should cause a kernel panic before any non-supported instruction is being used. + - [ ] Design a mechanism of sharing common code between some architectures (i.e. both i686 and amd64 supports APIC, + while it is not available on ARM). From c4143c63f9aafbf8de4d764cafaf3400a2a21990 Mon Sep 17 00:00:00 2001 From: belliash Date: Mon, 20 Nov 2023 23:30:44 +0100 Subject: [PATCH 04/10] Enable LLVM MASM Assembly --- sdk/cmake/toolchain.cmake | 3 ++- sdk/cmake/xtchain.cmake | 13 ++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/sdk/cmake/toolchain.cmake b/sdk/cmake/toolchain.cmake index 4dd239c..ea5a3ce 100644 --- a/sdk/cmake/toolchain.cmake +++ b/sdk/cmake/toolchain.cmake @@ -2,7 +2,7 @@ set(CMAKE_SYSTEM_NAME Windows) # Set toolchain compilers -set(CMAKE_ASM_COMPILER nasm) +set(CMAKE_ASM_COMPILER llvm-ml) set(CMAKE_C_COMPILER clang-cl) set(CMAKE_CXX_COMPILER clang-cl) set(CMAKE_MC_COMPILER wmc) @@ -10,6 +10,7 @@ set(CMAKE_RC_COMPILER wrc) set(CMAKE_SPEC_COMPILER xtcspecc) # Assume that C/C++ compiler is working +set(CMAKE_ASM_COMPILER_WORKS 1) set(CMAKE_C_COMPILER_WORKS 1) set(CMAKE_CXX_COMPILER_WORKS 1) diff --git a/sdk/cmake/xtchain.cmake b/sdk/cmake/xtchain.cmake index 85efc90..5a5526a 100644 --- a/sdk/cmake/xtchain.cmake +++ b/sdk/cmake/xtchain.cmake @@ -11,7 +11,7 @@ endif() # Set build optimisation if(BUILD_TYPE STREQUAL "DEBUG") - add_compiler_flags("/Zi") + add_compiler_ccxxflags("/Zi") add_compiler_ccxxflags("-Ob0 -Od") add_linker_flags("/DEBUG /INCREMENTAL /OPT:NOREF /OPT:NOICF /PDBSOURCEPATH:build") else() @@ -38,10 +38,10 @@ add_compiler_ccxxflags("-Gy") add_compiler_ccxxflags("-EHa") # Control warnings levels -add_compiler_flags("-W3 -w14115") -add_compiler_flags("-wd4200 -wd4214 -wd4244 -wd4290 -wd4800") -add_compiler_flags("-we4013 -we4020 -we4022 -we4028 -we4047 -we4098 -we4101 -we4113 -we4129 -we4133") -add_compiler_flags("-we4163 -we4189 -we4229 -we4311 -we4312 -we4313 -we4477 -we4603 -we4700 -we4715 -we4716") +add_compiler_ccxxflags("-W3 -w14115") +add_compiler_ccxxflags("-wd4200 -wd4214 -wd4244 -wd4290 -wd4800") +add_compiler_ccxxflags("-we4013 -we4020 -we4022 -we4028 -we4047 -we4098 -we4101 -we4113 -we4129 -we4133") +add_compiler_ccxxflags("-we4163 -we4189 -we4229 -we4311 -we4312 -we4313 -we4477 -we4603 -we4700 -we4715 -we4716") # Disable warnings about specific features add_compiler_ccxxflags("-nostdinc -Wno-char-subscripts -Wno-incompatible-library-redeclaration -Wno-microsoft-anon-tag") @@ -54,6 +54,9 @@ set(CMAKE_PDB_OUTPUT_DIRECTORY "${EXECTOS_BINARY_DIR}/output/symbols") # Set linker flags add_linker_flags("${HOTPATCH_LINKER_FLAG} /LARGEADDRESSAWARE /IGNORE:4039 /IGNORE:4104 /MANIFEST:NO /NODEFAULTLIB /SAFESEH:NO") +# Set LLVM MASM assembler options +set(CMAKE_ASM_COMPILE_OBJECT " ${CMAKE_ASM_FLAGS} -D__ASM__ /nologo /Fo /c /Ta ") + # Set runtime library set(CMAKE_MSVC_RUNTIME_LIBRARY "") From c66ea77a8b43f06289203518b51a1251d9a98919 Mon Sep 17 00:00:00 2001 From: belliash Date: Mon, 20 Nov 2023 23:52:49 +0100 Subject: [PATCH 05/10] Enable ASM, C and CXX compilers --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f24d3c..bc2200c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,9 @@ include(sdk/cmake/qemu.cmake) include(sdk/cmake/version.cmake) include(sdk/cmake/xtchain.cmake) +# Enable compilers +enable_language(ASM C CXX) + # Add project specific definitions add_definitions(-D__XTOS__) add_definitions(-DXTOS_SOURCE_DIR="${EXECTOS_SOURCE_DIR}") From d8403d01f539d2776a4907f37b1436d884af8608 Mon Sep 17 00:00:00 2001 From: belliash Date: Wed, 22 Nov 2023 17:22:57 +0100 Subject: [PATCH 06/10] Verify kernel and boot loader compatibility --- sdk/xtdk/xtfw.h | 8 ++++-- xtldr/modules/xtos/xtos.c | 5 ++-- xtoskrnl/ke/amd64/krnlinit.c | 3 --- xtoskrnl/ke/i686/krnlinit.c | 3 --- xtoskrnl/ke/krnlinit.c | 47 +++++++++++++++++++++--------------- 5 files changed, 36 insertions(+), 30 deletions(-) diff --git a/sdk/xtdk/xtfw.h b/sdk/xtdk/xtfw.h index e06de36..e7b4578 100644 --- a/sdk/xtdk/xtfw.h +++ b/sdk/xtdk/xtfw.h @@ -16,6 +16,9 @@ /* Version number of the current kernel initialization block */ #define INITIALIZATION_BLOCK_VERSION 1 +/* Version number of the current XTOS loader protocol */ +#define BOOT_PROTOCOL_VERSION 1 + /* Memory allocation structures */ typedef enum _LOADER_MEMORY_TYPE { @@ -115,11 +118,12 @@ typedef struct _LOADER_MEMORY_MAPPING /* Loader provided information needed by the kernel to initialize */ typedef struct _KERNEL_INITIALIZATION_BLOCK { + ULONG BlockSize; + ULONG BlockVersion; + ULONG ProtocolVersion; LIST_ENTRY LoadOrderListHead; LIST_ENTRY MemoryDescriptorListHead; LIST_ENTRY BootDriverListHead; - ULONG Size; - ULONG Version; LOADER_INFORMATION_BLOCK LoaderInformation; FIRMWARE_INFORMATION_BLOCK FirmwareInformation; } KERNEL_INITIALIZATION_BLOCK, *PKERNEL_INITIALIZATION_BLOCK; diff --git a/xtldr/modules/xtos/xtos.c b/xtldr/modules/xtos/xtos.c index c45b169..07b963f 100644 --- a/xtldr/modules/xtos/xtos.c +++ b/xtldr/modules/xtos/xtos.c @@ -352,8 +352,9 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, RtlZeroMemory(LoaderBlock, sizeof(KERNEL_INITIALIZATION_BLOCK)); /* Set basic loader block properties */ - LoaderBlock->Size = sizeof(KERNEL_INITIALIZATION_BLOCK); - LoaderBlock->Version = INITIALIZATION_BLOCK_VERSION; + LoaderBlock->BlockSize = sizeof(KERNEL_INITIALIZATION_BLOCK); + LoaderBlock->BlockVersion = INITIALIZATION_BLOCK_VERSION; + LoaderBlock->ProtocolVersion = BOOT_PROTOCOL_VERSION; /* Set LoaderInformation block properties */ LoaderBlock->LoaderInformation.DbgPrint = XtLdrProtocol->DbgPrint; diff --git a/xtoskrnl/ke/amd64/krnlinit.c b/xtoskrnl/ke/amd64/krnlinit.c index 1232255..429fe26 100644 --- a/xtoskrnl/ke/amd64/krnlinit.c +++ b/xtoskrnl/ke/amd64/krnlinit.c @@ -82,9 +82,6 @@ XTAPI VOID KepStartKernel(VOID) { - /* Print debug message */ - DebugPrint(L"Starting ExectOS ...\n"); - /* Initialize XTOS kernel */ KepInitializeKernel(); diff --git a/xtoskrnl/ke/i686/krnlinit.c b/xtoskrnl/ke/i686/krnlinit.c index 0356add..604079c 100644 --- a/xtoskrnl/ke/i686/krnlinit.c +++ b/xtoskrnl/ke/i686/krnlinit.c @@ -82,9 +82,6 @@ XTAPI VOID KepStartKernel(VOID) { - /* Print debug message */ - DebugPrint(L"Starting ExectOS ...\n"); - /* Initialize XTOS kernel */ KepInitializeKernel(); diff --git a/xtoskrnl/ke/krnlinit.c b/xtoskrnl/ke/krnlinit.c index 958f465..bb29c22 100644 --- a/xtoskrnl/ke/krnlinit.c +++ b/xtoskrnl/ke/krnlinit.c @@ -23,29 +23,36 @@ XTAPI VOID KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters) { - /* Check if debugging enabled and if boot loader provided routine for debug printing */ - if(DEBUG && Parameters->LoaderInformation.DbgPrint) - { - /* Use loader's provided DbgPrint() routine for early printing to serial console */ - KeDbgPrint = Parameters->LoaderInformation.DbgPrint; - } - - - /* Print some message to serial console and test kernel parameters */ - DebugPrint(L"Hello world from ExectOS kernel!\n"); - DebugPrint(L"\n\n------ Kernel parameters block ------\n" - L"Loader block size: %lu\n" - L"Loader block version: %lu\n" - L"EFI Revision: %lu\n", - Parameters->Size, - Parameters->Version, - Parameters->FirmwareInformation.EfiFirmware.EfiVersion - ); - - /* Save the kernel initialization block */ KeInitializationBlock = Parameters; + /* Verify kernel and boot loader compatibility */ + if(KeInitializationBlock->BlockSize != sizeof(KERNEL_INITIALIZATION_BLOCK) || + KeInitializationBlock->BlockVersion != INITIALIZATION_BLOCK_VERSION || + KeInitializationBlock->ProtocolVersion != BOOT_PROTOCOL_VERSION) + { + /* Kernel and boot loader version mismatch */ + for(;;) + { + /* Halt system */ + ArClearInterruptFlag(); + ArHalt(); + } + } + + /* Check if debugging enabled and if boot loader provided routine for debug printing */ + if(DEBUG && KeInitializationBlock->LoaderInformation.DbgPrint) + { + /* Use loader's provided DbgPrint() routine for early printing to serial console */ + KeDbgPrint = KeInitializationBlock->LoaderInformation.DbgPrint; + } + + /* Announce kernel startup */ + DebugPrint(L"Starting ExectOS v%d.%d (%s-%s-%s-%s / %s %s)\n", + XTOS_VERSION_MAJOR, XTOS_VERSION_MINOR, XTOS_VERSION_DATE, + XTOS_VERSION_BUILD, XTOS_VERSION_ARCH, XTOS_VERSION_HASH, + XTOS_COMPILER_NAME, XTOS_COMPILER_VERSION); + /* Initialize boot CPU */ ArInitializeProcessor(); From d7e6d319cf618a516cf3a40bec54a8528e4bc17d Mon Sep 17 00:00:00 2001 From: belliash Date: Wed, 22 Nov 2023 19:22:51 +0100 Subject: [PATCH 07/10] Update XTOS ideas --- IDEAS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/IDEAS.md b/IDEAS.md index dc6eb78..1ef39ee 100644 --- a/IDEAS.md +++ b/IDEAS.md @@ -20,3 +20,6 @@ This is a list of ideas that migh but not must be realized. requirements, it should cause a kernel panic before any non-supported instruction is being used. - [ ] Design a mechanism of sharing common code between some architectures (i.e. both i686 and amd64 supports APIC, while it is not available on ARM). + - [ ] Finish framebuffer and terminal implementation. Initialization code is already prepared as well as routines for + clearing the screen and drawing single points. Terminal should be instantiable (should be able to create many + terminals and switch between them) and work on top of FB. It should define ANSI colors and scrollback buffer. From f28c870192c6f9f07051f2defd4fe5db5cfec0d3 Mon Sep 17 00:00:00 2001 From: belliash Date: Wed, 22 Nov 2023 19:24:14 +0100 Subject: [PATCH 08/10] Implement KeHaltSystem() routine --- xtoskrnl/includes/ke.h | 4 ++++ xtoskrnl/ke/krnlinit.c | 7 +------ xtoskrnl/ke/panic.c | 21 +++++++++++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/xtoskrnl/includes/ke.h b/xtoskrnl/includes/ke.h index 76a8484..1bbdbeb 100644 --- a/xtoskrnl/includes/ke.h +++ b/xtoskrnl/includes/ke.h @@ -17,6 +17,10 @@ XTAPI VOID KeClearEvent(IN PKEVENT Event); +XTAPI +VOID +KeHaltSystem(); + XTAPI VOID KeInitializeEvent(OUT PKEVENT Event, diff --git a/xtoskrnl/ke/krnlinit.c b/xtoskrnl/ke/krnlinit.c index bb29c22..75bf633 100644 --- a/xtoskrnl/ke/krnlinit.c +++ b/xtoskrnl/ke/krnlinit.c @@ -32,12 +32,7 @@ KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters) KeInitializationBlock->ProtocolVersion != BOOT_PROTOCOL_VERSION) { /* Kernel and boot loader version mismatch */ - for(;;) - { - /* Halt system */ - ArClearInterruptFlag(); - ArHalt(); - } + KeHaltSystem(); } /* Check if debugging enabled and if boot loader provided routine for debug printing */ diff --git a/xtoskrnl/ke/panic.c b/xtoskrnl/ke/panic.c index cca6f62..d9cbd0b 100644 --- a/xtoskrnl/ke/panic.c +++ b/xtoskrnl/ke/panic.c @@ -9,6 +9,27 @@ #include +/** + * Halts the system. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +KeHaltSystem() +{ + /* Enter infinite loop */ + for(;;) + { + /* Halt system */ + ArClearInterruptFlag(); + ArHalt(); + } + +} + /** * Crashes the system upon detecting a fatal error in which either it is unable to recover or continue to run system. * From 1cb21a81ddcfba0c54bb07aaa2397d504b6fa10e Mon Sep 17 00:00:00 2001 From: belliash Date: Wed, 22 Nov 2023 20:36:05 +0100 Subject: [PATCH 09/10] Rename HlInitializeDisplay() to HlInitializeFrameBuffer() --- xtoskrnl/hl/efifb.c | 2 +- xtoskrnl/includes/hl.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xtoskrnl/hl/efifb.c b/xtoskrnl/hl/efifb.c index 6ab4dda..98c162e 100644 --- a/xtoskrnl/hl/efifb.c +++ b/xtoskrnl/hl/efifb.c @@ -86,7 +86,7 @@ HlDrawPixel(IN ULONG PositionX, */ XTAPI XTSTATUS -HlInitializeDisplay(VOID) +HlInitializeFrameBuffer(VOID) { /* Check if display already initialized */ if(HlpFrameBufferData.Initialized) diff --git a/xtoskrnl/includes/hl.h b/xtoskrnl/includes/hl.h index 4d976fc..2eda761 100644 --- a/xtoskrnl/includes/hl.h +++ b/xtoskrnl/includes/hl.h @@ -49,7 +49,7 @@ HlInitializeComPort(IN OUT PCPPORT Port, XTAPI XTSTATUS -HlInitializeDisplay(VOID); +HlInitializeFrameBuffer(VOID); XTFASTCALL ULONG From c526e63b7a2355d7c6840ef1378ce8ed01df9a9d Mon Sep 17 00:00:00 2001 From: belliash Date: Thu, 23 Nov 2023 15:38:32 +0100 Subject: [PATCH 10/10] Add EFI Framework MP services protocol related structures --- sdk/xtdk/xtstruct.h | 5 +++ sdk/xtdk/xtuefi.h | 76 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/sdk/xtdk/xtstruct.h b/sdk/xtdk/xtstruct.h index 72a01c4..e60aa84 100644 --- a/sdk/xtdk/xtstruct.h +++ b/sdk/xtdk/xtstruct.h @@ -17,6 +17,7 @@ typedef enum _ADJUST_REASON ADJUST_REASON, *PADJUST_REASON; typedef enum _BOOLEAN BOOLEAN, *PBOOLEAN; typedef enum _EXCEPTION_DISPOSITION EXCEPTION_DISPOSITION, *PEXCEPTION_DISPOSITION; typedef enum _EFI_ALLOCATE_TYPE EFI_ALLOCATE_TYPE, *PEFI_ALLOCATE_TYPE; +typedef enum _EFI_FRAMEWORK_CPU_DESIGNATION EFI_FRAMEWORK_CPU_DESIGNATION, *PEFI_FRAMEWORK_CPU_DESIGNATION; typedef enum _EFI_GRAPHICS_OUTPUT_BLT_OPERATION EFI_GRAPHICS_OUTPUT_BLT_OPERATION, *PEFI_GRAPHICS_OUTPUT_BLT_OPERATION; typedef enum _EFI_GRAPHICS_PIXEL_FORMAT EFI_GRAPHICS_PIXEL_FORMAT, *PEFI_GRAPHICS_PIXEL_FORMAT; typedef enum _EFI_GRAPHICS_PROTOCOL EFI_GRAPHICS_PROTOCOL, *PEFI_GRAPHICS_PROTOCOL; @@ -101,6 +102,9 @@ typedef struct _EFI_FILE_IO_TOKEN EFI_FILE_IO_TOKEN, *PEFI_FILE_IO_TOKEN; typedef struct _EFI_FILE_SYSTEM_INFO EFI_FILE_SYSTEM_INFO, *PEFI_FILE_SYSTEM_INFO; typedef struct _EFI_FILE_SYSTEM_VOLUME_LABEL EFI_FILE_SYSTEM_VOLUME_LABEL, *PEFI_FILE_SYSTEM_VOLUME_LABEL; typedef struct _EFI_FILEPATH_DEVICE_PATH EFI_FILEPATH_DEVICE_PATH, *PEFI_FILEPATH_DEVICE_PATH; +typedef struct _EFI_FRAMEWORK_MP_HEALTH EFI_FRAMEWORK_MP_HEALTH, *PEFI_FRAMEWORK_MP_HEALTH; +typedef struct _EFI_FRAMEWORK_MP_PROCESSOR_CONTEXT EFI_FRAMEWORK_MP_PROCESSOR_CONTEXT, *PEFI_FRAMEWORK_MP_PROCESSOR_CONTEXT; +typedef struct _EFI_FRAMEWORK_MP_SERVICES_PROTOCOL EFI_FRAMEWORK_MP_SERVICES_PROTOCOL, *PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL; typedef struct _EFI_GPT_PARTITION_TABLE_HEADER EFI_GPT_PARTITION_TABLE_HEADER, *PEFI_GPT_PARTITION_TABLE_HEADER; typedef struct _EFI_GPT_PARTITION_ENTRY EFI_GPT_PARTITION_ENTRY, *PEFI_GPT_PARTITION_ENTRY; typedef struct _EFI_GRAPHICS_OUTPUT_BLT_PIXEL EFI_GRAPHICS_OUTPUT_BLT_PIXEL, *PEFI_GRAPHICS_OUTPUT_BLT_PIXEL; @@ -264,6 +268,7 @@ typedef struct _UNICODE_STRING64 UNICODE_STRING64, *PUNICODE_STRING64; /* Unions forward references */ typedef union _EFI_DEV_PATH EFI_DEV_PATH, *PEFI_DEV_PATH; typedef union _EFI_DEV_PATH_PTR EFI_DEV_PATH_PTR, *PEFI_DEV_PATH_PTR; +typedef union _EFI_FRAMEWORK_MP_HEALTH_FLAGS EFI_FRAMEWORK_MP_HEALTH_FLAGS, *PEFI_FRAMEWORK_MP_HEALTH_FLAGS; typedef union _EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION, *PEFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION; typedef union _EFI_HASH_OUTPUT EFI_HASH_OUTPUT, *PEFI_HASH_OUTPUT; typedef union _EFI_IP_ADDRESS EFI_IP_ADDRESS, *PEFI_IP_ADDRESS; diff --git a/sdk/xtdk/xtuefi.h b/sdk/xtdk/xtuefi.h index 530257e..8bd8c17 100644 --- a/sdk/xtdk/xtuefi.h +++ b/sdk/xtdk/xtuefi.h @@ -79,14 +79,14 @@ #define EFI_MAXIMUM_VARIABLE_SIZE 1024 /* EFI event types */ -#define EFI_EVENT_TIMER 0x80000000 -#define EFI_EVENT_RUNTIME 0x40000000 -#define EFI_EVENT_RUNTIME_CONTEXT 0x20000000 +#define EFI_EVENT_EFI_SIGNAL_MASK 0x000000FF #define EFI_EVENT_NOTIFY_WAIT 0x00000100 #define EFI_EVENT_NOTIFY_SIGNAL 0x00000200 #define EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201 +#define EFI_EVENT_RUNTIME_CONTEXT 0x20000000 +#define EFI_EVENT_RUNTIME 0x40000000 #define EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202 -#define EFI_EVENT_EFI_SIGNAL_MASK 0x000000FF +#define EFI_EVENT_TIMER 0x80000000 /* EFI disk signature type */ #define EFI_DISK_SIGNATURE_TYPE_MBR 0x01 @@ -250,6 +250,7 @@ #define EFI_EDID_OVERRIDE_PROTOCOL_GUID {0x48ECB431, 0xFB72, 0x45C0, {0xA9, 0x22, 0xF4, 0x58, 0xFE, 0x04, 0x0B, 0xD5}} #define EFI_FILE_INFO_PROTOCOL_GUID {0x09576E92, 0x6D3F, 0x11D2, {0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B}} #define EFI_FPSWA_PROTOCOL_GUID {0xC41B6531, 0x97B9, 0x11D3, {0x9A, 0x29, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D}} +#define EFI_FRAMEWORK_MP_SERVICES_PROTOCOL_GUID {0xF33261E7, 0x23CB, 0x11D5, {0xBD, 0x5C, 0x00, 0x80, 0xC7, 0x3C, 0x88, 0x81}} #define EFI_GLOBAL_VARIABLE_GUID {0x8BE4DF61, 0x93CA, 0x11D2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C}} #define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID {0x9042A9DE, 0x23DC, 0x4A38, {0x96, 0xFB, 0x7A, 0xDE, 0xD0, 0x80, 0x51, 0x6A}} #define EFI_HASH_PROTOCOL_GUID {0xC5184932, 0xDBA5, 0x46DB, {0xA5, 0xBA, 0xCC, 0x0B, 0xDA, 0x9C, 0x14, 0x35}} @@ -481,6 +482,14 @@ typedef enum _EFI_UART_STOP_BITS_TYPE TwoStopBits } EFI_UART_STOP_BITS_TYPE, *PEFI_UART_STOP_BITS_TYPE; +/* Enumeration of CPU designations */ +typedef enum _EFI_FRAMEWORK_CPU_DESIGNATION +{ + EfiCpuAP, + EfiCpuBSP, + EfiCpuDesignationMaximum +} EFI_FRAMEWORK_CPU_DESIGNATION, *PEFI_FRAMEWORK_CPU_DESIGNATION; + /* Enumeration of network state */ typedef enum _EFI_SIMPLE_NETWORK_STATE { @@ -745,6 +754,14 @@ typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_SET_STATION_IP)(IN PEFI_PXE_BASE_CODE_PR typedef EFI_STATUS (*PEFI_PXE_BASE_CODE_SET_PACKETS)(IN PEFI_PXE_BASE_CODE_PROTOCOL This, PUCHAR NewDhcpDiscoverValid, PUCHAR NewDhcpAckReceived, PUCHAR NewProxyOfferReceived, PUCHAR NewPxeDiscoverValid, PUCHAR NewPxeReplyReceived, PUCHAR NewPxeBisReplyReceived, IN PEFI_PXE_BASE_CODE_PACKET NewDhcpDiscover, IN PEFI_PXE_BASE_CODE_PACKET NewDhcpAck, IN PEFI_PXE_BASE_CODE_PACKET NewProxyOffer, IN PEFI_PXE_BASE_CODE_PACKET NewPxeDiscover, IN PEFI_PXE_BASE_CODE_PACKET NewPxeReply, IN PEFI_PXE_BASE_CODE_PACKET NewPxeBisReply); typedef EFI_PXE_BASE_CODE_CALLBACK_STATUS (*PEFI_PXE_CALLBACK)(IN PEFI_PXE_BASE_CODE_CALLBACK_PROTOCOL This, IN EFI_PXE_BASE_CODE_FUNCTION Function, IN UCHAR Received, IN UINT32 PacketLen, IN PEFI_PXE_BASE_CODE_PACKET Packet); typedef VOID (*PEFI_AP_PROCEDURE)(IN OUT PVOID Buffer); +typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_GET_GENERAL_MP_INFO)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, OUT PUINT_PTR NumberOfCPUs, OUT PUINT_PTR MaximumNumberOfCPUs, OUT PUINT_PTR NumberOfEnabledCPUs, OUT PUINT_PTR RendezvousIntNumber, OUT PUINT_PTR RendezvousProcLength); +typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_GET_PROCESSOR_CONTEXT)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN OUT PUINT_PTR BufferLength, IN OUT PEFI_FRAMEWORK_MP_PROCESSOR_CONTEXT ProcessorContextBuffer); +typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_STARTUP_ALL_APS)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN PEFI_AP_PROCEDURE Procedure, IN BOOLEAN SingleThread, IN EFI_EVENT WaitEvent, IN UINT_PTR TimeoutInMicroSecs, IN OUT PVOID ProcArguments, OUT PUINT_PTR FailedCPUList); +typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_STARTUP_THIS_AP)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN PEFI_AP_PROCEDURE Procedure, IN UINT_PTR ProcessorNumber, IN EFI_EVENT WaitEvent, IN UINT_PTR TimeoutInMicroSecs, IN OUT PVOID ProcArguments); +typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_SWITCH_BSP)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN BOOLEAN EnableOldBSP); +typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_SEND_IPI)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN UINT_PTR VectorNumber, IN UINT_PTR DeliveryMode); +typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_ENABLEDISABLEAP)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN BOOLEAN NewAPState, IN PEFI_FRAMEWORK_MP_HEALTH HealthState); +typedef EFI_STATUS (*PEFI_FRAMEWORK_MP_SERVICES_WHOAMI)(IN PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL This, OUT PUINT_PTR ProcessorNumber); typedef EFI_STATUS (*PEFI_MP_SERVICES_ENABLEDISABLEAP)(IN PEFI_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, IN BOOLEAN EnableAP, IN PUINT32 HealthFlag); typedef EFI_STATUS (*PEFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS)(IN PEFI_MP_SERVICES_PROTOCOL This, OUT PUINT_PTR NumberOfProcessors, OUT PUINT_PTR NumberOfEnabledProcessors); typedef EFI_STATUS (*PEFI_MP_SERVICES_GET_PROCESSOR_INFO)(IN PEFI_MP_SERVICES_PROTOCOL This, IN UINT_PTR ProcessorNumber, OUT PEFI_PROCESSOR_INFORMATION ProcessorInfoBuffer); @@ -2308,6 +2325,57 @@ typedef struct _EFI_SIMPLE_NETWORK_PROTOCOL PEFI_SIMPLE_NETWORK_MODE Mode; } EFI_SIMPLE_NETWORK_PROTOCOL, *PEFI_SIMPLE_NETWORK_PROTOCOL; +/* EFI Framework MP (Multiprocessor) services protocol */ +typedef struct _EFI_FRAMEWORK_MP_SERVICES_PROTOCOL +{ + PEFI_FRAMEWORK_MP_SERVICES_GET_GENERAL_MP_INFO GetGeneralMPInfo; + PEFI_FRAMEWORK_MP_SERVICES_GET_PROCESSOR_CONTEXT GetProcessorContext; + PEFI_FRAMEWORK_MP_SERVICES_STARTUP_ALL_APS StartupAllAPs; + PEFI_FRAMEWORK_MP_SERVICES_STARTUP_THIS_AP StartupThisAP; + PEFI_FRAMEWORK_MP_SERVICES_SWITCH_BSP SwitchBSP; + PEFI_FRAMEWORK_MP_SERVICES_SEND_IPI SendIPI; + PEFI_FRAMEWORK_MP_SERVICES_ENABLEDISABLEAP EnableDisableAP; + PEFI_FRAMEWORK_MP_SERVICES_WHOAMI WhoAmI; +} EFI_FRAMEWORK_MP_SERVICES_PROTOCOL, *PEFI_FRAMEWORK_MP_SERVICES_PROTOCOL; + +/* EFI Framework MP (Multiprocessor) health flags union */ +typedef union _EFI_FRAMEWORK_MP_HEALTH_FLAGS +{ + struct + { + UINT Status:2; + UINT Tested:1; + UINT Reserved1:13; + UINT VirtualMemoryUnavailable:1; + UINT Ia32ExecutionUnavailable:1; + UINT FloatingPointUnavailable:1; + UINT MiscFeaturesUnavailable:1; + UINT Reserved2:12; + } Bits; + UINT Uint32; +} EFI_FRAMEWORK_MP_HEALTH_FLAGS, *PEFI_FRAMEWORK_MP_HEALTH_FLAGS; + +/* EFI Framework MP (Multiprocessor) health structure */ +typedef struct _EFI_FRAMEWORK_MP_HEALTH +{ + EFI_FRAMEWORK_MP_HEALTH_FLAGS Flags; + UINT TestStatus; +} EFI_FRAMEWORK_MP_HEALTH, *PEFI_FRAMEWORK_MP_HEALTH; + +/* EFI Framework processor context structure */ +typedef struct _EFI_FRAMEWORK_MP_PROCESSOR_CONTEXT +{ + UINT ApicID; + BOOLEAN Enabled; + EFI_FRAMEWORK_CPU_DESIGNATION Designation; + EFI_FRAMEWORK_MP_HEALTH Health; + UINT_PTR PackageNumber; + UINT_PTR NumberOfCores; + UINT_PTR NumberOfThreads; + ULONGLONG ProcessorPALCompatibilityFlags; + ULONGLONG ProcessorTestMask; +} EFI_FRAMEWORK_MP_PROCESSOR_CONTEXT, *PEFI_FRAMEWORK_MP_PROCESSOR_CONTEXT; + /* EFI MP (Multiprocessor) services protocol */ typedef struct _EFI_MP_SERVICES_PROTOCOL {