summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal <amlal@nekernel.org>2025-04-30 12:34:54 +0200
committerAmlal <amlal@nekernel.org>2025-04-30 12:34:54 +0200
commitfcea594f2df75dcd0f3d4bfeac988b748be89c13 (patch)
tree0204f5575637644879c89a1a3c00b5848043e89b
parent911bf2d68a4904d8ff838d31e00ef65d4e03063c (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.cc2
-rw-r--r--dev/boot/src/HEL/AMD64/BootAPI.S2
-rw-r--r--dev/boot/src/HEL/AMD64/BootEFI.cc12
-rw-r--r--dev/ddk/DDKKit/net.h16
-rw-r--r--dev/kernel/FirmwareKit/Handover.h4
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc7
-rw-r--r--dev/kernel/HALKit/AMD64/Paging.h2
-rw-r--r--dev/kernel/HALKit/AMD64/Processor.h2
-rw-r--r--dev/kernel/src/FS/HeFS.cc1
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc6
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