summaryrefslogtreecommitdiffhomepage
path: root/Kernel
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-06-28 08:26:19 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-06-28 08:26:19 +0200
commitc142fe6fda7d09e929c9706b444cdc13ed5e72f3 (patch)
treef42890096937271233da33d9c201043fb9960634 /Kernel
parente32c206fe1d17eb96339b280c7f061e7201bd15b (diff)
IMP: Feature Pack #1
- Process scheduler. - System calls. - ACPI support. - Driver kit. - Filesystem support. - Program loader. - newstd/herror APIs. Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp9
-rw-r--r--Kernel/HALKit/AMD64/HalKernelMain.cxx5
-rw-r--r--Kernel/KernelKit/ProcessScheduler.hxx17
-rw-r--r--Kernel/KernelKit/SMPManager.hpp6
-rw-r--r--Kernel/KernelKit/Semaphore.hpp5
-rw-r--r--Kernel/Sources/KernelHeap.cxx1
-rw-r--r--Kernel/Sources/ProcessScheduler.cxx13
-rw-r--r--Kernel/Sources/Semaphore.cxx19
8 files changed, 49 insertions, 26 deletions
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
index e4a2d99c..dfa02b11 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
@@ -160,6 +160,7 @@ namespace NewOS::HAL
}
STATIC HAL::StackFramePtr cFramePtr = nullptr;
+ STATIC Int32 cSMPInterrupt = 0x40;
EXTERN_C Void hal_apic_acknowledge_cont(Void)
{
@@ -186,12 +187,13 @@ namespace NewOS::HAL
{
Semaphore sem;
- sem.LockOrWait(&ProcessScheduler::The().Leak().TheCurrent().Leak(), Seconds(5));
+ HardwareTimer timer(Seconds(5));
+ sem.LockOrWait(&ProcessScheduler::The().Leak().TheCurrent().Leak(), &timer);
cFramePtr = stackFrame;
/// yes the exception field contains the core id.
- hal_send_start_ipi(stackFrame->Rcx, 0x40, cBaseAddressAPIC);
+ hal_send_start_ipi(stackFrame->Rcx, cSMPInterrupt, cBaseAddressAPIC);
sem.Unlock();
}
@@ -245,10 +247,9 @@ namespace NewOS::HAL
cProgramInitialized = new Boolean(true);
- constexpr auto cWhereToInterrupt = 0x40;
constexpr auto cWhatCore = 1;
- hal_send_start_ipi(cWhatCore, cWhereToInterrupt, cBaseAddressAPIC);
+ hal_send_start_ipi(cWhatCore, cSMPInterrupt, cBaseAddressAPIC);
}
else
{
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index 31732022..7d641153 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -16,6 +16,7 @@
#include <NewKit/Json.hpp>
#include <Modules/CoreCG/Accessibility.hxx>
#include <KernelKit/CodeManager.hpp>
+#include <Modules/ACPI/ACPIFactoryInterface.hxx>
#define KERNEL_INIT(X) X; \
NewOS::ke_stop(RUNTIME_CHECK_BOOTSTRAP);
@@ -179,12 +180,12 @@ EXTERN_C void hal_init_platform(
};
kSyscalls[cRebootInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr rdx) -> void {
- NewOS::ACPIFactoryInterface acpi;
+ NewOS::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_RsdPtr);
acpi.Reboot();
};
kSyscalls[cShutdownInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr rdx) -> void {
- NewOS::ACPIFactoryInterface acpi;
+ NewOS::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_RsdPtr);
acpi.Shutdown();
};
diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx
index 98008d69..11555b1d 100644
--- a/Kernel/KernelKit/ProcessScheduler.hxx
+++ b/Kernel/KernelKit/ProcessScheduler.hxx
@@ -141,7 +141,8 @@ namespace NewOS
NEWOS_COPY_DEFAULT(ProcessHeader)
public:
- void SetEntrypoint(UIntPtr& imageStart) noexcept;
+ void SetEntrypoint(UIntPtr& imageStart) noexcept;
+ const Int32& GetExitCode() noexcept;
public:
Char Name[kProcessLen] = {"Process"};
@@ -179,30 +180,32 @@ namespace NewOS
}
//! @brief Crash the app, exits with code ~0.
- void Crash();
+ Void Crash();
//! @brief Exits app.
- void Exit(Int32 exitCode = 0);
+ Void Exit(Int32 exitCode = 0);
//! @brief TLS Allocate
- VoidPtr New(const SizeT& sz);
+ VoidPtr New(const SizeT& sz);
//! @brief TLS Free.
- Boolean Delete(VoidPtr ptr, const SizeT& sz);
+ Boolean Delete(VoidPtr ptr, const SizeT& sz);
//! @brief Wakes up threads.
- void Wake(const bool wakeup = false);
+ Void Wake(const bool wakeup = false);
// ProcessHeader getters.
public:
//! @brief ProcessHeader name getter, example: "C RunTime"
- const Char* GetName();
+ const Char* GetName();
const ProcessSelector& GetSelector();
const ProcessStatus& GetStatus();
const AffinityKind& GetAffinity();
private:
+ Int32 fLastExitCode{0};
+
friend ProcessScheduler;
friend ProcessHelper;
};
diff --git a/Kernel/KernelKit/SMPManager.hpp b/Kernel/KernelKit/SMPManager.hpp
index 1840dd20..9f4166ad 100644
--- a/Kernel/KernelKit/SMPManager.hpp
+++ b/Kernel/KernelKit/SMPManager.hpp
@@ -4,8 +4,8 @@
------------------------------------------- */
-#ifndef __SMP_MANAGER__
-#define __SMP_MANAGER__
+#ifndef __INC_SMP_MANAGER_HPP__
+#define __INC_SMP_MANAGER_HPP__
#include <ArchKit/ArchKit.hpp>
#include <CompilerKit/CompilerKit.hxx>
@@ -126,4 +126,4 @@ namespace NewOS
Void rt_hang_thread(HAL::StackFramePtr stack);
} // namespace NewOS
-#endif // !__SMP_MANAGER__
+#endif // !__INC_SMP_MANAGER_HPP__
diff --git a/Kernel/KernelKit/Semaphore.hpp b/Kernel/KernelKit/Semaphore.hpp
index 7850804d..83d711ed 100644
--- a/Kernel/KernelKit/Semaphore.hpp
+++ b/Kernel/KernelKit/Semaphore.hpp
@@ -7,6 +7,7 @@
#pragma once
#include <NewKit/Defines.hpp>
+#include <KernelKit/Timer.hpp>
#include <CompilerKit/CompilerKit.hxx>
namespace NewOS
@@ -27,11 +28,11 @@ namespace NewOS
bool Unlock() noexcept;
public:
- void Sync() noexcept;
+ void WaitForProcess() noexcept;
public:
bool Lock(ProcessHeader* process);
- bool LockOrWait(ProcessHeader* process, const Int64& seconds);
+ bool LockOrWait(ProcessHeader* process, HardwareTimerInterface* timer);
public:
NEWOS_COPY_DEFAULT(Semaphore);
diff --git a/Kernel/Sources/KernelHeap.cxx b/Kernel/Sources/KernelHeap.cxx
index c3e8e86b..875e00fb 100644
--- a/Kernel/Sources/KernelHeap.cxx
+++ b/Kernel/Sources/KernelHeap.cxx
@@ -185,6 +185,7 @@ namespace NewOS
{
virtualAddress->fCRC32 =
ke_calculate_crc32((Char*)virtualAddress->fTargetPtr, virtualAddress->fTargetPtrSize);
+
return true;
}
}
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index 315dc07a..ca9a3435 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -27,13 +27,19 @@ namespace NewOS
/// @brief Exit Code global
/***********************************************************************************/
- STATIC Int32 kLastExitCode = 0U;
+ STATIC Int32 cLastExitCode = 0U;
/// @brief Gets the latest exit code.
/// @note Not thread-safe.
+ /// @return Int32 the last exit code.
+ const Int32& ProcessHeader::GetExitCode() noexcept
+ {
+ return fLastExitCode;
+ }
+
const Int32& rt_get_exit_code() noexcept
{
- return kLastExitCode;
+ return cLastExitCode;
}
/***********************************************************************************/
@@ -164,7 +170,8 @@ namespace NewOS
ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId)
ke_stop(RUNTIME_CHECK_PROCESS);
- kLastExitCode = exit_code;
+ fLastExitCode = exit_code;
+ cLastExitCode = exit_code;
//! Delete image if not done already.
if (this->Image)
diff --git a/Kernel/Sources/Semaphore.cxx b/Kernel/Sources/Semaphore.cxx
index d52cf447..45fccbca 100644
--- a/Kernel/Sources/Semaphore.cxx
+++ b/Kernel/Sources/Semaphore.cxx
@@ -6,7 +6,6 @@
#include <KernelKit/ProcessScheduler.hxx>
#include <KernelKit/Semaphore.hpp>
-#include <KernelKit/Timer.hpp>
namespace NewOS
{
@@ -33,21 +32,31 @@ namespace NewOS
return fLockingProcess;
}
- bool Semaphore::LockOrWait(ProcessHeader* process, const Int64& seconds)
+ bool Semaphore::LockOrWait(ProcessHeader* process, HardwareTimerInterface* timer)
{
if (process == nullptr)
return false;
- HardwareTimer timer(Seconds(seconds));
- timer.Wait();
+ if (timer == nullptr)
+ return false;
+
+ this->Lock(process);
+
+ timer->Wait();
return this->Lock(process);
}
- void Semaphore::Sync() noexcept
+ /// @brief Wait with process, either wait for process being invalid, or not being run.
+ Void Semaphore::WaitForProcess() noexcept
{
while (fLockingProcess)
{
+ if (fLockingProcess->GetStatus() != ProcessStatus::kRunning)
+ {
+ this->Unlock();
+ break;
+ }
}
}
} // namespace NewOS