From b6464d3fcd11ad43d1d0421fa8484eda2ac1708f Mon Sep 17 00:00:00 2001 From: Amlal Date: Wed, 29 Jan 2025 09:15:17 +0100 Subject: WiP: Tweaks and will finish SATA support and ATA (DMA) support. Signed-off-by: Amlal --- dev/Kernel/CompilerKit/Detail.h | 4 ++-- dev/Kernel/HALKit/AMD64/Storage/ATA.cc | 6 ++++-- dev/Kernel/amd64-desktop.make | 2 +- dev/Kernel/arm64-desktop.make | 2 +- dev/Kernel/src/HardwareThreadScheduler.cc | 6 +++++- dev/Kernel/src/UserProcessScheduler.cc | 31 +++++++++++++++---------------- 6 files changed, 28 insertions(+), 23 deletions(-) (limited to 'dev/Kernel') diff --git a/dev/Kernel/CompilerKit/Detail.h b/dev/Kernel/CompilerKit/Detail.h index 6f58c97f..29620aae 100644 --- a/dev/Kernel/CompilerKit/Detail.h +++ b/dev/Kernel/CompilerKit/Detail.h @@ -6,9 +6,9 @@ #pragma once -#ifdef __MINOSKRNL__ +#ifdef __NEOSKRNL__ #include -#endif // ifdef __MINOSKRNL__ +#endif // ifdef __NEOSKRNL__ #define ZKA_COPY_DELETE(KLASS) \ KLASS& operator=(const KLASS&) = delete; \ diff --git a/dev/Kernel/HALKit/AMD64/Storage/ATA.cc b/dev/Kernel/HALKit/AMD64/Storage/ATA.cc index a3e8f4ab..aea1846d 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/ATA.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/ATA.cc @@ -105,8 +105,10 @@ Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) // Step 7: Check if the drive supports DMA if (!(kATAData[63] & (1 << 8)) || !(kATAData[88] & 0xFF)) { - kcout << "No DMA support, falling back to PIO...\r"; - return false; // Or switch to PIO mode if needed + kcout << "No DMA support...\r"; + ke_panic(RUNTIME_CHECK_FAILED, "No DMA support on necessry disk driver."); + + return false; } // Step 8: Enable DMA Mode diff --git a/dev/Kernel/amd64-desktop.make b/dev/Kernel/amd64-desktop.make index d8a63ced..023195d5 100644 --- a/dev/Kernel/amd64-desktop.make +++ b/dev/Kernel/amd64-desktop.make @@ -5,7 +5,7 @@ CXX = x86_64-w64-mingw32-g++ LD = x86_64-w64-mingw32-ld -CCFLAGS = -fshort-wchar -c -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__ZKA_SUPPORT_NX__ -O0 -I../Vendor -D__FSKIT_INCLUDES_NEFS__ -D__MINOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA_VIRTUAL_MEMORY_SUPPORT__ -D__ZKA_AUTO_FORMAT__ -D__ZKA__ -I./ -I../ -I../zba +CCFLAGS = -fshort-wchar -c -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__ZKA_SUPPORT_NX__ -O0 -I../Vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA_VIRTUAL_MEMORY_SUPPORT__ -D__ZKA_AUTO_FORMAT__ -D__ZKA__ -I./ -I../ -I../zba ASM = nasm diff --git a/dev/Kernel/arm64-desktop.make b/dev/Kernel/arm64-desktop.make index ba5e736b..71443e9f 100644 --- a/dev/Kernel/arm64-desktop.make +++ b/dev/Kernel/arm64-desktop.make @@ -7,7 +7,7 @@ CC = clang++ LD = lld-link CCFLAGS = -fshort-wchar -c -ffreestanding -MMD -mno-red-zone -D__ZKA_ARM64__ -fno-rtti -fno-exceptions -I./ \ -target aarch64-unknown-windows \ - -std=c++20 -O3 -D__MINOSKRNL__ -D__ZKA_MINIMAL_OS__ -D__ZKA_NO_BUILTIN__ -D__HAVE_ZKA_APIS__ -D__ZKA__ -I../ + -std=c++20 -O3 -D__NEOSKRNL__ -D__ZKA_MINIMAL_OS__ -D__ZKA_NO_BUILTIN__ -D__HAVE_ZKA_APIS__ -D__ZKA__ -I../ ASM = clang++ diff --git a/dev/Kernel/src/HardwareThreadScheduler.cc b/dev/Kernel/src/HardwareThreadScheduler.cc index 66500f73..573b86d6 100644 --- a/dev/Kernel/src/HardwareThreadScheduler.cc +++ b/dev/Kernel/src/HardwareThreadScheduler.cc @@ -62,8 +62,9 @@ namespace Kernel Bool HardwareThread::IsBusy() noexcept { STATIC Int64 busy_timer = 0U; + STATIC Int64 timeout_max = 0x1000000; // an arbitrary value used to tell if the timeout hasn't been reached yet. - if (fBusy && busy_timer > this->fPTime) + if (fBusy && busy_timer > timeout_max) { busy_timer = 0U; fBusy = No; @@ -111,6 +112,9 @@ namespace Kernel /***********************************************************************************/ Bool HardwareThread::Switch(VoidPtr image_ptr, Ptr8 stack_ptr, HAL::StackFramePtr frame, const ThreadID& pid) { + if (this->IsBusy()) + return NO; + this->fStack = frame; this->fSourcePID = pid; diff --git a/dev/Kernel/src/UserProcessScheduler.cc b/dev/Kernel/src/UserProcessScheduler.cc index dbe0471b..2e76f7ac 100644 --- a/dev/Kernel/src/UserProcessScheduler.cc +++ b/dev/Kernel/src/UserProcessScheduler.cc @@ -565,7 +565,14 @@ namespace Kernel continue; if (HardwareThreadScheduler::The()[index].Leak()->Switch(image_ptr, stack, frame_ptr, new_pid)) + { + auto prev_ptime = HardwareThreadScheduler::The()[index].Leak()->fPTime; + HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; + PID prev_pid = UserProcessHelper::TheCurrentPID(); + UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid; + return YES; + } continue; } @@ -573,38 +580,30 @@ namespace Kernel if (UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].Affinity == AffinityKind::kRealTime) continue; - PID prev_pid = UserProcessHelper::TheCurrentPID(); - UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid; - //////////////////////////////////////////////////////////// /// Prepare task switch. /// //////////////////////////////////////////////////////////// - HardwareThreadScheduler::The()[index].Leak()->Wake(YES); - HardwareThreadScheduler::The()[index].Leak()->Busy(NO); - - auto prev_ptime = HardwareThreadScheduler::The()[index].Leak()->fPTime; - HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; - Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(image_ptr, stack, frame_ptr, new_pid); //////////////////////////////////////////////////////////// /// Rollback on fail. /// //////////////////////////////////////////////////////////// if (!ret) - { - HardwareThreadScheduler::The()[index].Leak()->fPTime = prev_ptime; - UserProcessHelper::TheCurrentPID().Leak().Leak() = prev_pid; + return No; - HardwareThreadScheduler::The()[index].Leak()->Busy(NO); - } + PID prev_pid = UserProcessHelper::TheCurrentPID(); + UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid; + + auto prev_ptime = HardwareThreadScheduler::The()[index].Leak()->fPTime; + HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; HardwareThreadScheduler::The()[index].Leak()->Wake(NO); - return Yes; + break; } - return No; + return Yes; } //////////////////////////////////////////////////////////// -- cgit v1.2.3