summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKAKit/src
diff options
context:
space:
mode:
Diffstat (limited to 'dev/ZKAKit/src')
-rw-r--r--dev/ZKAKit/src/BitMapMgr.cc6
-rw-r--r--dev/ZKAKit/src/CodeMgr.cc2
-rw-r--r--dev/ZKAKit/src/DriveMgr.cc2
-rw-r--r--dev/ZKAKit/src/FS/NeFS.cc10
-rw-r--r--dev/ZKAKit/src/Heap.cc3
-rw-r--r--dev/ZKAKit/src/KernelMain.cc2
-rw-r--r--dev/ZKAKit/src/PEFCodeMgr.cc13
-rw-r--r--dev/ZKAKit/src/Stop.cc5
-rw-r--r--dev/ZKAKit/src/UserProcessScheduler.cc39
-rw-r--r--dev/ZKAKit/src/UserProcessTeam.cc8
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.