summaryrefslogtreecommitdiffhomepage
path: root/Kernel/Sources
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel/Sources')
-rw-r--r--Kernel/Sources/CodeManager.cxx4
-rw-r--r--Kernel/Sources/FS/NewFS.cxx2
-rw-r--r--Kernel/Sources/FileManager.cxx4
-rw-r--r--Kernel/Sources/HError.cxx3
-rw-r--r--Kernel/Sources/IndexableProperty.cxx12
-rw-r--r--Kernel/Sources/KeMain.cxx77
-rw-r--r--Kernel/Sources/KernelHeap.cxx4
-rw-r--r--Kernel/Sources/Network/NetworkDevice.cxx22
-rw-r--r--Kernel/Sources/PEFSharedObject.cxx10
-rw-r--r--Kernel/Sources/ProcessScheduler.cxx134
-rw-r--r--Kernel/Sources/Property.cxx8
-rw-r--r--Kernel/Sources/SMPManager.cxx88
-rw-r--r--Kernel/Sources/String.cxx2
-rw-r--r--Kernel/Sources/ThreadLocalStorage.cxx8
-rw-r--r--Kernel/Sources/UserHeap.cxx10
15 files changed, 198 insertions, 190 deletions
diff --git a/Kernel/Sources/CodeManager.cxx b/Kernel/Sources/CodeManager.cxx
index 33121edf..9f374c18 100644
--- a/Kernel/Sources/CodeManager.cxx
+++ b/Kernel/Sources/CodeManager.cxx
@@ -20,11 +20,11 @@ namespace NewOS
return false;
ProcessHeader proc((VoidPtr)main);
- proc.Kind = ProcessHeader::kDriverKind;
+ proc.Kind = ProcessHeader::kAppKind;
rt_copy_memory((VoidPtr)processName, proc.Name, rt_string_len(proc.Name));
Ref<ProcessHeader> refProc = proc;
return ProcessScheduler::The().Leak().Add(refProc);
}
-} // namespace NewOS \ No newline at end of file
+} // namespace NewOS
diff --git a/Kernel/Sources/FS/NewFS.cxx b/Kernel/Sources/FS/NewFS.cxx
index f015673d..2938c53f 100644
--- a/Kernel/Sources/FS/NewFS.cxx
+++ b/Kernel/Sources/FS/NewFS.cxx
@@ -593,6 +593,8 @@ _Output NewCatalog* NewFSParser::FindCatalog(_Input const char* catalogName,
if (!sMountpointInterface.GetAddressOf(this->fDriveIndex))
return nullptr;
+ kcout << "newoskrnl: start finding catalog...\r";
+
Char* sectorBuf = new Char[sizeof(NewPartitionBlock)];
auto drive = sMountpointInterface.GetAddressOf(this->fDriveIndex);
diff --git a/Kernel/Sources/FileManager.cxx b/Kernel/Sources/FileManager.cxx
index 6e61a65d..ee285ae1 100644
--- a/Kernel/Sources/FileManager.cxx
+++ b/Kernel/Sources/FileManager.cxx
@@ -90,7 +90,7 @@ namespace NewOS
NEWOS_UNUSED(flags);
- auto dataForkName = "FileData";
+ auto dataForkName = kNewFSDataFork;
if ((reinterpret_cast<NewCatalog*>(node))->Kind == kNewFSCatalogKindFile)
fImpl->WriteCatalog(reinterpret_cast<NewCatalog*>(node), data, size,
@@ -112,7 +112,7 @@ namespace NewOS
NEWOS_UNUSED(flags);
- auto dataForkName = "FileData";
+ auto dataForkName = kNewFSDataFork;
if ((reinterpret_cast<NewCatalog*>(node))->Kind == kNewFSCatalogKindFile)
return fImpl->ReadCatalog(reinterpret_cast<NewCatalog*>(node), sz,
diff --git a/Kernel/Sources/HError.cxx b/Kernel/Sources/HError.cxx
index 937e983a..5ba02049 100644
--- a/Kernel/Sources/HError.cxx
+++ b/Kernel/Sources/HError.cxx
@@ -13,6 +13,7 @@ namespace NewOS
/// @return if error-free: true, otherwise false.
Boolean ke_bug_check(void) noexcept
{
- return true;
+ /// TODO:
+ return false;
}
} // namespace NewOS
diff --git a/Kernel/Sources/IndexableProperty.cxx b/Kernel/Sources/IndexableProperty.cxx
index a687e0ec..457e2c53 100644
--- a/Kernel/Sources/IndexableProperty.cxx
+++ b/Kernel/Sources/IndexableProperty.cxx
@@ -20,19 +20,21 @@ namespace NewOS
{
namespace Indexer
{
- IndexProperty& IndexableProperty::LeakProperty() noexcept
+ IndexProperty& IndexableProperty::Leak() noexcept
{
return fIndex;
}
- void IndexableProperty::AddFlag(Int16 flag)
+ Void IndexableProperty::AddFlag(Int16 flag)
{
fFlags |= flag;
}
- void IndexableProperty::RemoveFlag(Int16 flag)
+
+ Void IndexableProperty::RemoveFlag(Int16 flag)
{
fFlags &= flag;
}
+
Int16 IndexableProperty::HasFlag(Int16 flag)
{
return fFlags & flag;
@@ -48,9 +50,9 @@ namespace NewOS
if (!indexer.HasFlag(kIndexerClaimed))
{
indexer.AddFlag(kIndexerClaimed);
- rt_copy_memory((VoidPtr)indexer.LeakProperty().Path, (VoidPtr)filename, filenameLen);
+ rt_copy_memory((VoidPtr)indexer.Leak().Path, (VoidPtr)filename, filenameLen);
- kcout << "newoskrnl: FSKit: index new file: " << filename << endl;
+ kcout << "newoskrnl: filesystem: index new file: " << filename << endl;
}
}
} // namespace Indexer
diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx
index f4f9f44c..fb127271 100644
--- a/Kernel/Sources/KeMain.cxx
+++ b/Kernel/Sources/KeMain.cxx
@@ -28,18 +28,19 @@ namespace NewOS::Detail
{
/// @brief Filesystem auto mounter, additional checks are also done by the
/// class.
- class FilesystemWizard final
+ class FilesystemInstaller final
{
NewOS::NewFilesystemManager* fNewFS{nullptr};
public:
- explicit FilesystemWizard()
+ /// @brief wizard constructor.
+ explicit FilesystemInstaller()
{
if (NewOS::FilesystemManagerInterface::GetMounted())
{
/// Mounted partition, cool!
NewOS::kcout
- << "New OS: No need to create for a NewFS partition here...\r";
+ << "newoskrnl: No need to create for a NewFS partition here...\r";
}
else
{
@@ -51,11 +52,11 @@ namespace NewOS::Detail
if (fNewFS->GetParser())
{
- constexpr auto cFolderInfo = "Metadata";
+ constexpr auto cFolderInfo = "META-INF";
const auto cDirCount = 8;
const char* cDirStr[cDirCount] = {
- "/Boot/", "/System/", "/Support/", "/Applications/",
- "/Users/", "/Library/", "/Mount/", "/Assistants/"};
+ "\\Boot\\", "\\System\\", "\\Support\\", "\\Packages\\",
+ "\\Users\\", "\\Library\\", "\\Mount\\", "\\DCIM\\"};
for (NewOS::SizeT dirIndx = 0UL; dirIndx < cDirCount; ++dirIndx)
{
@@ -68,7 +69,7 @@ namespace NewOS::Detail
}
catalogDir = fNewFS->GetParser()->CreateCatalog(cDirStr[dirIndx], 0,
- kNewFSCatalogKindDir);
+ kNewFSCatalogKindDir);
NewFork theFork{0};
@@ -92,9 +93,9 @@ namespace NewOS::Detail
metadataFolder +=
"<p>Kind: folder</p>\r<p>Created by: system</p>\r<p>Edited by: "
- "system</p>\r<p>Volume Type: New OS Standard</p>\r";
+ "system</p>\r<p>Volume Type: s10 Filesystem</p>\r";
- metadataFolder += "<p>File name: ";
+ metadataFolder += "<p>Path: ";
metadataFolder += cDirStr[dirIndx];
metadataFolder += "</p>\r";
@@ -113,9 +114,9 @@ namespace NewOS::Detail
}
NewCatalog* catalogDisk =
- this->fNewFS->GetParser()->GetCatalog("/Mount/This Disk");
+ this->fNewFS->GetParser()->GetCatalog("\\Mount\\C:\\");
- const NewOS::Char* cSrcName = "DiskInfo";
+ const NewOS::Char* cSrcName = "DISK-INF";
if (catalogDisk)
{
@@ -128,16 +129,16 @@ namespace NewOS::Detail
else
{
catalogDisk =
- (NewCatalog*)this->Leak()->CreateAlias("/Mount/This Disk");
+ (NewCatalog*)this->Leak()->CreateAlias("\\Mount\\C:\\");
NewOS::StringView diskFolder(kNewFSSectorSz);
diskFolder +=
"<p>Kind: alias to disk</p>\r<p>Created by: system</p>\r<p>Edited "
"by: "
- "system</p>\r<p>Volume Type: New OS Standard</p>\r";
+ "system</p>\r<p>Volume Type: s10 Filesystem</p>\r";
- diskFolder += "<p>Original Path: ";
+ diskFolder += "<p>Root: ";
diskFolder += NewOS::NewFilesystemHelper::Root();
diskFolder += "</p>\r";
@@ -157,56 +158,50 @@ namespace NewOS::Detail
fNewFS->GetParser()->CreateFork(catalogDisk, theDiskFork);
fNewFS->GetParser()->WriteCatalog(catalogDisk,
- (NewOS::VoidPtr)diskFolder.CData(),
- kNewFSSectorSz, cSrcName);
+ (NewOS::VoidPtr)diskFolder.CData(),
+ kNewFSSectorSz, cSrcName);
delete catalogDisk;
}
}
}
- ~FilesystemWizard()
- {
- delete fNewFS;
- }
+ ~FilesystemInstaller() = default;
- NEWOS_COPY_DEFAULT(FilesystemWizard);
+ NEWOS_COPY_DEFAULT(FilesystemInstaller);
- /// Grab the disk's NewFS reference.
+ /// @brief Grab the disk's NewFS reference.
+ /// @return NewFilesystemManager the filesystem interface
NewOS::NewFilesystemManager* Leak()
{
return fNewFS;
}
};
- /// @brief System loader entrypoint.
+ /// @brief Loads necessary servers for the OS to work.
/// @param void no parameters.
/// @return void no return value.
- STATIC NewOS::Void SystemLauncher_Main(NewOS::Void)
+ STATIC NewOS::Void ke_launch_srv(NewOS::Void)
{
- NewOS::PEFLoader lockScreen("/System/LockScreen");
+ NewOS::PEFLoader secureSrv("\\System\\securesrv.exe");
- if (!lockScreen.IsLoaded())
+ if (!secureSrv.IsLoaded())
{
NewOS::ke_stop(RUNTIME_CHECK_FAILED);
}
- NewOS::Utils::execute_from_image(lockScreen,
+ NewOS::Utils::execute_from_image(secureSrv,
NewOS::ProcessHeader::kAppKind);
- NewOS::PEFLoader stageBoard("/System/StageBoard");
+ NewOS::PEFLoader uiSrv("\\System\\uisrv.exe");
- if (!stageBoard.IsLoaded())
+ if (!uiSrv.IsLoaded())
{
NewOS::ke_stop(RUNTIME_CHECK_FAILED);
}
- NewOS::Utils::execute_from_image(stageBoard,
+ NewOS::Utils::execute_from_image(uiSrv,
NewOS::ProcessHeader::kAppKind);
-
- NewOS::kcout << "SystemLauncher: done, sleeping...";
-
- while (true) {}
}
} // namespace NewOS::Detail
@@ -216,13 +211,17 @@ namespace NewOS::Detail
EXTERN_C NewOS::Void KeMain(NewOS::Void)
{
/// Now run kernel loop, until no process are running.
- NewOS::Detail::FilesystemWizard wizard; // automatic.
+ NewOS::Detail::FilesystemInstaller installer; // automatic filesystem creation.
- auto cLoaderName = "SystemLauncher";
- NewOS::execute_from_image(NewOS::Detail::SystemLauncher_Main, cLoaderName);
+ NewOS::Detail::ke_launch_srv();
+
+ // fetch system cores.
+ NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr);
- while (true)
+ // spin forever.
+ while (Yes)
{
- NewOS::ProcessScheduler::The().Leak().Run();
+ // start scheduling.
+ NewOS::ProcessHelper::StartScheduling();
}
}
diff --git a/Kernel/Sources/KernelHeap.cxx b/Kernel/Sources/KernelHeap.cxx
index 00dfce8c..c3e8e86b 100644
--- a/Kernel/Sources/KernelHeap.cxx
+++ b/Kernel/Sources/KernelHeap.cxx
@@ -76,8 +76,8 @@ namespace NewOS
}
/// @brief Makes a page heap.
- /// @param heapPtr
- /// @return
+ /// @param heapPtr
+ /// @return
Int32 ke_make_ke_page(VoidPtr heapPtr)
{
if (kHeapCount < 1)
diff --git a/Kernel/Sources/Network/NetworkDevice.cxx b/Kernel/Sources/Network/NetworkDevice.cxx
index 511246c7..027613ac 100644
--- a/Kernel/Sources/Network/NetworkDevice.cxx
+++ b/Kernel/Sources/Network/NetworkDevice.cxx
@@ -5,11 +5,31 @@
------------------------------------------- */
#include <NetworkKit/NetworkDevice.hpp>
+#include <NewKit/Utils.hpp>
namespace NewOS
{
+ /// \brief Getter for fNetworkName.
const char* NetworkDevice::Name() const
{
- return "NetworkDevice";
+ return this->fNetworkName;
+ }
+
+ /// \brief Setter for fNetworkName.
+ Boolean NetworkDevice::Name(const char* strView)
+ {
+ if (strView == nullptr)
+ return false;
+
+ if (*strView == 0)
+ return false;
+
+ if (rt_string_len(strView) > cNetworkNameLen)
+ return false;
+
+ rt_copy_memory((VoidPtr)strView,
+ (VoidPtr)this->fNetworkName, rt_string_len(strView));
+
+ return true;
}
} // namespace NewOS
diff --git a/Kernel/Sources/PEFSharedObject.cxx b/Kernel/Sources/PEFSharedObject.cxx
index 5103e075..0d5949f1 100644
--- a/Kernel/Sources/PEFSharedObject.cxx
+++ b/Kernel/Sources/PEFSharedObject.cxx
@@ -41,7 +41,7 @@ EXTERN_C SharedObjectPtr rt_library_init(void)
if (!library)
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return nullptr;
}
@@ -50,17 +50,17 @@ EXTERN_C SharedObjectPtr rt_library_init(void)
if (!library->Get())
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return nullptr;
}
library->Get()->fImageObject =
- ProcessScheduler::The().Leak().GetCurrent().Leak().Image;
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Image;
if (!library->Get()->fImageObject)
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return nullptr;
}
@@ -85,7 +85,7 @@ EXTERN_C Void rt_library_free(SharedObjectPtr lib, bool* successful)
if (lib == nullptr)
{
*successful = false;
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
delete lib->Get();
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index 08a7971e..aae69386 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -18,7 +18,7 @@
///! BUGS: 0
/***********************************************************************************/
-/* This file handles the process scheduling.
+/* This file handles the process scheduling. */
/***********************************************************************************/
namespace NewOS
@@ -42,14 +42,10 @@ namespace NewOS
void ProcessHeader::Crash()
{
- kcout << this->Name << ": crashed. (id = " << number(kErrorProcessFault);
+ kcout << (*this->Name == 0 ? "Unknown" : this->Name) << ": crashed. (id = ";
+ kcout.Number(kErrorProcessFault);
kcout << ")\r";
- if (this->Ring != kRingUserKind)
- {
- MUST_PASS(ke_bug_check());
- }
-
this->Exit(kErrorProcessFault);
}
@@ -63,18 +59,20 @@ namespace NewOS
VoidPtr ProcessHeader::New(const SizeT& sz)
{
- if (this->FreeMemory < 1)
+ if (this->HeapCursor)
{
- DbgLastError() = kErrorHeapOutOfMemory;
- this->Crash(); /// out of memory.
+ if (this->FreeMemory < 1)
+ {
+ DbgLastError() = kErrorHeapOutOfMemory;
+
+ /* we're going out of memory */
+ this->Crash();
- return nullptr;
- }
+ return nullptr;
+ }
- if (this->HeapCursor)
- {
- VoidPtr ptr = this->HeapCursor;
this->HeapCursor = (VoidPtr)((UIntPtr)this->HeapCursor + (sizeof(sz)));
+ VoidPtr ptr = this->HeapCursor;
++this->UsedMemory;
--this->FreeMemory;
@@ -163,27 +161,11 @@ namespace NewOS
void ProcessHeader::Exit(Int32 exit_code)
{
if (this->ProcessId !=
- ProcessScheduler::The().Leak().GetCurrent().Leak().ProcessId)
- ke_stop(RUNTIME_CHECK_PROCESS);
-
- if (this->Ring == (Int32)ProcessSelector::kRingKernel &&
- ProcessScheduler::The().Leak().GetCurrent().Leak().Ring > 0)
+ ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId)
ke_stop(RUNTIME_CHECK_PROCESS);
kLastExitCode = exit_code;
- if (this->Ring != (Int32)ProcessSelector::kRingDriver)
- {
- if (this->HeapPtr)
- rt_free_heap(this->HeapPtr);
-
- this->HeapPtr = nullptr;
- this->HeapCursor = nullptr;
-
- this->FreeMemory = 0UL;
- this->UsedMemory = 0UL;
- }
-
//! Delete image if not done already.
if (this->Image)
ke_delete_ke_heap(this->Image);
@@ -201,9 +183,6 @@ namespace NewOS
/// @return
SizeT ProcessScheduler::Add(Ref<ProcessHeader>& process)
{
- if (!process)
- return -1;
-
if (!process.Leak().Image)
{
if (process.Leak().Kind != ProcessHeader::kShLibKind)
@@ -212,7 +191,7 @@ namespace NewOS
}
}
- if (!mTeam.AsArray().Count() > kSchedProcessLimitPerTeam)
+ if (mTeam.AsArray().Count() > kSchedProcessLimitPerTeam)
return -kErrorOutOfTeamSlot;
kcout << "ProcessScheduler::Add(Ref<ProcessHeader>& process)\r";
@@ -229,12 +208,14 @@ namespace NewOS
ke_new_ke_heap(sizeof(HAL::StackFrame), true, false));
MUST_PASS(process.Leak().StackFrame);
+
+ process.Leak().Status = ProcessStatus::kRunning;
- mTeam.AsArray().Add(process);
-
- process.Leak().ProcessId = mTeam.AsArray().Count() - 1;
+ process.Leak().ProcessId = (mTeam.AsArray().Count() - 1);
process.Leak().HeapCursor = process.Leak().HeapPtr;
+ mTeam.AsArray().Add(process);
+
return mTeam.AsArray().Count() - 1;
}
@@ -255,17 +236,14 @@ namespace NewOS
/// @return
SizeT ProcessScheduler::Run() noexcept
{
- SizeT processIndex = 0; //! we store this guy to tell the scheduler how many
+ SizeT process_index = 0; //! we store this guy to tell the scheduler how many
//! things we have scheduled.
- for (; processIndex < mTeam.AsArray().Count(); ++processIndex)
+ for (; process_index < mTeam.AsArray().Count(); ++process_index)
{
- auto process = mTeam.AsArray()[processIndex];
-
- MUST_PASS(process); //! no need for a MUST_PASS(process.Leak());, it is
- //! recursive because of the nature of the class;
+ auto process = mTeam.AsArray()[process_index];
- //! run any process needed to be scheduled.
+ //! check if process needs to be scheduled.
if (ProcessHelper::CanBeScheduled(process.Leak()))
{
auto unwrapped_process = *process.Leak();
@@ -278,6 +256,8 @@ namespace NewOS
// tell helper to find a core to schedule on.
ProcessHelper::Switch(mTeam.AsRef().Leak().StackFrame,
mTeam.AsRef().Leak().ProcessId);
+
+ kcout << unwrapped_process.Name << ": process switched.\r";
}
else
{
@@ -286,7 +266,7 @@ namespace NewOS
}
}
- return processIndex;
+ return process_index;
}
/// @brief Gets the current scheduled team.
@@ -306,17 +286,17 @@ namespace NewOS
/// @brief Gets current running process.
/// @return
- Ref<ProcessHeader>& ProcessScheduler::GetCurrent()
+ Ref<ProcessHeader>& ProcessScheduler::TheCurrent()
{
return mTeam.AsRef();
}
/// @brief Current proccess id getter.
/// @return Process ID integer.
- PID& ProcessHelper::GetCurrentPID()
+ PID& ProcessHelper::TheCurrentPID()
{
- kcout << "ProcessHelper::GetCurrentPID: Leaking ProcessId...\r";
- return ProcessScheduler::The().Leak().GetCurrent().Leak().ProcessId;
+ kcout << "ProcessHelper::TheCurrentPID: Leaking ProcessId...\r";
+ return ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId;
}
/// @brief Check if process can be schedulded.
@@ -349,26 +329,12 @@ namespace NewOS
* @brief Spin scheduler class.
*/
- bool ProcessHelper::StartScheduling()
+ SizeT ProcessHelper::StartScheduling()
{
- if (ProcessHelper::CanBeScheduled(
- ProcessScheduler::The().Leak().GetCurrent()))
- {
- --ProcessScheduler::The().Leak().GetCurrent().Leak().PTime;
- return false;
- }
-
- auto processRef = ProcessScheduler::The().Leak();
+ auto& process_ref = ProcessScheduler::The().Leak();
+ SizeT ret = process_ref.Run();
- if (!processRef)
- return false; // we have nothing to schedule. simply return.
-
- SizeT ret = processRef.Run();
-
- kcout << StringBuilder::FromInt(
- "ProcessHelper::StartScheduling() Iterated over {%} jobs inside team.\r", ret);
-
- return true;
+ return ret;
}
/**
@@ -384,30 +350,42 @@ namespace NewOS
for (SizeT index = 0UL; index < SMPManager::The().Leak().Count(); ++index)
{
- if (SMPManager::The().Leak()[index].Leak().Kind() == kInvalidHart)
+ if (SMPManager::The().Leak()[index].Leak()->Kind() == kInvalidHart)
continue;
- if (SMPManager::The().Leak()[index].Leak().StackFrame() == the_stack)
+ if (SMPManager::The().Leak()[index].Leak()->StackFrame() == the_stack)
{
- SMPManager::The().Leak()[index].Leak().Busy(false);
+ SMPManager::The().Leak()[index].Leak()->Busy(false);
continue;
}
- if (SMPManager::The().Leak()[index].Leak().IsBusy())
+ if (SMPManager::The().Leak()[index].Leak()->IsBusy())
continue;
- if (SMPManager::The().Leak()[index].Leak().Kind() !=
+ if (SMPManager::The().Leak()[index].Leak()->Kind() !=
ThreadKind::kHartBoot &&
- SMPManager::The().Leak()[index].Leak().Kind() !=
+ SMPManager::The().Leak()[index].Leak()->Kind() !=
ThreadKind::kHartSystemReserved)
{
- SMPManager::The().Leak()[index].Leak().Busy(true);
- ProcessHelper::GetCurrentPID() = new_pid;
+ SMPManager::The().Leak()[index].Leak()->Busy(true);
+ ProcessHelper::TheCurrentPID() = new_pid;
- return SMPManager::The().Leak()[index].Leak().Switch(the_stack);
+ return SMPManager::The().Leak()[index].Leak()->Switch(the_stack);
}
}
return false;
}
+
+ /// @brief this checks if any process is on the team.
+ ProcessScheduler::operator bool()
+ {
+ return mTeam.AsArray().Count() > 0;
+ }
+
+ /// @brief this checks if no process is on the team.
+ bool ProcessScheduler::operator!()
+ {
+ return mTeam.AsArray().Count() == 0;
+ }
} // namespace NewOS
diff --git a/Kernel/Sources/Property.cxx b/Kernel/Sources/Property.cxx
index dca34429..b58de469 100644
--- a/Kernel/Sources/Property.cxx
+++ b/Kernel/Sources/Property.cxx
@@ -8,6 +8,14 @@
namespace NewOS
{
+ Property::Property(const StringView& sw)
+ : fName(sw)
+ {
+ kcout << "Property: created: " << sw.CData() << endl;
+ }
+
+ Property::~Property() = default;
+
bool Property::StringEquals(StringView& name)
{
return fName && this->fName == name;
diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx
index f0b680ce..149b1334 100644
--- a/Kernel/Sources/SMPManager.cxx
+++ b/Kernel/Sources/SMPManager.cxx
@@ -85,39 +85,29 @@ namespace NewOS
bool HardwareThread::Switch(HAL::StackFramePtr stack)
{
if (!rt_check_stack(stack))
- return false;
-
- if (!fStack)
- {
- fStack = stack;
- }
- else
{
- /// Keep the arguments, switch the base pointer, stack pointer
- /// fs and gs registers.
- fStack->Rbp = stack->Rbp;
- fStack->Rsp = stack->Rsp;
- fStack->Fs = stack->Fs;
- fStack->Gs = stack->Gs;
-
- // save global registers.
-
- fStack->R15 = stack->R15;
- fStack->R14 = stack->R14;
+ /// provide 'nullptr' to free the stack frame.
+ if (stack == nullptr)
+ {
+ delete fStack;
+ fStack = nullptr;
- fStack->R13 = stack->R13;
- fStack->R12 = stack->R12;
- fStack->R11 = stack->R11;
+ return true;
+ }
- fStack->R10 = stack->R10;
- fStack->R9 = stack->R9;
- fStack->R8 = stack->R8;
+ return false;
+ }
- fStack->Exception = this->fID;
+ if (fStack)
+ {
+ delete fStack;
+ fStack = nullptr;
}
+
+ fStack = stack;
rt_do_context_switch(fStack);
-
+
return true;
}
@@ -143,12 +133,12 @@ namespace NewOS
}
/// @brief Get Stack Frame of Core
- HAL::StackFramePtr SMPManager::GetStackFrame() noexcept
+ HAL::StackFramePtr SMPManager::Leak() noexcept
{
if (fThreadList[fCurrentThread].Leak() &&
- ProcessHelper::GetCurrentPID() ==
- fThreadList[fCurrentThread].Leak().Leak().fPID)
- return fThreadList[fCurrentThread].Leak().Leak().fStack;
+ ProcessHelper::TheCurrentPID() ==
+ fThreadList[fCurrentThread].Leak().Leak()->fPID)
+ return fThreadList[fCurrentThread].Leak().Leak()->fStack;
return nullptr;
}
@@ -163,35 +153,35 @@ namespace NewOS
{
// stack != nullptr -> if core is used, then continue.
if (!fThreadList[idx].Leak() ||
- !fThreadList[idx].Leak().Leak().IsWakeup() ||
- fThreadList[idx].Leak().Leak().IsBusy())
+ !fThreadList[idx].Leak().Leak()->IsWakeup() ||
+ fThreadList[idx].Leak().Leak()->IsBusy())
continue;
// to avoid any null deref.
- if (!fThreadList[idx].Leak().Leak().fStack)
+ if (!fThreadList[idx].Leak().Leak()->fStack)
continue;
- if (fThreadList[idx].Leak().Leak().fStack->Rsp == 0)
+ if (fThreadList[idx].Leak().Leak()->fStack->Rsp == 0)
continue;
- if (fThreadList[idx].Leak().Leak().fStack->Rbp == 0)
+ if (fThreadList[idx].Leak().Leak()->fStack->Rbp == 0)
continue;
- fThreadList[idx].Leak().Leak().Busy(true);
+ fThreadList[idx].Leak().Leak()->Busy(true);
- fThreadList[idx].Leak().Leak().fID = idx;
+ fThreadList[idx].Leak().Leak()->fID = idx;
/// I figured out this:
/// Allocate stack
/// Set APIC base to stack
/// Do stuff and relocate stack based on this code.
/// - Amlel
- rt_copy_memory(stack, fThreadList[idx].Leak().Leak().fStack,
+ rt_copy_memory(stack, fThreadList[idx].Leak().Leak()->fStack,
sizeof(HAL::StackFrame));
- fThreadList[idx].Leak().Leak().Switch(fThreadList[idx].Leak().Leak().fStack);
+ fThreadList[idx].Leak().Leak()->Switch(fThreadList[idx].Leak().Leak()->fStack);
- fThreadList[idx].Leak().Leak().fPID = ProcessHelper::GetCurrentPID();
+ fThreadList[idx].Leak().Leak()->fPID = ProcessHelper::TheCurrentPID();
- fThreadList[idx].Leak().Leak().Busy(false);
+ fThreadList[idx].Leak().Leak()->Busy(false);
return true;
}
@@ -204,19 +194,25 @@ namespace NewOS
* @param idx the index
* @return the reference to the hardware thread.
*/
- Ref<HardwareThread> SMPManager::operator[](const SizeT& idx)
+ Ref<HardwareThread*> SMPManager::operator[](const SizeT& idx)
{
if (idx == 0)
{
- if (fThreadList[idx].Leak().Leak().Kind() != kHartSystemReserved)
+ if (fThreadList[idx].Leak().Leak()->Kind() != kHartSystemReserved)
{
- fThreadList[idx].Leak().Leak().fKind = kHartBoot;
+ fThreadList[idx].Leak().Leak()->fKind = kHartBoot;
}
}
else if (idx >= kMaxHarts)
{
- HardwareThread fakeThread;
- fakeThread.fKind = kInvalidHart;
+ static HardwareThread* fakeThread = new HardwareThread();
+
+ if (!fakeThread)
+ {
+ fakeThread = new HardwareThread();
+ }
+
+ fakeThread->fKind = kInvalidHart;
return {fakeThread};
}
diff --git a/Kernel/Sources/String.cxx b/Kernel/Sources/String.cxx
index 08ca1036..fab12226 100644
--- a/Kernel/Sources/String.cxx
+++ b/Kernel/Sources/String.cxx
@@ -15,7 +15,7 @@ namespace NewOS
return fData;
}
- const Char* StringView::CData()
+ const Char* StringView::CData() const
{
return fData;
}
diff --git a/Kernel/Sources/ThreadLocalStorage.cxx b/Kernel/Sources/ThreadLocalStorage.cxx
index c292d078..4d6fec14 100644
--- a/Kernel/Sources/ThreadLocalStorage.cxx
+++ b/Kernel/Sources/ThreadLocalStorage.cxx
@@ -44,14 +44,16 @@ Boolean tls_check_tib(ThreadInformationBlock* tib)
* @param stackPtr The call frame.
* @return
*/
-EXTERN_C Void tls_check_syscall_impl(NewOS::HAL::StackFramePtr stackPtr) noexcept
+EXTERN_C Void tls_check_syscall_impl(NewOS::VoidPtr TIB) noexcept
{
- ThreadInformationBlock* tib = (ThreadInformationBlock*)stackPtr->Gs;
+ if (!TIB) return;
+
+ ThreadInformationBlock* tib = (ThreadInformationBlock*)TIB;
if (!tls_check_tib(tib))
{
kcout << "newoskrnl: Verification failed, Crashing...\r";
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
kcout << "newoskrnl: Verification succeeded! Keeping on...\r";
diff --git a/Kernel/Sources/UserHeap.cxx b/Kernel/Sources/UserHeap.cxx
index ad3c4aa4..f20e30f8 100644
--- a/Kernel/Sources/UserHeap.cxx
+++ b/Kernel/Sources/UserHeap.cxx
@@ -37,8 +37,8 @@ namespace NewOS
*/
class UserHeapManager final
{
- UserHeapManager() = delete;
-
+ UserHeapManager() = delete;
+
public:
~UserHeapManager() = default;
@@ -47,12 +47,12 @@ namespace NewOS
{
return s_NumPools;
}
-
+
STATIC Ref<Pmm>& Leak()
{
return s_Pmm;
}
-
+
STATIC Boolean& IsEnabled()
{
return s_PoolsAreEnabled;
@@ -150,7 +150,7 @@ namespace NewOS
{
if (!poolHdr->fFree)
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return;
}