diff options
Diffstat (limited to 'Kernel')
| -rw-r--r-- | Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 9 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalKernelMain.cxx | 5 | ||||
| -rw-r--r-- | Kernel/KernelKit/ProcessScheduler.hxx | 17 | ||||
| -rw-r--r-- | Kernel/KernelKit/SMPManager.hpp | 6 | ||||
| -rw-r--r-- | Kernel/KernelKit/Semaphore.hpp | 5 | ||||
| -rw-r--r-- | Kernel/Sources/KernelHeap.cxx | 1 | ||||
| -rw-r--r-- | Kernel/Sources/ProcessScheduler.cxx | 13 | ||||
| -rw-r--r-- | Kernel/Sources/Semaphore.cxx | 19 |
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 |
