diff options
| author | Amlal <amlal.elmahrouss@icloud.com> | 2024-10-26 19:49:02 +0200 |
|---|---|---|
| committer | Amlal <amlal.elmahrouss@icloud.com> | 2024-10-26 19:49:02 +0200 |
| commit | 6dcf5b87da65de2254d6102f567183eaeca03088 (patch) | |
| tree | b281ecd4cf0bcd60eaa476979f4f2183b0f4d04d /dev/zka/src | |
| parent | 88b5be35623fb573cfa0d53cfc407ae1005ccad9 (diff) | |
IMP: This commit contains fixes and improvements regarding the kernel, a next one will be done soon.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/zka/src')
| -rw-r--r-- | dev/zka/src/BitMapMgr.cc | 76 | ||||
| -rw-r--r-- | dev/zka/src/CodeMgr.cc | 8 | ||||
| -rw-r--r-- | dev/zka/src/GUIDWizard.cc | 6 | ||||
| -rw-r--r-- | dev/zka/src/PEFCodeMgr.cc | 13 | ||||
| -rw-r--r-- | dev/zka/src/UserProcessScheduler.cc | 31 | ||||
| -rw-r--r-- | dev/zka/src/Utils.cc | 18 |
6 files changed, 63 insertions, 89 deletions
diff --git a/dev/zka/src/BitMapMgr.cc b/dev/zka/src/BitMapMgr.cc index e97c9bfa..27158a12 100644 --- a/dev/zka/src/BitMapMgr.cc +++ b/dev/zka/src/BitMapMgr.cc @@ -17,9 +17,9 @@ #include <NewKit/Defines.h> #include <NewKit/Stop.h> -#define cBitMapMagIdx (0) -#define cBitMapSizeIdx (1) -#define cBitMapUsedIdx (2) +#define kBitMapMagIdx (0) +#define kBitMapSizeIdx (1) +#define kBitMapUsedIdx (2) namespace Kernel { @@ -43,8 +43,8 @@ namespace Kernel UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(page_ptr); - if (!ptr_bit_set[cBitMapMagIdx] || - ptr_bit_set[cBitMapMagIdx] != kBitMapMagic) + if (!ptr_bit_set[kBitMapMagIdx] || + ptr_bit_set[kBitMapMagIdx] != kBitMapMagic) return No; return Yes; @@ -57,28 +57,24 @@ namespace Kernel UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(page_ptr); - ptr_bit_set[cBitMapMagIdx] = kBitMapMagic; - ptr_bit_set[cBitMapUsedIdx] = No; + ptr_bit_set[kBitMapMagIdx] = kBitMapMagic; + ptr_bit_set[kBitMapUsedIdx] = No; this->GetBitMapStatus(ptr_bit_set); - mm_map_page(ptr_bit_set, ~eFlagsPresent); - mm_map_page(ptr_bit_set, ~eFlagsWr); - mm_map_page(ptr_bit_set, ~eFlagsUser); - return Yes; } - UInt32 MakeFlags(Bool wr, Bool user) + UInt32 MakeMMFlags(Bool wr, Bool user) { - UInt32 flags = eFlagsPresent; + UInt32 flags = kMMFlagsPresent; if (wr) - flags |= eFlagsWr; + flags |= kMMFlagsWr; if (user) - flags |= eFlagsUser; + flags |= kMMFlagsUser; return flags; } @@ -93,33 +89,33 @@ namespace Kernel { UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(base); - if (ptr_bit_set[cBitMapMagIdx] == kBitMapMagic && - ptr_bit_set[cBitMapSizeIdx] <= size) + if (ptr_bit_set[kBitMapMagIdx] == kBitMapMagic && + ptr_bit_set[kBitMapSizeIdx] <= size) { - if (ptr_bit_set[cBitMapUsedIdx] == No) + if (ptr_bit_set[kBitMapUsedIdx] == No) { - ptr_bit_set[cBitMapSizeIdx] = size; - ptr_bit_set[cBitMapUsedIdx] = Yes; + ptr_bit_set[kBitMapSizeIdx] = size; + ptr_bit_set[kBitMapUsedIdx] = Yes; this->GetBitMapStatus(ptr_bit_set); - UInt32 flags = this->MakeFlags(wr, user); + UInt32 flags = this->MakeMMFlags(wr, user); mm_map_page(ptr_bit_set, flags); return (VoidPtr)ptr_bit_set; } } - else if (ptr_bit_set[cBitMapMagIdx] != kBitMapMagic) + else if (ptr_bit_set[kBitMapMagIdx] != kBitMapMagic) { UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(base_ptr); - ptr_bit_set[cBitMapMagIdx] = kBitMapMagic; - ptr_bit_set[cBitMapSizeIdx] = size; - ptr_bit_set[cBitMapUsedIdx] = Yes; + ptr_bit_set[kBitMapMagIdx] = kBitMapMagic; + ptr_bit_set[kBitMapSizeIdx] = size; + ptr_bit_set[kBitMapUsedIdx] = Yes; this->GetBitMapStatus(ptr_bit_set); - UInt32 flags = this->MakeFlags(wr, user); + UInt32 flags = this->MakeMMFlags(wr, user); mm_map_page(ptr_bit_set, flags); return (VoidPtr)ptr_bit_set; @@ -143,13 +139,13 @@ namespace Kernel return; } - kcout << "Magic Number: " << hex_number(ptr_bit_set[cBitMapMagIdx]) << endl; - kcout << "Is Allocated: " << (ptr_bit_set[cBitMapUsedIdx] ? "Yes" : "No") << endl; - kcout << "Size of BitMap (B): " << number(ptr_bit_set[cBitMapSizeIdx]) << endl; - kcout << "Size of BitMap (KIB): " << number(KIB(ptr_bit_set[cBitMapSizeIdx])) << endl; - kcout << "Size of BitMap (MIB): " << number(MIB(ptr_bit_set[cBitMapSizeIdx])) << endl; - kcout << "Size of BitMap (GIB): " << number(GIB(ptr_bit_set[cBitMapSizeIdx])) << endl; - kcout << "Size of BitMap (TIB): " << number(TIB(ptr_bit_set[cBitMapSizeIdx])) << endl; + kcout << "Magic Number: " << hex_number(ptr_bit_set[kBitMapMagIdx]) << endl; + kcout << "Is Allocated: " << (ptr_bit_set[kBitMapUsedIdx] ? "Yes" : "No") << endl; + kcout << "Size of BitMap (B): " << number(ptr_bit_set[kBitMapSizeIdx]) << endl; + kcout << "Size of BitMap (KIB): " << number(KIB(ptr_bit_set[kBitMapSizeIdx])) << endl; + kcout << "Size of BitMap (MIB): " << number(MIB(ptr_bit_set[kBitMapSizeIdx])) << endl; + kcout << "Size of BitMap (GIB): " << number(GIB(ptr_bit_set[kBitMapSizeIdx])) << endl; + kcout << "Size of BitMap (TIB): " << number(TIB(ptr_bit_set[kBitMapSizeIdx])) << endl; kcout << "Address Of BitMap: " << hex_number((UIntPtr)ptr_bit_set) << endl; } }; @@ -171,15 +167,6 @@ namespace Kernel return nullptr; } - if (wr) - mm_map_page(ptr_new, eFlagsWr | eFlagsPresent); - else if (user && wr) - mm_map_page(ptr_new, eFlagsUser | eFlagsWr | eFlagsPresent); - else if (user) - mm_map_page(ptr_new, eFlagsUser | eFlagsPresent); - else - mm_map_page(ptr_new, eFlagsPresent); - return (UIntPtr*)ptr_new; } @@ -192,11 +179,6 @@ namespace Kernel Detail::IBitMapAllocator traits; Bool ret = traits.FreeBitMap(page_ptr); - if (ret) - { - mm_map_page(page_ptr, ~eFlagsPresent); - } - return ret; } } // namespace HAL diff --git a/dev/zka/src/CodeMgr.cc b/dev/zka/src/CodeMgr.cc index 130f8cfe..c855347b 100644 --- a/dev/zka/src/CodeMgr.cc +++ b/dev/zka/src/CodeMgr.cc @@ -4,8 +4,8 @@ ------------------------------------------- */ -#include <NewKit/Utils.h> #include <KernelKit/CodeMgr.h> +#include <NewKit/Utils.h> #include <KernelKit/UserProcessScheduler.h> namespace Kernel @@ -14,20 +14,20 @@ namespace Kernel /// @note This sets up a new stack, anything on the main function that calls the Kernel will not be accessible. /// @param main the start of the process. /// @return if the process was started or not. - Bool sched_execute_thread(MainKind main, const Char* process_name) noexcept + SizeT rtl_create_process(MainKind main, const Char* process_name) noexcept { if (!main) return No; UserProcess proc; - proc.SetImageStart(reinterpret_cast<VoidPtr>(main)); + proc.Image = reinterpret_cast<VoidPtr>(main); proc.Kind = UserProcess::kExectuableKind; proc.StackSize = kib_cast(32); rt_set_memory(proc.Name, 0, kProcessLen); rt_copy_memory((VoidPtr)process_name, proc.Name, rt_string_len(process_name)); - return UserProcessScheduler::The().Add(proc) > 0; + return UserProcessScheduler::The().Add(proc); } } // namespace Kernel diff --git a/dev/zka/src/GUIDWizard.cc b/dev/zka/src/GUIDWizard.cc index d72c77eb..cb4fc50b 100644 --- a/dev/zka/src/GUIDWizard.cc +++ b/dev/zka/src/GUIDWizard.cc @@ -26,9 +26,9 @@ namespace CFKit::XRN::Version1 Ref<GUIDSequence*> seq_ref{seq}; - seq_ref.Leak()->fMs1 = uuidSeq[0]; - seq_ref.Leak()->fMs2 = uuidSeq[1]; - seq_ref.Leak()->fMs3 = uuidSeq[2]; + seq_ref.Leak()->fMs1 = uuidSeq[0]; + seq_ref.Leak()->fMs2 = uuidSeq[1]; + seq_ref.Leak()->fMs3 = uuidSeq[2]; seq_ref.Leak()->fMs4[0] = uuidSeq[3]; seq_ref.Leak()->fMs4[1] = uuidSeq[4]; seq_ref.Leak()->fMs4[2] = uuidSeq[5]; diff --git a/dev/zka/src/PEFCodeMgr.cc b/dev/zka/src/PEFCodeMgr.cc index 593910be..44c14b42 100644 --- a/dev/zka/src/PEFCodeMgr.cc +++ b/dev/zka/src/PEFCodeMgr.cc @@ -201,16 +201,16 @@ namespace Kernel namespace Utils { - Bool execute_from_image(PEFLoader& exec, const Int32& procKind) noexcept + SizeT execute_from_image(PEFLoader& exec, const Int32& procKind) noexcept { auto errOrStart = exec.FindStart(); if (errOrStart.Error() != kErrorSuccess) - return false; + return No; UserProcess proc; - proc.SetImageStart(errOrStart.Leak().Leak()); + proc.Image = errOrStart.Leak().Leak(); proc.Kind = procKind; proc.StackSize = *(UIntPtr*)exec.FindSymbol(cPefStackSizeSymbol, kPefData); proc.MemoryLimit = *(UIntPtr*)exec.FindSymbol(cPefHeapSizeSymbol, kPefData); @@ -218,18 +218,15 @@ namespace Kernel rt_set_memory(proc.Name, 0, kProcessLen); if (exec.FindSymbol(cPefNameSymbol, kPefData)) - rt_copy_memory((VoidPtr)exec.FindSymbol(cPefNameSymbol, kPefData), proc.Name, rt_string_len((Char*)exec.FindSymbol(cPefNameSymbol, kPefData))); - else - rt_copy_memory((VoidPtr) "UNNAMED PROCESS.", proc.Name, rt_string_len("UNNAMED PROCESS.")); + rt_copy_memory(exec.FindSymbol(cPefNameSymbol, kPefData), proc.Name, rt_string_len((Char*)exec.FindSymbol(cPefNameSymbol, kPefData))); if (!proc.StackSize) { const auto cDefaultStackSizeMib = 8; - proc.StackSize = mib_cast(cDefaultStackSizeMib); } - return UserProcessScheduler::The().Add(proc) > 0; + return UserProcessScheduler::The().Add(proc); } } // namespace Utils diff --git a/dev/zka/src/UserProcessScheduler.cc b/dev/zka/src/UserProcessScheduler.cc index 05c2b35e..844afa5d 100644 --- a/dev/zka/src/UserProcessScheduler.cc +++ b/dev/zka/src/UserProcessScheduler.cc @@ -113,7 +113,7 @@ namespace Kernel { #ifdef __ZKA_AMD64__ auto pd = hal_read_cr3(); - hal_write_cr3(reinterpret_cast<VoidPtr>(this->MemoryPD)); + hal_write_cr3(reinterpret_cast<VoidPtr>(this->VMRegister)); auto ptr = mm_new_heap(sz, Yes, Yes); @@ -174,7 +174,7 @@ namespace Kernel { #ifdef __ZKA_AMD64__ auto pd = hal_read_cr3(); - hal_write_cr3(reinterpret_cast<VoidPtr>(this->MemoryPD)); + hal_write_cr3(reinterpret_cast<VoidPtr>(this->VMRegister)); auto ret = mm_delete_heap(entry->MemoryEntry); @@ -250,7 +250,7 @@ namespace Kernel { #ifdef __ZKA_AMD64__ auto pd = hal_read_cr3(); - hal_write_cr3(reinterpret_cast<VoidPtr>(this->MemoryPD)); + hal_write_cr3(reinterpret_cast<VoidPtr>(this->VMRegister)); #endif MUST_PASS(mm_delete_heap(memory_list->MemoryEntry)); @@ -269,7 +269,7 @@ namespace Kernel } //! Free the memory's page directory. - HAL::mm_free_bitmap(reinterpret_cast<VoidPtr>(this->MemoryPD)); + HAL::mm_free_bitmap(reinterpret_cast<VoidPtr>(this->VMRegister)); //! Delete image if not done already. if (this->Image && mm_is_valid_heap(this->Image)) @@ -310,14 +310,12 @@ namespace Kernel SizeT UserProcessScheduler::Add(UserProcess process) { if (mTeam.mProcessAmount > kSchedProcessLimitPerTeam) - return 0; + return -kErrorInvalidData; #ifdef __ZKA_AMD64__ - process.MemoryPD = reinterpret_cast<UIntPtr>(HAL::mm_alloc_bitmap(Yes, Yes, sizeof(PDE), Yes)); + process.VMRegister = reinterpret_cast<UIntPtr>(HAL::mm_alloc_bitmap(Yes, Yes, sizeof(PDE), Yes)); #endif // __ZKA_AMD64__ - process.Status = ProcessStatusKind::kStarting; - process.StackFrame = (HAL::StackFramePtr)mm_new_heap(sizeof(HAL::StackFrame), Yes, Yes); if (!process.StackFrame) @@ -347,22 +345,18 @@ namespace Kernel if (!process.StackReserve) { - mm_delete_heap(process.StackFrame); - process.StackFrame = nullptr; + process.Crash(); return -kErrorProcessFault; } ++mTeam.mProcessAmount; process.ProcessId = mTeam.mProcessAmount; - process.Status = ProcessStatusKind::kRunning; - - // avoid the pitfalls of moving process. - auto ret_pid = process.ProcessId; + process.Status = ProcessStatusKind::kStarting; - mTeam.AsArray()[process.ProcessId] = move(process); + mTeam.AsArray()[process.ProcessId] = process; - return ret_pid; + return process.ProcessId; } /***********************************************************************************/ @@ -384,7 +378,7 @@ namespace Kernel /***********************************************************************************/ - Bool UserProcessScheduler::Remove(ProcessID process_id) + const Bool UserProcessScheduler::Remove(ProcessID process_id) { // check if process is within range. if (process_id > mTeam.AsArray().Count()) @@ -408,6 +402,7 @@ namespace Kernel const Bool UserProcessScheduler::HasMP() { + MUST_PASS(kHandoverHeader); return kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled; } @@ -447,7 +442,7 @@ namespace Kernel this->CurrentProcess() = process; // tell helper to find a core to schedule on. - if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize - 1], process.StackFrame, + if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize], process.StackFrame, process.ProcessId)) { process.Crash(); diff --git a/dev/zka/src/Utils.cc b/dev/zka/src/Utils.cc index 7427fe34..53f98391 100644 --- a/dev/zka/src/Utils.cc +++ b/dev/zka/src/Utils.cc @@ -34,14 +34,15 @@ namespace Kernel Size rt_string_len(const Char* str, SizeT _len) { Size len{0}; + while (str[len] != '\0') { if (len > _len) { - return 0; + return _len; } - len++; + ++len; } return len; @@ -49,14 +50,11 @@ namespace Kernel Size rt_string_len(const Char* ptr) { - if (*ptr == 0) - return 0; + SizeT cnt{0}; - SizeT cnt = 0; - - while (ptr[cnt] != (Char)0) + while (ptr[cnt] != 0) { - cnt++; + ++cnt; } return cnt; @@ -104,7 +102,7 @@ namespace Kernel Int rt_copy_memory(const voidPtr src, voidPtr dst, Size len) { if (len < 1) - return -2; + return 0; char* srcChr = reinterpret_cast<char*>(src); char* dstChar = reinterpret_cast<char*>(dst); @@ -125,11 +123,13 @@ namespace Kernel return nullptr; const Char* string = new Char[rt_string_len(text)]; + if (!string) return nullptr; voidPtr vText = reinterpret_cast<voidPtr>(const_cast<char*>(text)); voidPtr vStr = reinterpret_cast<voidPtr>(const_cast<char*>(string)); + rt_copy_memory(vText, vStr, rt_string_len(text)); return string; |
