summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'dev/Kernel')
-rw-r--r--dev/Kernel/CompilerKit/Detail.h4
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/ATA.cc6
-rw-r--r--dev/Kernel/amd64-desktop.make2
-rw-r--r--dev/Kernel/arm64-desktop.make2
-rw-r--r--dev/Kernel/src/HardwareThreadScheduler.cc6
-rw-r--r--dev/Kernel/src/UserProcessScheduler.cc31
6 files changed, 28 insertions, 23 deletions
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 <NewKit/Defines.h>
-#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;
}
////////////////////////////////////////////////////////////