diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-11-20 21:01:31 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-11-20 21:01:31 +0100 |
| commit | 50439432a85976605dbb18e3cd2161f888d2e17d (patch) | |
| tree | 12a30d88888f407e84634badef430d321cd1f4c6 /dev/ZKAKit/src | |
| parent | 745cc52b11190689a3f42b936978a5c03a410b9a (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.cc | 15 | ||||
| -rw-r--r-- | dev/ZKAKit/src/DriveMgr.cc | 70 | ||||
| -rw-r--r-- | dev/ZKAKit/src/HardwareThreadScheduler.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/PEFCodeMgr.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/UserProcessScheduler.cc | 39 | ||||
| -rw-r--r-- | dev/ZKAKit/src/Utils.cc | 5 |
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); +} |
