summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKAKit/src
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-21 08:50:57 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-21 08:51:40 +0100
commit6ed8a39c1bd3083297b41e981a2bf4bdbe2abd1f (patch)
tree183713eb331a92e4e1ce061263cf91a208c7c400 /dev/ZKAKit/src
parent50439432a85976605dbb18e3cd2161f888d2e17d (diff)
IMP: Add UserProcessImage structure to hold the code/entrypoint of the process.
IMP: Use IDLLObject instead of IPEFDLLObject. IMP: Refactor DeviceInterface to IDeviceObject. ADD: rt_jump_to_address when you want to use a custom stack. Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKAKit/src')
-rw-r--r--dev/ZKAKit/src/CodeMgr.cc14
-rw-r--r--dev/ZKAKit/src/DriveMgr.cc5
-rw-r--r--dev/ZKAKit/src/IPEFDLLObject.cc2
-rw-r--r--dev/ZKAKit/src/KString.cc6
-rw-r--r--dev/ZKAKit/src/PEFCodeMgr.cc6
-rw-r--r--dev/ZKAKit/src/Stop.cc4
-rw-r--r--dev/ZKAKit/src/Storage/AHCIDeviceInterface.cc2
-rw-r--r--dev/ZKAKit/src/Storage/ATADeviceInterface.cc6
-rw-r--r--dev/ZKAKit/src/Storage/NVMEDeviceInterface.cc2
-rw-r--r--dev/ZKAKit/src/UserProcessScheduler.cc45
10 files changed, 35 insertions, 57 deletions
diff --git a/dev/ZKAKit/src/CodeMgr.cc b/dev/ZKAKit/src/CodeMgr.cc
index 5b5d471b..a4502f58 100644
--- a/dev/ZKAKit/src/CodeMgr.cc
+++ b/dev/ZKAKit/src/CodeMgr.cc
@@ -16,16 +16,14 @@ namespace Kernel
/// @return if the process was started or not.
ProcessID rtl_create_process(MainKind main, const Char* process_name) noexcept
{
- kcout << "Validating process header...\r";
-
- if (!main)
- return No;
+ if (!main ||
+ !process_name ||
+ *process_name == 0)
+ return kProcessInvalidID;
UserProcess* process_hdr = new UserProcess();
- kcout << "Setting-up process data...\r";
-
- process_hdr->Code = reinterpret_cast<VoidPtr>(main);
+ process_hdr->Image.fCode = reinterpret_cast<VoidPtr>(main);
process_hdr->Kind = UserProcess::kExectuableKind;
process_hdr->StackSize = kib_cast(16);
@@ -33,8 +31,6 @@ namespace Kernel
ProcessID id = UserProcessScheduler::The().Spawn(process_hdr);
- delete process_hdr;
-
return id;
}
} // namespace Kernel
diff --git a/dev/ZKAKit/src/DriveMgr.cc b/dev/ZKAKit/src/DriveMgr.cc
index 024d1d76..b609c2f7 100644
--- a/dev/ZKAKit/src/DriveMgr.cc
+++ b/dev/ZKAKit/src/DriveMgr.cc
@@ -145,7 +145,7 @@ namespace Kernel
trait.fInit = io_drv_unimplemented;
trait.fDriveKind = io_drv_kind;
- kcout << "Construct: " << trait.fName << ".\r";
+ kcout << "Construct: " << trait.fName << "\r";
return trait;
}
@@ -206,9 +206,6 @@ namespace Kernel
Detail::ioi_detect_drive(&trait);
- while (YES)
- ;
-
return trait;
}
} // namespace Kernel
diff --git a/dev/ZKAKit/src/IPEFDLLObject.cc b/dev/ZKAKit/src/IPEFDLLObject.cc
index fb9ef7f0..b72421d8 100644
--- a/dev/ZKAKit/src/IPEFDLLObject.cc
+++ b/dev/ZKAKit/src/IPEFDLLObject.cc
@@ -60,7 +60,7 @@ EXTERN_C IDLL rtl_init_dll(UserProcess* header)
}
dll_obj->Get()->fImageObject =
- header->ExecImg;
+ header->Image.fBlob;
if (!dll_obj->Get()->fImageObject)
{
diff --git a/dev/ZKAKit/src/KString.cc b/dev/ZKAKit/src/KString.cc
index aa287f15..767bf4c2 100644
--- a/dev/ZKAKit/src/KString.cc
+++ b/dev/ZKAKit/src/KString.cc
@@ -100,7 +100,7 @@ namespace Kernel
return ("?");
const Char* boolean_expr = i ? "YES" : "NO";
- char* ret = (char*)cAlloca((sizeof(char) * i) ? 4 : 5 + rt_string_len(fmt));
+ Char* ret = (Char*)rtl_alloca((sizeof(char) * i) ? 4 : 5 + rt_string_len(fmt));
if (!ret)
return ("?");
@@ -159,8 +159,8 @@ namespace Kernel
if (!fmt || !fmt2)
return ("?");
- char* ret =
- (char*)cAlloca(sizeof(char) * rt_string_len(fmt2) + rt_string_len(fmt));
+ Char* ret =
+ (Char*)rtl_alloca(sizeof(char) * rt_string_len(fmt2) + rt_string_len(fmt));
if (!ret)
return ("?");
diff --git a/dev/ZKAKit/src/PEFCodeMgr.cc b/dev/ZKAKit/src/PEFCodeMgr.cc
index 0568b998..0a787e57 100644
--- a/dev/ZKAKit/src/PEFCodeMgr.cc
+++ b/dev/ZKAKit/src/PEFCodeMgr.cc
@@ -251,13 +251,13 @@ namespace Kernel
auto errOrStart = exec.FindStart();
if (errOrStart.Error() != kErrorSuccess)
- return No;
+ return kProcessInvalidID;
STATIC UserProcess proc;
proc.Kind = procKind;
- proc.ExecImg = errOrStart.Leak().Leak();
- proc.ExecImg = exec.GetBlob().Leak().Leak();
+ proc.Image.fCode = errOrStart.Leak().Leak();
+ proc.Image.fBlob = exec.GetBlob().Leak().Leak();
proc.StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData);
proc.MemoryLimit = *(UIntPtr*)exec.FindSymbol(kPefHeapSizeSymbol, kPefData);
proc.PTime = 0UL;
diff --git a/dev/ZKAKit/src/Stop.cc b/dev/ZKAKit/src/Stop.cc
index 1374c842..391449d6 100644
--- a/dev/ZKAKit/src/Stop.cc
+++ b/dev/ZKAKit/src/Stop.cc
@@ -14,7 +14,7 @@
#include <Modules/FB/FB.h>
#include <Modules/FB/Text.h>
-#define kWebsiteURL "https://www.el-mahrouss-logic.com/zka-os/help/"
+#define kWebsiteURL "https://www.el-mahrouss-logic.com/metal-os/help/"
/* Each error code is attributed with an ID, which will prompt a string onto the
* screen. Wait for debugger... */
@@ -31,7 +31,7 @@ namespace Kernel
auto panic_text = RGB(0xff, 0xff, 0xff);
- auto start_y = 30;
+ auto start_y = 50;
auto x = 10;
CGDrawString("Kernel Panic!", start_y, x, panic_text);
diff --git a/dev/ZKAKit/src/Storage/AHCIDeviceInterface.cc b/dev/ZKAKit/src/Storage/AHCIDeviceInterface.cc
index 9a591aaf..34b436e7 100644
--- a/dev/ZKAKit/src/Storage/AHCIDeviceInterface.cc
+++ b/dev/ZKAKit/src/Storage/AHCIDeviceInterface.cc
@@ -15,7 +15,7 @@ using namespace Kernel;
AHCIDeviceInterface::AHCIDeviceInterface(void (*Out)(MountpointInterface* outpacket),
void (*In)(MountpointInterface* inpacket),
void (*Cleanup)(void))
- : DeviceInterface(Out, In), fCleanup(Cleanup)
+ : IDeviceObject(Out, In), fCleanup(Cleanup)
{
}
diff --git a/dev/ZKAKit/src/Storage/ATADeviceInterface.cc b/dev/ZKAKit/src/Storage/ATADeviceInterface.cc
index 9d23894d..e80dd533 100644
--- a/dev/ZKAKit/src/Storage/ATADeviceInterface.cc
+++ b/dev/ZKAKit/src/Storage/ATADeviceInterface.cc
@@ -16,7 +16,7 @@ ATADeviceInterface::ATADeviceInterface(
void (*Out)(MountpointInterface* outpacket),
void (*In)(MountpointInterface* inpacket),
void (*Cleanup)(void))
- : DeviceInterface(Out, In), fCleanup(Cleanup)
+ : IDeviceObject(Out, In), fCleanup(Cleanup)
{
}
@@ -57,7 +57,7 @@ ATADeviceInterface& ATADeviceInterface::operator<<(MountpointInterface* Data)
}
}
- return (ATADeviceInterface&)DeviceInterface<MountpointInterface*>::operator<<(
+ return (ATADeviceInterface&)IDeviceObject<MountpointInterface*>::operator<<(
Data);
}
@@ -83,6 +83,6 @@ ATADeviceInterface& ATADeviceInterface::operator>>(MountpointInterface* Data)
}
}
- return (ATADeviceInterface&)DeviceInterface<MountpointInterface*>::operator>>(
+ return (ATADeviceInterface&)IDeviceObject<MountpointInterface*>::operator>>(
Data);
}
diff --git a/dev/ZKAKit/src/Storage/NVMEDeviceInterface.cc b/dev/ZKAKit/src/Storage/NVMEDeviceInterface.cc
index 89ce4fb2..860c0a95 100644
--- a/dev/ZKAKit/src/Storage/NVMEDeviceInterface.cc
+++ b/dev/ZKAKit/src/Storage/NVMEDeviceInterface.cc
@@ -11,7 +11,7 @@ namespace Kernel
NVMEDeviceInterface::NVMEDeviceInterface(void (*out)(MountpointInterface* outpacket),
void (*in)(MountpointInterface* inpacket),
void (*cleanup)(void))
- : DeviceInterface(out, in), fCleanup(cleanup)
+ : IDeviceObject(out, in), fCleanup(cleanup)
{
}
diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc
index 8694b449..79e07385 100644
--- a/dev/ZKAKit/src/UserProcessScheduler.cc
+++ b/dev/ZKAKit/src/UserProcessScheduler.cc
@@ -40,11 +40,7 @@ namespace Kernel
STATIC UserProcessScheduler kProcessScheduler;
- UserProcess::UserProcess(VoidPtr start_image)
- : Code(start_image)
- {
- }
-
+ UserProcess::UserProcess() = default;
UserProcess::~UserProcess() = default;
/// @brief Gets the last exit code.
@@ -278,23 +274,24 @@ namespace Kernel
HAL::mm_free_bitmap(this->VMRegister);
//! Delete image if not done already.
- if (this->Code && mm_is_valid_heap(this->Code))
- mm_delete_heap(this->Code);
+ if (this->Image.fCode && mm_is_valid_heap(this->Image.fCode))
+ mm_delete_heap(this->Image.fCode);
- if (this->ExecImg && mm_is_valid_heap(this->ExecImg))
- mm_delete_heap(this->ExecImg);
+ if (this->Image.fBlob && mm_is_valid_heap(this->Image.fBlob))
+ mm_delete_heap(this->Image.fBlob);
if (this->StackFrame && mm_is_valid_heap(this->StackFrame))
mm_delete_heap((VoidPtr)this->StackFrame);
- this->ExecImg = nullptr;
- this->Code = nullptr;
+ this->Image.fBlob = nullptr;
+ this->Image.fCode = nullptr;
this->StackFrame = nullptr;
if (this->Kind == kExectuableDLLKind)
{
Bool success = false;
- rtl_fini_dll(this, this->PefDLLDelegate, &success);
+
+ rtl_fini_dll(this, reinterpret_cast<IPEFDLLObject*>(this->PefDLLDelegate), &success);
if (!success)
{
@@ -318,10 +315,10 @@ namespace Kernel
ProcessID UserProcessScheduler::Spawn(UserProcess* process)
{
- if (*process->Name == 0)
+ if (!process ||
+ *process->Name == 0)
{
- Char process_name[] = "Process (Unnamed)";
- rt_copy_memory((VoidPtr)process_name, process->Name, rt_string_len(process_name));
+ return kProcessInvalidID;
}
#ifdef __ZKA_AMD64__
@@ -391,7 +388,6 @@ namespace Kernel
UserProcessScheduler& UserProcessScheduler::The()
{
- kcout << "Return user scheduler object.\r";
return kProcessScheduler;
}
@@ -466,7 +462,7 @@ namespace Kernel
kcout << "Switch to '" << process.Name << "'.\r";
// tell helper to find a core to schedule on.
- if (!UserProcessHelper::Switch(process.Code, &process.StackReserve[process.StackSize - 1], process.StackFrame,
+ if (!UserProcessHelper::Switch(process.Image.fCode, &process.StackReserve[process.StackSize - 1], process.StackFrame,
process.ProcessId))
{
process.Crash();
@@ -522,7 +518,7 @@ namespace Kernel
if (process.Status == ProcessStatusKind::kInvalid)
return No;
- if (!process.Code)
+ if (!process.Image.fCode)
return No;
return process.PTime < 1;
@@ -537,17 +533,7 @@ namespace Kernel
{
return kProcessScheduler.Run();
}
-
- /***********************************************************************************/
- /**
- * @brief Initializes the scheduler.
- */
- /***********************************************************************************/
- Void UserProcessHelper::InitScheduler()
- {
- /// TODO: code to init scheduler here.
- }
-
+
/***********************************************************************************/
/**
* \brief Does a context switch in a CPU.
@@ -588,7 +574,6 @@ namespace Kernel
////////////////////////////////////////////////////////////
/// Rollback on fail. ///
////////////////////////////////////////////////////////////
- ///
if (!ret)
{
HardwareThreadScheduler::The()[index].Leak()->fPTime = prev_ptime;