diff options
| author | Amlal <amlal@nekernel.org> | 2025-04-30 12:34:54 +0200 |
|---|---|---|
| committer | Amlal <amlal@nekernel.org> | 2025-04-30 12:34:54 +0200 |
| commit | fcea594f2df75dcd0f3d4bfeac988b748be89c13 (patch) | |
| tree | 0204f5575637644879c89a1a3c00b5848043e89b | |
| parent | 911bf2d68a4904d8ff838d31e00ef65d4e03063c (diff) | |
kernel: keep track of cr3 in AMD HAL/HEL.
why?
To keep track of it, avoid security issues in the future.
Signed-off-by: Amlal <amlal@nekernel.org>
| -rw-r--r-- | dev/boot/modules/SysChk/SysChk.cc | 2 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootAPI.S | 2 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootEFI.cc | 12 | ||||
| -rw-r--r-- | dev/ddk/DDKKit/net.h | 16 | ||||
| -rw-r--r-- | dev/kernel/FirmwareKit/Handover.h | 4 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalKernelMain.cc | 7 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/Paging.h | 2 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/Processor.h | 2 | ||||
| -rw-r--r-- | dev/kernel/src/FS/HeFS.cc | 1 | ||||
| -rw-r--r-- | dev/kernel/src/UserProcessScheduler.cc | 6 |
10 files changed, 37 insertions, 17 deletions
diff --git a/dev/boot/modules/SysChk/SysChk.cc b/dev/boot/modules/SysChk/SysChk.cc index 1c5255fb..c93ef83b 100644 --- a/dev/boot/modules/SysChk/SysChk.cc +++ b/dev/boot/modules/SysChk/SysChk.cc @@ -24,7 +24,7 @@ // Makes the compiler shut up. #ifndef kMachineModel #define kMachineModel "OS" -#endif // !kMachineModel +#endif // !kMachineModel EXTERN_C Int32 SysChkModuleMain(Kernel::HEL::BootInfoHeader* handover) { fw_init_efi((EfiSystemTable*) handover->f_FirmwareCustomTables[1]); diff --git a/dev/boot/src/HEL/AMD64/BootAPI.S b/dev/boot/src/HEL/AMD64/BootAPI.S index 9cc15918..43775fc2 100644 --- a/dev/boot/src/HEL/AMD64/BootAPI.S +++ b/dev/boot/src/HEL/AMD64/BootAPI.S @@ -52,7 +52,7 @@ reset_wait: .global boot_read_cr3 boot_read_cr3: - mov rax, rax + mov rax, cr3 ret boot_write_cr3: diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc index 739876da..ffc3c692 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -32,6 +32,8 @@ STATIC EfiGUID kGopGuid; EXTERN_C Void rt_reset_hardware(); +EXTERN_C Kernel::VoidPtr boot_read_cr3(); // @brief Page directory inside cr3 register. + /** @brief Finds and stores the GOP object. */ @@ -173,7 +175,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa if (reader_syschk.Blob()) { syschk_thread = new Boot::BootThread(reader_syschk.Blob()); - syschk_thread->SetName("BootZ/SysChk"); + syschk_thread->SetName("SysChk"); syschk_thread->Start(handover_hdr, NO); } @@ -236,13 +238,11 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa // ------------------------------------------ // if (reader_kernel.Blob()) { - // ------------------------------------------ // - // null these fields, to avoid being reused later. - // ------------------------------------------ // + handover_hdr->f_PageStart = boot_read_cr3(); auto kernel_thread = Boot::BootThread(reader_kernel.Blob()); - kernel_thread.SetName("BootZ/NeKernel"); + kernel_thread.SetName("NeKernel"); handover_hdr->f_KernelImage = reader_kernel.Blob(); handover_hdr->f_KernelSz = reader_kernel.Size(); @@ -256,7 +256,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa if (!reader_netboot.Blob()) return kEfiFail; auto netboot_thread = Boot::BootThread(reader_netboot.Blob()); - netboot_thread.SetName("BootZ/BootNet"); + netboot_thread.SetName("BootNet"); return netboot_thread.Start(handover_hdr, NO); } diff --git a/dev/ddk/DDKKit/net.h b/dev/ddk/DDKKit/net.h new file mode 100644 index 00000000..ea85dee7 --- /dev/null +++ b/dev/ddk/DDKKit/net.h @@ -0,0 +1,16 @@ +/* ------------------------------------------- + + Copyright Amlal El Mahrouss. + + FILE: net.h + PURPOSE: Network model base header. + +------------------------------------------- */ + +#pragma once + +#include <DDKKit/macros.h> + +struct DDK_NET_MANIFEST; + +/// @brief IFS hooks to plug into the FileMgr. diff --git a/dev/kernel/FirmwareKit/Handover.h b/dev/kernel/FirmwareKit/Handover.h index fbf4bb28..d3ccc724 100644 --- a/dev/kernel/FirmwareKit/Handover.h +++ b/dev/kernel/FirmwareKit/Handover.h @@ -20,8 +20,8 @@ #include <FirmwareKit/EFI/EFI.h> #include <NewKit/Defines.h> -#define kHandoverMagic 0xBADCC -#define kHandoverVersion 0x0117 +#define kHandoverMagic (0xBADCC) +#define kHandoverVersion (0x0117) /* Initial bitmap pointer location and size. */ #define kHandoverBitMapSz (gib_cast(4)) diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index fba02bc1..29244add 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -27,7 +27,8 @@ STATIC Kernel::Void hal_pre_init_scheduler() noexcept { } } -/// @brief Kernel init procedure. +/// @brief Kernel init function. +/// @param handover_hdr Handover boot header. EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { if (handover_hdr->f_Magic != kHandoverMagic && handover_hdr->f_Version != kHandoverVersion) { return kEfiFail; @@ -42,6 +43,10 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { Boot::ExitBootServices(handover_hdr->f_HardwareTables.f_ImageKey, handover_hdr->f_HardwareTables.f_ImageHandle); + kKernelCR3 = kHandoverHeader->f_PageStart; + + hal_write_cr3(kKernelCR3); + /************************************** */ /* INITIALIZE BIT MAP. */ /************************************** */ diff --git a/dev/kernel/HALKit/AMD64/Paging.h b/dev/kernel/HALKit/AMD64/Paging.h index 074c1113..3c7107bc 100644 --- a/dev/kernel/HALKit/AMD64/Paging.h +++ b/dev/kernel/HALKit/AMD64/Paging.h @@ -37,7 +37,7 @@ EXTERN_C void hal_write_cr0(Kernel::VoidPtr bit); EXTERN_C Kernel::VoidPtr hal_read_cr0(); // @brief CPU control register. EXTERN_C Kernel::VoidPtr hal_read_cr2(); // @brief Fault address. -EXTERN_C Kernel::VoidPtr hal_read_cr3(); // @brief Page table. +EXTERN_C Kernel::VoidPtr hal_read_cr3(); // @brief Page directory inside cr3 register. namespace Kernel::HAL { namespace Detail { diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index b57e9abf..d7d594d9 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -286,3 +286,5 @@ EXTERN_C ATTRIBUTE(naked) Kernel::Void hal_load_gdt(Kernel::HAL::Register64 ptr) inline Kernel::VoidPtr kKernelBitMpStart = nullptr; inline Kernel::UIntPtr kKernelBitMpSize = 0UL; + +inline Kernel::VoidPtr kKernelCR3 = nullptr;
\ No newline at end of file diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc index d1e41d1f..605df480 100644 --- a/dev/kernel/src/FS/HeFS.cc +++ b/dev/kernel/src/FS/HeFS.cc @@ -4,7 +4,6 @@ ------------------------------------------- */ -#include "NewKit/Macros.h" #ifdef __FSKIT_INCLUDES_HEFS__ #include <FSKit/HeFS.h> diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 4b206317..23ab22fa 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -20,8 +20,6 @@ #include <KernelKit/MemoryMgr.h> #include <KernelKit/ProcessScheduler.h> #include <NewKit/KString.h> -#include "KernelKit/CoreProcessScheduler.h" -#include "NewKit/Defines.h" ///! BUGS: 0 @@ -130,7 +128,7 @@ ErrorOr<VoidPtr> USER_PROCESS::New(SizeT sz, SizeT pad_amount) { if (this->UsedMemory > kSchedMaxMemoryLimit) return ErrorOr<VoidPtr>(-kErrorHeapOutOfMemory); #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - auto vm_register = hal_read_cr3(); + auto vm_register = kKernelCR3; hal_write_cr3(this->VMRegister); auto ptr = mm_new_heap(sz, Yes, Yes, pad_amount); @@ -267,7 +265,7 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { auto memory_heap_list = this->HeapTree; #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - auto pd = hal_read_cr3(); + auto pd = kKernelCR3; hal_write_cr3(this->VMRegister); #endif |
