diff options
| author | Amlal <amlal.elmahrouss@icloud.com> | 2024-11-02 07:46:45 +0100 |
|---|---|---|
| committer | Amlal <amlal.elmahrouss@icloud.com> | 2024-11-02 07:49:04 +0100 |
| commit | f5e656424dc41ff93c67bcc8139a76d40f525efc (patch) | |
| tree | f701847fb8d2bec8a31c1f24f86afc5f2f338e64 /dev | |
| parent | 358379efc79bdda8b5742b82b95c45063184d76f (diff) | |
IMP: minOSKrnl commit 1039.
- KernelKit: New allocation limit in Heap.cc
- KernelKit: Add Matches method for password validation.
- KernelKit: Scheduler and Thread have been improved with new validations on frame.
- META: Ran format command.
- NewKit: Add new Ptr8 type for UInt8* types.
- MBCI: Fix codestyle.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
25 files changed, 136 insertions, 85 deletions
diff --git a/dev/Modules/MBCI/MBCI.h b/dev/Modules/MBCI/MBCI.h index 620e7ec1..00910125 100644 --- a/dev/Modules/MBCI/MBCI.h +++ b/dev/Modules/MBCI/MBCI.h @@ -21,8 +21,7 @@ - GND (IN) (OUT for MCU) */ -#define cMBCIZeroSz (8) -#define cMBCIMagic "MBCI " +#define kMBCIZeroSz (8) namespace Kernel { @@ -39,15 +38,15 @@ namespace Kernel UInt32 DeviceId; UInt32 DeviceSpeed; Bool Acknowledge; - Char Zero[cMBCIZeroSz]; + Char Zero[kMBCIZeroSz]; }; enum { - eMBCISpeedDeviceInvalid, - eMBCILowSpeedDevice, - eMBCIHighSpeedDevice, - eMBCISpeedDeviceCount, + kMBCISpeedDeviceInvalid, + kMBCILowSpeedDevice, + kMBCIHighSpeedDevice, + kMBCISpeedDeviceCount, }; /// @brief MBCI Host Interface header. @@ -65,31 +64,31 @@ namespace Kernel UInt8 InterruptEnable; UInt64 BaseAddressRegister; UInt64 BaseAddressRegisterSize; - Char Zero[cMBCIZeroSz]; + Char Zero[kMBCIZeroSz]; }; /// @brief MBCI host flags. enum MBCIHostFlags { - eMBCIHostFlagsSupportsNothing, // Invalid MBCI device. - eMBCIHostFlagsSupportsAPM, // Advanced Power Management. - eMBCIHostFlagsSupportsDaisyChain, // Is daisy chained. - eMBCIHostFlagsSupportsHWInterrupts, // Has HW interrupts. - eMBCIHostFlagsSupportsDMA, // Has DMA. - eMBCIHostFlagsExtended = __UINT16_MAX__, // Extended flags table. + kMBCIHostFlagsSupportsNothing, // Invalid MBCI device. + kMBCIHostFlagsSupportsAPM, // Advanced Power Management. + kMBCIHostFlagsSupportsDaisyChain, // Is daisy chained. + kMBCIHostFlagsSupportsHWInterrupts, // Has HW interrupts. + kMBCIHostFlagsSupportsDMA, // Has DMA. + kMBCIHostFlagsExtended = __UINT16_MAX__, // Extended flags table. }; enum MBCIHostKind { - eMBCIHostKindHardDisk, - eMBCIHostKindOpticalDisk, - eMBCIHostKindKeyboardLow, - eMBCIHostKindMouseLow, - eMBCIHostKindMouseHigh, - eMBCIHostKindKeyboardHigh, - eMBCIHostKindNetworkInterface, - eMBCIHostKindDaisyChain, - eMBCIHostKindStartExtended = __UINT16_MAX__, // Extended vendor table. + kMBCIHostKindHardDisk, + kMBCIHostKindOpticalDisk, + kMBCIHostKindKeyboardLow, + kMBCIHostKindMouseLow, + kMBCIHostKindMouseHigh, + kMBCIHostKindKeyboardHigh, + kMBCIHostKindNetworkInterface, + kMBCIHostKindDaisyChain, + kMBCIHostKindStartExtended = __UINT16_MAX__, // Extended vendor table limit. }; /// @brief An AuthKey is a context used to decrpy data from an MBCI packet. diff --git a/dev/SCIKit/src/Makefile b/dev/SCIKit/src/Makefile new file mode 100644 index 00000000..e518909a --- /dev/null +++ b/dev/SCIKit/src/Makefile @@ -0,0 +1,4 @@ +.PHONY: syscall_unit +syscall_unit: + nasm -f win64 Syscall.asm + diff --git a/dev/ZKAKit/CFKit/GUIDWizard.h b/dev/ZKAKit/CFKit/GUIDWizard.h index b8a85a04..4c5c0c1d 100644 --- a/dev/ZKAKit/CFKit/GUIDWizard.h +++ b/dev/ZKAKit/CFKit/GUIDWizard.h @@ -19,6 +19,6 @@ namespace CFKit::XRN::Version1 { using namespace Kernel; - Ref<GUIDSequence*> cf_make_sequence(const ArrayList<UInt32>& seq); + Ref<GUIDSequence*> cf_make_sequence(const ArrayList<UInt32>& seq); ErrorOr<Ref<Kernel::KString>> cf_try_guid_to_string(Ref<GUIDSequence*>& guid); } // namespace CFKit::XRN::Version1 diff --git a/dev/ZKAKit/CFKit/Property.h b/dev/ZKAKit/CFKit/Property.h index fc9855ed..a88a02f5 100644 --- a/dev/ZKAKit/CFKit/Property.h +++ b/dev/ZKAKit/CFKit/Property.h @@ -35,10 +35,10 @@ namespace CFKit bool StringEquals(KString& name); PropertyId& GetValue(); - KString& GetKey(); + KString& GetKey(); private: - KString fName{kMaxPropLen}; + KString fName{kMaxPropLen}; PropertyId fAction{No}; }; diff --git a/dev/ZKAKit/FSKit/Defines.h b/dev/ZKAKit/FSKit/Defines.h index 9967dc1a..53b02459 100644 --- a/dev/ZKAKit/FSKit/Defines.h +++ b/dev/ZKAKit/FSKit/Defines.h @@ -8,5 +8,5 @@ #include <NewKit/Defines.h> -#define FSKIT_VERSION "1.0.0" +#define FSKIT_VERSION "1.0.0" #define FSKIT_VERSION_BCD 0x0100 diff --git a/dev/ZKAKit/FSKit/HPFS.h b/dev/ZKAKit/FSKit/HPFS.h index a019437b..b7b015b0 100644 --- a/dev/ZKAKit/FSKit/HPFS.h +++ b/dev/ZKAKit/FSKit/HPFS.h @@ -12,7 +12,7 @@ /// @brief HPFS filesystem support.
#define kHPFSVersion 0x0100
-#define kHPFSMagic " HPFS"
+#define kHPFSMagic " HPFS"
#define kHPFSMagicLen 8
#define kHPFSMinimumDiskSize (gib_cast(64))
@@ -28,4 +28,3 @@ enum };
struct HPFS_EXPLICIT_BOOT_SECTOR;
-
diff --git a/dev/ZKAKit/FSKit/NeFS.h b/dev/ZKAKit/FSKit/NeFS.h index b8d28444..dbe892e3 100644 --- a/dev/ZKAKit/FSKit/NeFS.h +++ b/dev/ZKAKit/FSKit/NeFS.h @@ -4,7 +4,7 @@ FILE: NeFS.h PURPOSE: NeFS (New FileSystem) support. - + Revision History: ?/?/?: Added file (amlel) diff --git a/dev/ZKAKit/HALKit/AMD64/HalPagingMgrAMD64.cc b/dev/ZKAKit/HALKit/AMD64/HalPagingMgrAMD64.cc index 3c7ea836..49968658 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalPagingMgrAMD64.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalPagingMgrAMD64.cc @@ -62,7 +62,7 @@ namespace Kernel::HAL kcout << (pte->User ? "User" : "Not User") << endl; } - STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, ZKA_PTE* pt_entry, ZKA_PDE* pd_entry); + STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, ZKA_PTE* pt_entry, ZKA_PDE* pd_entry); /***********************************************************************************/ /// @brief Maps or allocates a page from virtual_address. @@ -127,9 +127,10 @@ namespace Kernel::HAL /// @brief Maps flags for a specific pte. /// @internal Internal function. /***********************************************************************************/ - STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, ZKA_PTE* pt_entry, ZKA_PDE* pd_entry) + STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, ZKA_PTE* pt_entry, ZKA_PDE* pd_entry) { - if (!pt_entry) return 1; + if (!pt_entry) + return 1; pt_entry->Present = true; diff --git a/dev/ZKAKit/HALKit/AMD64/HalSchedulerCoreAMD64.cc b/dev/ZKAKit/HALKit/AMD64/HalSchedulerCoreAMD64.cc index 3f768dff..df2cb902 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalSchedulerCoreAMD64.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalSchedulerCoreAMD64.cc @@ -22,9 +22,9 @@ namespace Kernel Bool hal_check_stack(HAL::StackFramePtr stack_ptr) { if (!stack_ptr) - return false; + return No; - return true; + return Yes; } /// @brief Wakes up thread. diff --git a/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc b/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc index 81e14bf6..8098c48a 100644 --- a/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc +++ b/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc @@ -46,5 +46,6 @@ EXTERN_C void hal_init_platform( Kernel::NeFileSystemMgr::Mount(new Kernel::NeFileSystemMgr()); - while (Yes); + while (Yes) + ; } diff --git a/dev/ZKAKit/KernelKit/DriveMgr.h b/dev/ZKAKit/KernelKit/DriveMgr.h index 6f17e03b..38b9624a 100644 --- a/dev/ZKAKit/KernelKit/DriveMgr.h +++ b/dev/ZKAKit/KernelKit/DriveMgr.h @@ -34,13 +34,13 @@ namespace Kernel kFloppyDisc = 0xCD, kOpticalDisc = 0xDC, // CD-ROM/DVD-ROM/Blu-Ray /// Storage flags, combine with below. - kReadOnly = 0x10, // Read only drive - kEPMDrive = 0x11, // Explicit Partition Map. - kEPTDrive = 0x12, // ESP w/ EPM partition. - kMBRDrive = 0x13, // PC classic partition scheme - kGPTDrive = 0x14, // PC new partition scheme + kReadOnly = 0x10, // Read only drive + kEPMDrive = 0x11, // Explicit Partition Map. + kEPTDrive = 0x12, // ESP w/ EPM partition. + kMBRDrive = 0x13, // PC classic partition scheme + kGPTDrive = 0x14, // PC new partition scheme kUnformattedDrive = 0x15, - kStorageCount = 9, + kStorageCount = 9, }; typedef Int64 rt_drive_id_type; diff --git a/dev/ZKAKit/KernelKit/HardwareThreadScheduler.h b/dev/ZKAKit/KernelKit/HardwareThreadScheduler.h index 3e94af75..bd669018 100644 --- a/dev/ZKAKit/KernelKit/HardwareThreadScheduler.h +++ b/dev/ZKAKit/KernelKit/HardwareThreadScheduler.h @@ -61,7 +61,7 @@ namespace Kernel void Busy(const bool busy = false) noexcept; public: - bool Switch(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr frame); + bool Switch(VoidPtr image, Ptr8 stack_ptr, HAL::StackFramePtr frame); bool IsWakeup() noexcept; public: diff --git a/dev/ZKAKit/KernelKit/PEFCodeMgr.h b/dev/ZKAKit/KernelKit/PEFCodeMgr.h index 32e3c838..568b77da 100644 --- a/dev/ZKAKit/KernelKit/PEFCodeMgr.h +++ b/dev/ZKAKit/KernelKit/PEFCodeMgr.h @@ -53,9 +53,9 @@ namespace Kernel #endif // __FSKIT_INCLUDES_NEFS__ Ref<KString> fPath; - VoidPtr fCachedBlob; - bool fFatBinary; - bool fBad; + VoidPtr fCachedBlob; + bool fFatBinary; + bool fBad; }; namespace Utils diff --git a/dev/ZKAKit/KernelKit/User.h b/dev/ZKAKit/KernelKit/User.h index 3e48f1bd..ebb8cee2 100644 --- a/dev/ZKAKit/KernelKit/User.h +++ b/dev/ZKAKit/KernelKit/User.h @@ -65,12 +65,17 @@ namespace Kernel /// @brief Is she a super user? Bool IsSuperUser() noexcept; - Bool TrySave(const UserPublicKey password) noexcept; + /// @brief Saves a password from the public key. + Bool Save(const UserPublicKey password) noexcept; + + /// @brief Checks if a password matches the **password**. + /// @param password the password to check. + Bool Matches(const UserPublicKey password) noexcept; private: UserRingKind fRing{UserRingKind::kRingStdUser}; - Char fUserName[kMaxUserNameLen] = {0}; - Char fUserToken[kMaxUserTokenLen] = {0}; + Char fUserName[kMaxUserNameLen] = {0}; + Char fUserToken[kMaxUserTokenLen] = {0}; }; } // namespace Kernel diff --git a/dev/ZKAKit/KernelKit/UserProcessScheduler.h b/dev/ZKAKit/KernelKit/UserProcessScheduler.h index 798519ac..3ec92e8c 100644 --- a/dev/ZKAKit/KernelKit/UserProcessScheduler.h +++ b/dev/ZKAKit/KernelKit/UserProcessScheduler.h @@ -154,8 +154,8 @@ namespace Kernel struct USER_PROCESS_HEAP final { VoidPtr MemoryEntry{nullptr}; - SizeT MemoryEntrySize{0UL}; - SizeT MemoryEntryPad{0UL}; + SizeT MemoryEntrySize{0UL}; + SizeT MemoryEntryPad{0UL}; struct USER_PROCESS_HEAP* MemoryPrev{nullptr}; struct USER_PROCESS_HEAP* MemoryNext{nullptr}; @@ -275,7 +275,7 @@ namespace Kernel public: Ref<UserProcess>& GetCurrentProcess(); - const SizeT Run() noexcept; + const SizeT Run() noexcept; public: STATIC UserProcessScheduler& The(); diff --git a/dev/ZKAKit/NetworkKit/IP.h b/dev/ZKAKit/NetworkKit/IP.h index cc50495b..17e6be06 100644 --- a/dev/ZKAKit/NetworkKit/IP.h +++ b/dev/ZKAKit/NetworkKit/IP.h @@ -78,6 +78,6 @@ namespace Kernel public: static ErrorOr<KString> ToKString(Ref<RawIPAddress6>& ipv6); static ErrorOr<KString> ToKString(Ref<RawIPAddress>& ipv4); - static bool IpCheckVersion4(const Char* ip); + static bool IpCheckVersion4(const Char* ip); }; } // namespace Kernel diff --git a/dev/ZKAKit/NewKit/Array.h b/dev/ZKAKit/NewKit/Array.h index 6caa5b2d..28060857 100644 --- a/dev/ZKAKit/NewKit/Array.h +++ b/dev/ZKAKit/NewKit/Array.h @@ -17,7 +17,7 @@ namespace Kernel { public: explicit Array() = default; - ~Array() = default; + ~Array() = default; Array& operator=(const Array&) = default; Array(const Array&) = default; diff --git a/dev/ZKAKit/NewKit/Defines.h b/dev/ZKAKit/NewKit/Defines.h index dd9439b6..f43472af 100644 --- a/dev/ZKAKit/NewKit/Defines.h +++ b/dev/ZKAKit/NewKit/Defines.h @@ -61,6 +61,7 @@ namespace Kernel typedef UIntPtr* Ptr64; typedef UInt32* Ptr32; + typedef UInt8* Ptr8; using Utf8Char = char8_t; using Utf16Char = char16_t; diff --git a/dev/ZKAKit/NewKit/Json.h b/dev/ZKAKit/NewKit/Json.h index 1ca5fae1..05b24808 100644 --- a/dev/ZKAKit/NewKit/Json.h +++ b/dev/ZKAKit/NewKit/Json.h @@ -27,7 +27,7 @@ namespace Kernel public: explicit JSON() { - auto len = cJSONLen; + auto len = cJSONLen; KString key = KString(len); key += cJSONNull; @@ -50,7 +50,7 @@ namespace Kernel } private: - Bool fUndefined; // is this instance undefined? + Bool fUndefined; // is this instance undefined? KString fKey; KString fValue; diff --git a/dev/ZKAKit/NewKit/KString.h b/dev/ZKAKit/NewKit/KString.h index 5082f5fa..38cfe330 100644 --- a/dev/ZKAKit/NewKit/KString.h +++ b/dev/ZKAKit/NewKit/KString.h @@ -86,9 +86,9 @@ namespace Kernel struct StringBuilder final { static ErrorOr<KString> Construct(const Char* data); - static const Char* FromBool(const Char* fmt, bool n); - static const Char* Format(const Char* fmt, const Char* from); - static bool Equals(const Char* lhs, const Char* rhs); - static bool Equals(const WideChar* lhs, const WideChar* rhs); + static const Char* FromBool(const Char* fmt, bool n); + static const Char* Format(const Char* fmt, const Char* from); + static bool Equals(const Char* lhs, const Char* rhs); + static bool Equals(const WideChar* lhs, const WideChar* rhs); }; } // namespace Kernel diff --git a/dev/ZKAKit/src/DriveMgr.cc b/dev/ZKAKit/src/DriveMgr.cc index c8ab9b6c..3d11600b 100644 --- a/dev/ZKAKit/src/DriveMgr.cc +++ b/dev/ZKAKit/src/DriveMgr.cc @@ -147,8 +147,8 @@ namespace Kernel { _BOOT_BLOCK_STRUCT block_struct; - trait.fPacket.fLba = kEPMBaseLba; - trait.fPacket.fPacketSize = sizeof(_BOOT_BLOCK_STRUCT); + trait.fPacket.fLba = kEPMBaseLba; + trait.fPacket.fPacketSize = sizeof(_BOOT_BLOCK_STRUCT); trait.fPacket.fPacketContent = &block_struct; io_drv_input(&trait.fPacket); @@ -164,11 +164,11 @@ namespace Kernel trait.fKind |= kUnformattedDrive; } - trait.fPacket.fLba = 0; - trait.fPacket.fPacketSize = 0UL; + trait.fPacket.fLba = 0; + trait.fPacket.fPacketSize = 0UL; trait.fPacket.fPacketContent = nullptr; } - } + } // namespace Detail /// @brief Fetches the main drive. /// @return the new drive. (returns kEPMDrive if EPM formatted) diff --git a/dev/ZKAKit/src/HardwareThreadScheduler.cc b/dev/ZKAKit/src/HardwareThreadScheduler.cc index 5c75853c..5c5b8f15 100644 --- a/dev/ZKAKit/src/HardwareThreadScheduler.cc +++ b/dev/ZKAKit/src/HardwareThreadScheduler.cc @@ -89,14 +89,14 @@ namespace Kernel /// @note Those symbols are needed in order to switch and validate the stack. - EXTERN Bool hal_check_stack(HAL::StackFramePtr stackPtr); - EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr); + EXTERN Bool hal_check_stack(HAL::StackFramePtr frame_ptr); + EXTERN_C Bool mp_register_process(VoidPtr image, Ptr8 stack_ptr, HAL::StackFramePtr frame_ptr); /// @brief Switch to hardware thread. /// @param stack the new hardware thread. /// @retval true stack was changed, code is running. /// @retval false stack is invalid, previous code is running. - Bool HardwareThread::Switch(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr frame) + Bool HardwareThread::Switch(VoidPtr image, Ptr8 stack_ptr, HAL::StackFramePtr frame) { if (!frame || !image || @@ -109,6 +109,9 @@ namespace Kernel if (this->IsBusy()) return No; + if (!hal_check_stack(frame)) + return No; + fStack = frame; Bool ret = mp_register_process(image, stack_ptr, fStack); diff --git a/dev/ZKAKit/src/Heap.cc b/dev/ZKAKit/src/Heap.cc index 65781f0e..fc3f7051 100644 --- a/dev/ZKAKit/src/Heap.cc +++ b/dev/ZKAKit/src/Heap.cc @@ -102,7 +102,7 @@ namespace Kernel if (!ptr_heap || new_sz < 1) return nullptr; - kcout << "This function is not implemented by the MicroKernel, please use the BSD layer realloc instead.\r"; + kcout << "This function is not implemented by minOSKrnl, please use the BSD's realloc instead.\r"; ke_stop(RUNTIME_CHECK_PROCESS); return nullptr; @@ -120,6 +120,9 @@ namespace Kernel if (sz_fix == 0) return nullptr; + // We can't allocate that big now. + MUST_PASS(sz <= gib_cast(2)); + sz_fix += sizeof(Detail::HEAP_INFORMATION_BLOCK); PageMgr heap_mgr; @@ -236,12 +239,12 @@ namespace Kernel } heap_info_ptr->fHeapSize = 0UL; - heap_info_ptr->fPresent = No; - heap_info_ptr->fHeapPtr = 0; - heap_info_ptr->fCRC32 = 0; - heap_info_ptr->fWr = No; - heap_info_ptr->fUser = No; - heap_info_ptr->fMagic = 0; + heap_info_ptr->fPresent = No; + heap_info_ptr->fHeapPtr = 0; + heap_info_ptr->fCRC32 = 0; + heap_info_ptr->fWr = No; + heap_info_ptr->fUser = No; + heap_info_ptr->fMagic = 0; PTEWrapper pageWrapper(No, No, No, reinterpret_cast<UIntPtr>(heap_info_ptr) - sizeof(Detail::HEAP_INFORMATION_BLOCK)); Ref<PTEWrapper> pteAddress{pageWrapper}; diff --git a/dev/ZKAKit/src/User.cc b/dev/ZKAKit/src/User.cc index 189d80cf..9ac154f1 100644 --- a/dev/ZKAKit/src/User.cc +++ b/dev/ZKAKit/src/User.cc @@ -17,8 +17,8 @@ #include <KernelKit/UserProcessScheduler.h> #include <KernelKit/Heap.h> -#define kStdUserType (0xCEEF) -#define kSuperUserType (0xECCF) +#define kStdUserType (0xCE) +#define kSuperUserType (0xEC) /// BUGS: 0 @@ -43,7 +43,7 @@ namespace Kernel if (cur_chr == 0) break; - password[i_pass] = cur_chr + (user->IsStdUser() ? kStdUserType : kSuperUserType); + password[i_pass] = cur_chr | (user->IsStdUser() ? kStdUserType : kSuperUserType); } kcout << "Done hashing password!\r"; @@ -67,7 +67,7 @@ namespace Kernel User::~User() = default; - Bool User::TrySave(const UserPublicKey password_to_fill) noexcept + Bool User::Save(const UserPublicKey password_to_fill) noexcept { if (!password_to_fill || *password_to_fill == 0) @@ -103,6 +103,30 @@ namespace Kernel return Yes; } + Bool User::Matches(const UserPublicKey password_to_fill) noexcept + { + Char* password = new Char[len]; + MUST_PASS(password); + + // fill data first, generate hash. + // return false on error. + + rt_copy_memory((VoidPtr)password_to_fill, password, len); + + if (!Detail::cred_construct_token(password, password_to_fill, this, len)) + { + delete[] password; + password = nullptr; + + return No; + } + + kcout << "Validating hashed passwords...\r"; + + // now check if the password matches. + return rt_string_cmp(password, this->fUserToken, rt_string_len(this->fUserToken)) == 0; + } + Bool User::operator==(const User& lhs) { return lhs.fRing == this->fRing; diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc index c3e85716..b2fed635 100644 --- a/dev/ZKAKit/src/UserProcessScheduler.cc +++ b/dev/ZKAKit/src/UserProcessScheduler.cc @@ -38,9 +38,12 @@ namespace Kernel /// @brief User Process scheduler global and external reference of thread scheduler. /***********************************************************************************/ - UserProcessScheduler kProcessScheduler; + UserProcessScheduler kProcessScheduler; - UserProcess::UserProcess(VoidPtr start_image) : Image(start_image) {} + UserProcess::UserProcess(VoidPtr start_image) + : Image(start_image) + { + } UserProcess::~UserProcess() = default; @@ -127,9 +130,9 @@ namespace Kernel if (!this->MemoryHeap) { - this->MemoryHeap = new UserProcess::USER_PROCESS_HEAP(); + this->MemoryHeap = new UserProcess::USER_PROCESS_HEAP(); - this->MemoryHeap->MemoryEntryPad = pad_amount; + this->MemoryHeap->MemoryEntryPad = pad_amount; this->MemoryHeap->MemoryEntrySize = sz; this->MemoryHeap->MemoryEntry = ptr; @@ -141,7 +144,7 @@ namespace Kernel } else { - USER_PROCESS_HEAP* entry = this->MemoryHeap; + USER_PROCESS_HEAP* entry = this->MemoryHeap; USER_PROCESS_HEAP* prev_entry = nullptr; while (!entry) @@ -439,7 +442,7 @@ namespace Kernel process.PTime = static_cast<Int32>(process.Affinity); UserProcessScheduler::The().GetCurrentProcess().Leak().Status = ProcessStatusKind::kFrozen; - UserProcessScheduler::The().GetCurrentProcess() = process; + UserProcessScheduler::The().GetCurrentProcess() = process; kcout << "Switch to '" << process.Name << "'.\r"; @@ -541,10 +544,18 @@ namespace Kernel PID prev_pid = UserProcessHelper::TheCurrentPID(); UserProcessHelper::TheCurrentPID() = new_pid; + //////////////////////////////////////////////////////////// + /// Prepare task switch. /// + //////////////////////////////////////////////////////////// + auto prev_ptime = HardwareThreadScheduler::The()[index].Leak()->fPTime; HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].ProcessId; Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(image_ptr, stack, frame_ptr); + //////////////////////////////////////////////////////////// + /// Rollback on fail. /// + //////////////////////////////////////////////////////////// + /// if (!ret) { HardwareThreadScheduler::The()[index].Leak()->fPTime = prev_ptime; |
