diff options
Diffstat (limited to 'dev/ZKAKit/src')
| -rw-r--r-- | dev/ZKAKit/src/BitMapMgr.cc | 6 | ||||
| -rw-r--r-- | dev/ZKAKit/src/CodeMgr.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/DriveMgr.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/FS/NeFS.cc | 10 | ||||
| -rw-r--r-- | dev/ZKAKit/src/Heap.cc | 3 | ||||
| -rw-r--r-- | dev/ZKAKit/src/KernelMain.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/PEFCodeMgr.cc | 13 | ||||
| -rw-r--r-- | dev/ZKAKit/src/Stop.cc | 5 | ||||
| -rw-r--r-- | dev/ZKAKit/src/UserProcessScheduler.cc | 39 | ||||
| -rw-r--r-- | dev/ZKAKit/src/UserProcessTeam.cc | 8 |
10 files changed, 55 insertions, 35 deletions
diff --git a/dev/ZKAKit/src/BitMapMgr.cc b/dev/ZKAKit/src/BitMapMgr.cc index 7e2bed8b..ebe91e88 100644 --- a/dev/ZKAKit/src/BitMapMgr.cc +++ b/dev/ZKAKit/src/BitMapMgr.cc @@ -150,6 +150,12 @@ namespace Kernel }; } // namespace Detail + auto mm_is_bitmap(VoidPtr ptr) -> Bool + { + Detail::IBitMapAllocator traits; + return traits.IsBitMap(ptr); + } + /// @brief Allocate a new page to be used by the OS. /// @param wr read/write bit. /// @param user user bit. diff --git a/dev/ZKAKit/src/CodeMgr.cc b/dev/ZKAKit/src/CodeMgr.cc index f33ed3bf..0f2215d0 100644 --- a/dev/ZKAKit/src/CodeMgr.cc +++ b/dev/ZKAKit/src/CodeMgr.cc @@ -26,7 +26,7 @@ namespace Kernel process_hdr->StackSize = kib_cast(8); rt_set_memory(process_hdr->Name, 0, kProcessNameLen); - rt_copy_memory((VoidPtr)process_name, process_hdr->Name, rt_string_len(process_name) + 1); + rt_copy_memory((VoidPtr)process_name, process_hdr->Name, rt_string_len(process_name)); ProcessID id = UserProcessScheduler::The().Spawn(process_hdr); diff --git a/dev/ZKAKit/src/DriveMgr.cc b/dev/ZKAKit/src/DriveMgr.cc index 4a5754ed..0b527288 100644 --- a/dev/ZKAKit/src/DriveMgr.cc +++ b/dev/ZKAKit/src/DriveMgr.cc @@ -210,7 +210,7 @@ namespace Kernel trait.fInit = io_drv_init; trait.fDriveKind = io_drv_kind; - kcout << "Detect partiton scheme of: " << trait.fName << ".\r"; + kcout << "Detect partition scheme of: " << trait.fName << ".\r"; Detail::ioi_detect_drive(&trait); diff --git a/dev/ZKAKit/src/FS/NeFS.cc b/dev/ZKAKit/src/FS/NeFS.cc index 2f446b73..fd27b475 100644 --- a/dev/ZKAKit/src/FS/NeFS.cc +++ b/dev/ZKAKit/src/FS/NeFS.cc @@ -61,7 +61,7 @@ STATIC MountpointInterface kDiskMountpoint; /// @return the fork /***********************************************************************************/ _Output NFS_FORK_STRUCT* NeFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* catalog, - _Input NFS_FORK_STRUCT& the_fork) + _Input NFS_FORK_STRUCT& the_fork) { if (catalog && the_fork.ForkName[0] != 0 && the_fork.DataSize <= kNeFSForkDataSz) @@ -170,8 +170,8 @@ _Output NFS_FORK_STRUCT* NeFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* catal /// @return the fork. /***********************************************************************************/ _Output NFS_FORK_STRUCT* NeFSParser::FindFork(_Input NFS_CATALOG_STRUCT* catalog, - _Input const Char* name, - Boolean isDataFork) + _Input const Char* name, + Boolean isDataFork) { auto drv = kDiskMountpoint.A(); NFS_FORK_STRUCT* the_fork = nullptr; @@ -236,7 +236,7 @@ _Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name) /// @param kind the catalog kind. /// @return catalog pointer. /***********************************************************************************/ -_Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name, +_Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name, _Input const Int32& flags, _Input const Int32& kind) { @@ -936,7 +936,7 @@ Boolean NeFSParser::RemoveCatalog(_Input const Char* catalogName) VoidPtr NeFSParser::ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, _Input Bool is_rsrc_fork, _Input SizeT dataSz, - _Input const Char* forkName) + _Input const Char* forkName) { if (!catalog) { diff --git a/dev/ZKAKit/src/Heap.cc b/dev/ZKAKit/src/Heap.cc index 4a780521..c23b8725 100644 --- a/dev/ZKAKit/src/Heap.cc +++ b/dev/ZKAKit/src/Heap.cc @@ -10,6 +10,7 @@ #include <NewKit/Crc32.h> #include <NewKit/PageMgr.h> #include <NewKit/Utils.h> +#include <ArchKit/ArchKit.h> /* ------------------------------------------- @@ -266,7 +267,7 @@ namespace Kernel /// @return if it exists. _Output Boolean mm_is_valid_heap(VoidPtr heap_ptr) { - if (heap_ptr) + if (heap_ptr && HAL::mm_is_bitmap(heap_ptr)) { Detail::HEAP_INFORMATION_BLOCK_PTR heap_info_ptr = reinterpret_cast<Detail::HEAP_INFORMATION_BLOCK_PTR>( diff --git a/dev/ZKAKit/src/KernelMain.cc b/dev/ZKAKit/src/KernelMain.cc index d9525e5c..11147a82 100644 --- a/dev/ZKAKit/src/KernelMain.cc +++ b/dev/ZKAKit/src/KernelMain.cc @@ -89,7 +89,7 @@ namespace Kernel::Detail } catalogDir = fNeFS->GetParser()->CreateCatalog(cDirStr[dirIndx], 0, - kNeFSCatalogKindDir); + kNeFSCatalogKindDir); NFS_FORK_STRUCT theFork{0}; diff --git a/dev/ZKAKit/src/PEFCodeMgr.cc b/dev/ZKAKit/src/PEFCodeMgr.cc index 43efa00a..c601abc9 100644 --- a/dev/ZKAKit/src/PEFCodeMgr.cc +++ b/dev/ZKAKit/src/PEFCodeMgr.cc @@ -255,12 +255,12 @@ namespace Kernel UserProcess* proc = new UserProcess(); - proc->Kind = procKind; + proc->Kind = procKind; proc->Image.fCode = errOrStart.Leak().Leak(); proc->Image.fBlob = exec.GetBlob().Leak().Leak(); - proc->StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData); + proc->StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData); proc->MemoryLimit = *(UIntPtr*)exec.FindSymbol(kPefHeapSizeSymbol, kPefData); - proc->PTime = 0UL; + proc->PTime = 0UL; rt_set_memory(proc->Name, 0, kProcessNameLen); @@ -273,7 +273,12 @@ namespace Kernel proc->StackSize = mib_cast(kDefaultStackSizeMib); } - return UserProcessScheduler::The().Spawn(proc); + auto id = UserProcessScheduler::The().Spawn(proc); + + if (id == kProcessInvalidID) + delete proc; + + return id; } } // namespace Utils } // namespace Kernel diff --git a/dev/ZKAKit/src/Stop.cc b/dev/ZKAKit/src/Stop.cc index f2c542f8..43e95ae8 100644 --- a/dev/ZKAKit/src/Stop.cc +++ b/dev/ZKAKit/src/Stop.cc @@ -110,7 +110,10 @@ namespace Kernel Void RecoveryFactory::Recover() noexcept { - HAL::rt_halt(); + while (YES) + { + HAL::rt_halt(); + } } void ke_runtime_check(bool expr, const Char* file, const Char* line) diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc index 906e9a0a..64705f85 100644 --- a/dev/ZKAKit/src/UserProcessScheduler.cc +++ b/dev/ZKAKit/src/UserProcessScheduler.cc @@ -120,23 +120,23 @@ namespace Kernel auto ptr = mm_new_heap(sz + pad_amount, Yes, Yes); #endif - if (!this->MemoryHeap) + if (!this->ProcessMemoryHeap) { - this->MemoryHeap = new UserProcess::UserProcessHeapList(); + this->ProcessMemoryHeap = new UserProcess::UserProcessHeapList(); - this->MemoryHeap->MemoryEntryPad = pad_amount; - this->MemoryHeap->MemoryEntrySize = sz; + this->ProcessMemoryHeap->MemoryEntryPad = pad_amount; + this->ProcessMemoryHeap->MemoryEntrySize = sz; - this->MemoryHeap->MemoryEntry = ptr; + this->ProcessMemoryHeap->MemoryEntry = ptr; - this->MemoryHeap->MemoryPrev = nullptr; - this->MemoryHeap->MemoryNext = nullptr; + this->ProcessMemoryHeap->MemoryPrev = nullptr; + this->ProcessMemoryHeap->MemoryNext = nullptr; return ErrorOr<VoidPtr>(ptr); } else { - UserProcessHeapList* entry = this->MemoryHeap; + UserProcessHeapList* entry = this->ProcessMemoryHeap; UserProcessHeapList* prev_entry = nullptr; while (!entry) @@ -207,7 +207,7 @@ namespace Kernel kLastExitCode = exit_code; - auto memory_heap_list = this->MemoryHeap; + auto memory_heap_list = this->ProcessMemoryHeap; #ifdef __ZKA_AMD64__ auto pd = hal_read_cr3(); @@ -271,6 +271,8 @@ namespace Kernel this->ProcessId = 0; this->Status = ProcessStatusKind::kFinished; + --this->ProcessParentTeam->mProcessCount; + delete this; } @@ -334,22 +336,17 @@ namespace Kernel kcout << "Create stack reserve for: " << process->Name << endl; - ProcessID pid = kProcessInvalidID; + ProcessID pid = mTeam.mProcessCount; - for (SizeT free_pid = 0UL; free_pid < kSchedProcessLimitPerTeam; ++free_pid) - { - if (mTeam.mProcessList[free_pid] && mm_is_valid_heap(mTeam.mProcessList[free_pid]) && mTeam.mProcessList[free_pid]->Status == ProcessStatusKind::kFinished) - { - pid = free_pid; - break; - } - } + if (pid > kSchedProcessLimitPerTeam) + return kProcessInvalidID; + + ++mTeam.mProcessCount; - if (pid == kProcessInvalidID) - return pid; + process->ProcessParentTeam = &mTeam; process->ProcessId = pid; - process->Status = ProcessStatusKind::kRunning; + process->Status = ProcessStatusKind::kStarting; process->PTime = (UIntPtr)AffinityKind::kStandard; kcout << "Process Name: " << process->Name << endl; diff --git a/dev/ZKAKit/src/UserProcessTeam.cc b/dev/ZKAKit/src/UserProcessTeam.cc index 5899f198..5d381020 100644 --- a/dev/ZKAKit/src/UserProcessTeam.cc +++ b/dev/ZKAKit/src/UserProcessTeam.cc @@ -13,6 +13,14 @@ namespace Kernel { + UserProcessTeam::UserProcessTeam() + { + for (SizeT i = 0U; i < mProcessList.Count(); ++i) + { + mProcessList[i] = nullptr; + } + } + /***********************************************************************************/ /// @brief UserProcess list array getter. /// @return The list of process to schedule. |
