summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src/UserProcessScheduler.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-03-25 15:35:28 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2025-03-25 15:35:28 +0100
commit0ead895f52d24dad009f738037a7795d4e3d840a (patch)
tree863fd1c881fc7bf26ab78b932421e6416bbef288 /dev/kernel/src/UserProcessScheduler.cc
parent59dbe4cffc7c633709ef8b45f49c46daf7f74e92 (diff)
kernel: Refactor AHCI I/O path, enhance memory allocators, and cleanup obsolete script
- Removed unused `build_gcc.sh` script. - Namespaced CPU feature flags under `NeOS` and transitioned from enum to unnamed enum for scoping. - Renamed `drv_std_input_output` to `drv_std_input_output_ahci` for clarity. - Improved AHCI driver documentation and added zeroing for read buffers. - Added optional `pad` parameter to memory allocators: `mm_alloc_bitmap`, `mm_new_heap`, `PageMgr::Request`, etc. - Updated bitmap allocator to correctly handle and align with padded sizes. - Added `fPad` field to memory header block. - Fixed `ATA-DMA` mode comment, corrected PRD usage and logic. - Improved code documentation and formatting in `UserProcessScheduler`, `PageMgr`, and related components. - Enhanced safety in process memory cleanup (e.g., `StackReserve` cleanup). Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/src/UserProcessScheduler.cc')
-rw-r--r--dev/kernel/src/UserProcessScheduler.cc29
1 files changed, 17 insertions, 12 deletions
diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc
index 19861dbe..98abe13c 100644
--- a/dev/kernel/src/UserProcessScheduler.cc
+++ b/dev/kernel/src/UserProcessScheduler.cc
@@ -111,11 +111,11 @@ namespace NeOS
auto vm_register = hal_read_cr3();
hal_write_cr3(this->VMRegister);
- auto ptr = mm_new_heap(sz + pad_amount, Yes, Yes);
+ auto ptr = mm_new_heap(sz, Yes, Yes, pad_amount);
hal_write_cr3(vm_register);
#else
- auto ptr = mm_new_heap(sz + pad_amount, Yes, Yes);
+ auto ptr = mm_new_heap(sz, Yes, Yes, pad_amount);
#endif
if (!this->ProcessMemoryHeap)
@@ -238,15 +238,23 @@ namespace NeOS
if (this->Image.fCode && mm_is_valid_heap(this->Image.fCode))
mm_delete_heap(this->Image.fCode);
+ //! Delete blob too.
if (this->Image.fBlob && mm_is_valid_heap(this->Image.fBlob))
mm_delete_heap(this->Image.fBlob);
+ //! Delete stack frame.
if (this->StackFrame && mm_is_valid_heap(this->StackFrame))
mm_delete_heap((VoidPtr)this->StackFrame);
- this->Image.fBlob = nullptr;
- this->Image.fCode = nullptr;
- this->StackFrame = nullptr;
+ //! Delete stack reserve.
+ if (this->StackReserve && mm_is_valid_heap(this->StackReserve))
+ mm_delete_heap(reinterpret_cast<VoidPtr>(this->StackReserve));
+
+ //! Avoid use after free.
+ this->Image.fBlob = nullptr;
+ this->Image.fCode = nullptr;
+ this->StackFrame = nullptr;
+ this->StackReserve = nullptr;
if (this->Kind == kExectuableDylibKind)
{
@@ -262,10 +270,7 @@ namespace NeOS
this->DylibDelegate = nullptr;
}
- if (this->StackReserve)
- mm_delete_heap(reinterpret_cast<VoidPtr>(this->StackReserve));
-
- this->ProcessId = 0;
+ this->ProcessId = 0UL;
this->Status = ProcessStatusKind::kFinished;
--this->ProcessParentTeam->mProcessCount;
@@ -311,7 +316,7 @@ namespace NeOS
flags |= HAL::kMMFlagsUser;
HAL::mm_map_page((VoidPtr)process.VMRegister, process.VMRegister, flags);
-#endif // __NE_VIRTUAL_MEMORY_SUPPORT__
+#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
process.StackFrame = new HAL::StackFrame();
@@ -327,7 +332,7 @@ namespace NeOS
flags |= HAL::kMMFlagsUser;
HAL::mm_map_page((VoidPtr)process.StackFrame, process.StackFrame, flags);
-#endif // __NE_VIRTUAL_MEMORY_SUPPORT__
+#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
// React according to process kind.
switch (process.Kind)
@@ -357,7 +362,7 @@ namespace NeOS
flags |= HAL::kMMFlagsUser;
HAL::mm_map_page((VoidPtr)process.StackReserve, process.StackReserve, flags);
-#endif // __NE_VIRTUAL_MEMORY_SUPPORT__
+#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__
process.ProcessParentTeam = &mTeam;