summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKAKit/src
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-20 21:01:31 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-20 21:01:31 +0100
commit50439432a85976605dbb18e3cd2161f888d2e17d (patch)
tree12a30d88888f407e84634badef430d321cd1f4c6 /dev/ZKAKit/src
parent745cc52b11190689a3f42b936978a5c03a410b9a (diff)
IMP: AHCI-DMA: driver improvements, does complete read now (although nothing returns).
ReadMe.md: Update git ssh link. HWTS: Refactor class. DriveMgr: Lots of improvements inside the API. CUSA: Refactor scheduler API too.
Diffstat (limited to 'dev/ZKAKit/src')
-rw-r--r--dev/ZKAKit/src/CodeMgr.cc15
-rw-r--r--dev/ZKAKit/src/DriveMgr.cc70
-rw-r--r--dev/ZKAKit/src/HardwareThreadScheduler.cc2
-rw-r--r--dev/ZKAKit/src/PEFCodeMgr.cc2
-rw-r--r--dev/ZKAKit/src/UserProcessScheduler.cc39
-rw-r--r--dev/ZKAKit/src/Utils.cc5
6 files changed, 79 insertions, 54 deletions
diff --git a/dev/ZKAKit/src/CodeMgr.cc b/dev/ZKAKit/src/CodeMgr.cc
index 08f4976d..5b5d471b 100644
--- a/dev/ZKAKit/src/CodeMgr.cc
+++ b/dev/ZKAKit/src/CodeMgr.cc
@@ -21,18 +21,19 @@ namespace Kernel
if (!main)
return No;
- static UserProcess proc;
+ UserProcess* process_hdr = new UserProcess();
kcout << "Setting-up process data...\r";
- proc.Code = reinterpret_cast<VoidPtr>(main);
- proc.Kind = UserProcess::kExectuableKind;
- proc.StackSize = kib_cast(16);
+ process_hdr->Code = reinterpret_cast<VoidPtr>(main);
+ process_hdr->Kind = UserProcess::kExectuableKind;
+ process_hdr->StackSize = kib_cast(16);
- rt_set_memory(proc.Name, 0, kProcessNameLen);
- rt_copy_memory((VoidPtr)process_name, proc.Name, rt_string_len(process_name));
+ rt_set_memory(process_hdr->Name, 0, kProcessNameLen);
- ProcessID id = UserProcessScheduler::The().Add(&proc);
+ ProcessID id = UserProcessScheduler::The().Spawn(process_hdr);
+
+ delete process_hdr;
return id;
}
diff --git a/dev/ZKAKit/src/DriveMgr.cc b/dev/ZKAKit/src/DriveMgr.cc
index c79e0948..024d1d76 100644
--- a/dev/ZKAKit/src/DriveMgr.cc
+++ b/dev/ZKAKit/src/DriveMgr.cc
@@ -33,9 +33,9 @@ namespace Kernel
}
#ifdef __AHCI__
- drv_std_read(pckt->fLba, (Char*)pckt->fPacketContent.Leak(), kAHCISectorSize, pckt->fPacketSize);
+ drv_std_read(pckt->fLba, (Char*)pckt->fPacketContent, kAHCISectorSize, pckt->fPacketSize);
#elif defined(__ATA_PIO__) || defined(__ATA_DMA__)
- drv_std_read(pckt->fLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent.Leak(), kATASectorSize, pckt->fPacketSize);
+ drv_std_read(pckt->fLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, kATASectorSize, pckt->fPacketSize);
#endif
}
@@ -50,9 +50,9 @@ namespace Kernel
}
#ifdef __AHCI__
- drv_std_write(pckt->fLba, (Char*)pckt->fPacketContent.Leak(), kAHCISectorSize, pckt->fPacketSize);
+ drv_std_write(pckt->fLba, (Char*)pckt->fPacketContent, kAHCISectorSize, pckt->fPacketSize);
#elif defined(__ATA_PIO__) || defined(__ATA_DMA__)
- drv_std_write(pckt->fLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent.Leak(), kATASectorSize, pckt->fPacketSize);
+ drv_std_write(pckt->fLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, kATASectorSize, pckt->fPacketSize);
#endif
}
@@ -66,23 +66,32 @@ namespace Kernel
return;
}
- pckt->fPacketGood = false;
+ kATAMaster = 0;
+ kATAIO = 0;
#if defined(__ATA_PIO__) || defined(__ATA_DMA__)
kATAMaster = true;
kATAIO = ATA_PRIMARY_IO;
+ if (drv_std_init(kATAIO, kATAMaster, kATAIO, kATAMaster))
+ {
+ pckt->fPacketGood = YES;
+ return;
+ }
+
+ kATAMaster = false;
+ kATAIO = ATA_SECONDARY_IO;
+
if (!drv_std_init(kATAIO, kATAMaster, kATAIO, kATAMaster))
return;
+ pckt->fPacketGood = YES;
#elif defined(__AHCI__)
UInt16 pi = 0;
if (!drv_std_init(pi))
return;
#endif // if defined(__ATA_PIO__) || defined (__ATA_DMA__)
-
- pckt->fPacketGood = true;
}
/// @brief Gets the drive kind (ATA, SCSI, AHCI...)
@@ -127,7 +136,7 @@ namespace Kernel
{
DriveTrait trait;
- rt_copy_memory((VoidPtr) "/Mount/NUL:", trait.fName, rt_string_len("/Mount/NUL:"));
+ rt_copy_memory((VoidPtr) "/Disks/NUL:", trait.fName, rt_string_len("/Disks/NUL:"));
trait.fKind = kInvalidStorage;
trait.fInput = io_drv_unimplemented;
@@ -143,33 +152,39 @@ namespace Kernel
namespace Detail
{
- Void ioi_detect_drive(DriveTrait& trait)
+ Void ioi_detect_drive(DriveTrait* trait)
{
- _BOOT_BLOCK_STRUCT block_struct;
+ static _BOOT_BLOCK_STRUCT block_struct;
+
+ trait->fPacket.fLba = kEPMBaseLba;
+ trait->fPacket.fPacketSize = sizeof(_BOOT_BLOCK_STRUCT);
+ trait->fPacket.fPacketContent = &block_struct;
- trait.fPacket.fLba = kEPMBaseLba;
- trait.fPacket.fPacketSize = sizeof(_BOOT_BLOCK_STRUCT);
- trait.fPacket.fPacketContent = &block_struct;
+ rt_copy_memory((VoidPtr) "fs/detect-packet", trait->fPacket.fPacketMime,
+ rt_string_len("fs/detect-packet"));
- trait.fInit(&trait.fPacket);
- io_drv_input(&trait.fPacket);
+ trait->fInit(&trait->fPacket);
- trait.fKind = kMassStorage;
+ trait->fInput(&trait->fPacket);
- if (rt_string_cmp(block_struct.Magic, kEPMMagic, kEPMMagicLength) == 0)
+ if (rt_string_cmp(((BOOT_BLOCK_STRUCT*)trait->fPacket.fPacketContent)->Magic, kEPMMagic, kEPMMagicLength) == 0)
{
- trait.fKind |= kEPMDrive;
+ trait->fKind = kMassStorage;
+ trait->fKind |= kEPMDrive;
kcout << "Formatted drive is EPM.\r";
}
else
{
- trait.fKind |= kUnformattedDrive;
- kcout << "Formatted drive is blank.\r";
+ trait->fKind = kUnformattedDrive;
+ kcout << "Scheme Found: " << block_struct.Name << endl;
+
+ if (block_struct.Name[0] == 0)
+ kcout << "Formatted drive is blank.\r";
}
- trait.fPacket.fLba = 0;
- trait.fPacket.fPacketSize = 0UL;
- trait.fPacket.fPacketContent = nullptr;
+ trait->fPacket.fLba = 0;
+ trait->fPacket.fPacketSize = 0UL;
+ trait->fPacket.fPacketContent = nullptr;
}
} // namespace Detail
@@ -179,7 +194,7 @@ namespace Kernel
{
DriveTrait trait;
- rt_copy_memory((VoidPtr) "/Mount/OS:", trait.fName, rt_string_len("/Mount/OS:"));
+ rt_copy_memory((VoidPtr) "/Disks/OS:", trait.fName, rt_string_len("/Disks/OS:"));
trait.fVerify = io_drv_unimplemented;
trait.fOutput = io_drv_output;
@@ -187,9 +202,12 @@ namespace Kernel
trait.fInit = io_drv_init;
trait.fDriveKind = io_drv_kind;
- Detail::ioi_detect_drive(trait);
+ kcout << "Detect partiton scheme of: " << trait.fName << ".\r";
- kcout << "Construct: " << trait.fName << ".\r";
+ Detail::ioi_detect_drive(&trait);
+
+ while (YES)
+ ;
return trait;
}
diff --git a/dev/ZKAKit/src/HardwareThreadScheduler.cc b/dev/ZKAKit/src/HardwareThreadScheduler.cc
index 47963832..42d3e411 100644
--- a/dev/ZKAKit/src/HardwareThreadScheduler.cc
+++ b/dev/ZKAKit/src/HardwareThreadScheduler.cc
@@ -192,7 +192,7 @@ namespace Kernel
/// @brief Returns the amount of core present.
/// @return the number of cores.
- SizeT HardwareThreadScheduler::Count() noexcept
+ SizeT HardwareThreadScheduler::Capacity() noexcept
{
return fThreadList.Capacity();
}
diff --git a/dev/ZKAKit/src/PEFCodeMgr.cc b/dev/ZKAKit/src/PEFCodeMgr.cc
index 4aeb3acf..0568b998 100644
--- a/dev/ZKAKit/src/PEFCodeMgr.cc
+++ b/dev/ZKAKit/src/PEFCodeMgr.cc
@@ -273,7 +273,7 @@ namespace Kernel
proc.StackSize = mib_cast(cDefaultStackSizeMib);
}
- return UserProcessScheduler::The().Add(&proc);
+ return UserProcessScheduler::The().Spawn(&proc);
}
} // namespace Utils
} // namespace Kernel
diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc
index 3352085d..8694b449 100644
--- a/dev/ZKAKit/src/UserProcessScheduler.cc
+++ b/dev/ZKAKit/src/UserProcessScheduler.cc
@@ -32,19 +32,13 @@ namespace Kernel
/// @brief Exit Code global variable.
/***********************************************************************************/
- UInt32 kLastExitCode = 0U;
-
- /***********************************************************************************/
- /// @brief Process count global variable.
- /***********************************************************************************/
-
- ProcessID kProcessIDCounter = 0UL;
+ STATIC UInt32 kLastExitCode = 0U;
/***********************************************************************************/
/// @brief User Process scheduler global and external reference of thread scheduler.
/***********************************************************************************/
- UserProcessScheduler kProcessScheduler;
+ STATIC UserProcessScheduler kProcessScheduler;
UserProcess::UserProcess(VoidPtr start_image)
: Code(start_image)
@@ -314,7 +308,6 @@ namespace Kernel
mm_delete_heap(reinterpret_cast<VoidPtr>(this->StackReserve));
this->ProcessId = 0;
- --kProcessIDCounter;
}
/***********************************************************************************/
@@ -323,11 +316,11 @@ namespace Kernel
/// @return the process index inside the team.
/***********************************************************************************/
- ProcessID UserProcessScheduler::Add(UserProcess* process)
+ ProcessID UserProcessScheduler::Spawn(UserProcess* process)
{
if (*process->Name == 0)
{
- Char process_name[] = "System Process";
+ Char process_name[] = "Process (Unnamed)";
rt_copy_memory((VoidPtr)process_name, process->Name, rt_string_len(process_name));
}
@@ -378,18 +371,16 @@ namespace Kernel
kcout << "Create stack reserve for: " << process->Name << endl;
- auto pid = kProcessIDCounter;
+ auto pid = mTeam.mProcessList.Count();
process->ProcessId = pid;
process->Status = ProcessStatusKind::kRunning;
process->PTime = (UIntPtr)AffinityKind::kStandard;
- mTeam.AsArray().Assign(pid, *process);
-
- kcout << "Process Name: " << mTeam.AsArray()[pid].Name << endl;
- kcout << "PID: " << number(mTeam.AsArray()[pid].ProcessId) << endl;
+ mTeam.mProcessList.Assign(pid, *process);
- ++kProcessIDCounter;
+ kcout << "Process Name: " << mTeam.mProcessList[pid].Name << endl;
+ kcout << "PID: " << number(mTeam.mProcessList[pid].ProcessId) << endl;
return pid;
}
@@ -539,7 +530,7 @@ namespace Kernel
/***********************************************************************************/
/**
- * @brief Start scheduling current AP/Hart/Core.
+ * @brief Start scheduling current AP.
*/
/***********************************************************************************/
SizeT UserProcessHelper::StartScheduling()
@@ -549,6 +540,16 @@ namespace Kernel
/***********************************************************************************/
/**
+ * @brief Initializes the scheduler.
+ */
+ /***********************************************************************************/
+ Void UserProcessHelper::InitScheduler()
+ {
+ /// TODO: code to init scheduler here.
+ }
+
+ /***********************************************************************************/
+ /**
* \brief Does a context switch in a CPU.
* \param the_stack the stackframe of the running app.
* \param new_pid the process's PID.
@@ -563,7 +564,7 @@ namespace Kernel
if (!mm_is_valid_heap(image_ptr))
return No;
- for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Count(); ++index)
+ for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Capacity(); ++index)
{
if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kInvalidHart)
continue;
diff --git a/dev/ZKAKit/src/Utils.cc b/dev/ZKAKit/src/Utils.cc
index 3b7bc046..ec8a6944 100644
--- a/dev/ZKAKit/src/Utils.cc
+++ b/dev/ZKAKit/src/Utils.cc
@@ -215,3 +215,8 @@ EXTERN_C void* memset(void* dst, int c, __SIZE_TYPE__ len)
{
return Kernel::rt_set_memory(dst, c, len);
}
+
+EXTERN_C __UINT32_TYPE__ memcpy(void* dst, void* src, __SIZE_TYPE__ len)
+{
+ return Kernel::rt_copy_memory(src, dst, len);
+}