From f8aaa274535b6541f376090958eedbbba3ba00ba Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 14 May 2025 18:35:05 +0200 Subject: feat(kernel): Filesystem fixes, and others. what? - Add simple generic RTL8139 NIC driver, to be used within a NK device. - Update IVT accordingly. - Comment ARM's AP GIC init function, to tell what it's actually doing. - Cleanup Kernel Main, removed the useless pre_init_scheduler function. - Prepare new FileMgr with HeFileSystemMgr. - Fallback to NeFS when trying to format a fileysstem. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc') diff --git a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc index 7e55aa07..a89702ea 100644 --- a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc @@ -122,6 +122,8 @@ EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame, ProcessID pid) return YES; } +/// @internal +/// @brief Initialize the Global Interrupt Controller. BOOL mp_initialize_gic(Void) { if (!Detail::kGICEnabled) { Detail::kGICEnabled = YES; -- cgit v1.2.3 From a9653add416fbddc1969a75adb733bc9e9c675d6 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 19 May 2025 10:24:52 +0200 Subject: feat(kernel, sched): Architectural improvements, and cleaned up the codebase from previous implementations that didn't work/scale well. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 42 +++++++++------- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 10 ---- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 7 +++ dev/kernel/HALKit/AMD64/HalKernelPanic.cc | 7 ++- dev/kernel/HALKit/ARM64/ApplicationProcessor.h | 2 +- dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc | 32 ++++++++---- dev/kernel/HALKit/ARM64/HalKernelMain.cc | 55 ++++++++++---------- dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc | 54 +------------------- dev/kernel/KernelKit/MemoryMgr.h | 5 -- dev/kernel/KernelKit/Timer.h | 12 ++--- dev/kernel/NewKit/Array.h | 5 +- dev/kernel/src/HardwareThreadScheduler.cc | 15 ------ dev/kernel/src/MemoryMgr.cc | 15 ------ dev/kernel/src/UserProcessScheduler.cc | 58 +++++++++++++--------- 14 files changed, 137 insertions(+), 182 deletions(-) (limited to 'dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc') diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index b12dc7fe..78db9b16 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -51,8 +51,7 @@ struct HAL_HARDWARE_THREAD; struct HAL_HARDWARE_THREAD final { HAL::StackFramePtr mFramePtr; - ProcessID mProcessID{0}; - UInt8 mCoreID{0}; + ProcessID mThreadID{0}; }; STATIC HAL_APIC_MADT* kMADTBlock = nullptr; @@ -100,18 +99,24 @@ Void hal_send_ipi_msg(UInt32 target, UInt32 apic_id, UInt8 vector) { STATIC HAL_HARDWARE_THREAD kHWThread[kSchedProcessLimitPerTeam] = {{}}; -EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 pid) { - const auto process_index = pid % kSchedProcessLimitPerTeam; +EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 thrdid) { + const auto process_index = thrdid % kSchedProcessLimitPerTeam; return kHWThread[process_index].mFramePtr; } -EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID pid) { - if (pid > kSMPCount) return NO; +EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID thrdid) { + if (thrdid > kSMPCount) return NO; if (mp_is_smp()) { - kHWThread[pid].mFramePtr = stack_frame; - kHWThread[pid].mProcessID = pid; + kHWThread[thrdid].mFramePtr = stack_frame; + kHWThread[thrdid].mThreadID = thrdid; + + STATIC HardwareTimer timer{rtl_milliseconds(1000)}; + + timer.Wait(); + + HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); return YES; } @@ -151,7 +156,14 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { PowerFactoryInterface hw_and_pow_int{vendor_ptr}; - kRawMADT = hw_and_pow_int.Find(APIC_MAG).Leak().Leak(); + auto pwr = hw_and_pow_int.Find(APIC_MAG); + + if (pwr.HasError()) { + kSMPAware = NO; + return; + } + + kRawMADT = pwr.Leak().Leak(); kMADTBlock = reinterpret_cast(kRawMADT); kSMPAware = NO; @@ -181,11 +193,6 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { controller.Write(LAPIC_REG_TIMER_LVT, 32 | (1 << 17)); controller.Write(LAPIC_REG_TIMER_INITCNT, 1000000); - UInt8* trampoline_phys = (UInt8*) 0x7c00; - - *trampoline_phys = 0xcd; - *(trampoline_phys + 1) = 0x00; - volatile UInt8* entry_ptr = reinterpret_cast(kMADTBlock->List); volatile UInt8* end_ptr = ((UInt8*) kMADTBlock) + kMADTBlock->Length; @@ -203,14 +210,15 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { kAPICLocales[kSMPCount] = entry_struct->ProcessorID; ++kSMPCount; - kout << "LAPIC type, also is on...\r"; + kout << "Kind: LAPIC: ON\r"; + // 0x7c00, as recommended by the Intel SDM. hal_send_ipi_msg(kApicBaseAddress, entry_struct->ProcessorID, 0x7c); } else { - kout << "LAPIC type, also is not on...\r"; + kout << "Kind: LAPIC: OFF\r"; } } else { - kout << "Unknown APIC type...\r"; + kout << "Kind: UNKNOWN: ?\r"; } entry_ptr += length; diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index eac6c389..51fc4f0e 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -54,8 +54,6 @@ EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) { Kernel::kout << "Kernel: SIGKILL status.\r"; process.Leak().Crash(); - - dbg_break_point(); } /// @brief Handle page fault. @@ -82,8 +80,6 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { process.Leak().Signal.Status = process.Leak().Status; process.Leak().Crash(); - - dbg_break_point(); } /// @brief Handle scheduler interrupt. @@ -125,8 +121,6 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { Kernel::kout << "Kernel: SIGKILL status.\r"; process.Leak().Crash(); - - dbg_break_point(); } /// @brief Handle any generic fault. @@ -155,8 +149,6 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { Kernel::kout << "Kernel: SIGKILL status.\r"; process.Leak().Crash(); - - dbg_break_point(); } EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { @@ -216,8 +208,6 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { Kernel::kout << "Kernel: SIGKILL status.\r"; process.Leak().Crash(); - - dbg_break_point(); } /// @brief Enter syscall from assembly. diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 6020da3b..4de43f27 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -108,6 +108,13 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Capacity(); ++index) { HardwareThreadScheduler::The()[index].Leak()->Kind() = ThreadKind::kAPStandard; + HardwareThreadScheduler::The()[index].Leak()->Busy(NO); + } + + for (SizeT index = 0UL; index < UserProcessScheduler::The().TheCurrentTeam().AsArray().Count(); + ++index) { + UserProcessScheduler::The().TheCurrentTeam().AsArray()[index].Status = + ProcessStatusKind::kInvalid; } rtl_create_user_process(sched_idle_task, "MgmtSrv"); //! Mgmt command server. diff --git a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc index 7ec235bd..76b92574 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc @@ -31,6 +31,7 @@ class RecoveryFactory final { /***********************************************************************************/ Void ke_panic(const Kernel::Int32& id, const Char* message) { (Void)(kout << "*** STOP ***\r"); + (Void)(kout << "Kernel_Panic_MSG: " << message << kendl); (Void)(kout << "Kernel_Panic_ID: " << hex_number(id) << kendl); (Void)(kout << "Kernel_Panic_CR2: " << hex_number((UIntPtr) hal_read_cr2()) << kendl); @@ -46,8 +47,10 @@ Void RecoveryFactory::Recover() noexcept { void ke_runtime_check(bool expr, const Char* file, const Char* line) { if (!expr) { - (Void)(kout << "Kernel_Panic_File: " << file << kendl); - (Void)(kout << "Kernel_Panic_Line: " << line << kendl); + (Void)(kout << "*** CHECK ***\r"); + + (Void)(kout << "Kernel_Panic_FILE: " << file << kendl); + (Void)(kout << "Kernel_Panic_LINE: " << line << kendl); ke_panic(RUNTIME_CHECK_FAILED, file); // Runtime Check failed } diff --git a/dev/kernel/HALKit/ARM64/ApplicationProcessor.h b/dev/kernel/HALKit/ARM64/ApplicationProcessor.h index 75f4eb07..06a8e2a8 100644 --- a/dev/kernel/HALKit/ARM64/ApplicationProcessor.h +++ b/dev/kernel/HALKit/ARM64/ApplicationProcessor.h @@ -15,5 +15,5 @@ /************************************************** */ namespace Kernel { -BOOL mp_initialize_gic(Kernel::Void); +Void mp_init_cores(Void) noexcept; } \ No newline at end of file diff --git a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc index a89702ea..d37a3e54 100644 --- a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc @@ -7,7 +7,9 @@ #include #include #include +#include #include +#include #define GICD_BASE 0x08000000 // Distributor base address #define GICC_BASE 0x08010000 // CPU interface base address @@ -29,11 +31,12 @@ // ================================================================= // namespace Kernel { -struct PROCESS_CONTROL_BLOCK final { +struct HAL_HARDWARE_THREAD final { HAL::StackFramePtr mFrame; + ProcessID mThreadID{0}; }; -STATIC PROCESS_CONTROL_BLOCK kProcessBlocks[kSchedProcessLimitPerTeam] = {0}; +STATIC HAL_HARDWARE_THREAD kHWThread[kMaxAPInsideSched] = {{nullptr}}; namespace Detail { STATIC BOOL kGICEnabled = NO; @@ -86,7 +89,7 @@ namespace Detail { const UInt16 kInterruptScheduler = 0x20; - (Void)(kout << "Handling interrupt for AP: " << interrupt << kendl); + (Void)(kout << "SMP: AP: " << hex_number(interrupt) << kendl); switch (interrupt) { case kInterruptScheduler: { @@ -108,23 +111,32 @@ namespace Detail { } } // namespace Detail -EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID pid) { - return kProcessBlocks[pid % kSchedProcessLimitPerTeam].mFrame; +EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID thrdid) { + return kHWThread[thrdid].mFrame; } -EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame, ProcessID pid) { - MUST_PASS(stack_frame); +EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame, ProcessID thrdid) { + MUST_PASS(Detail::kGICEnabled); - const auto process_index = pid % kSchedProcessLimitPerTeam; + if (!stack_frame) return NO; + if (thrdid > kMaxAPInsideSched) return NO; - kProcessBlocks[process_index].mFrame = stack_frame; + const auto process_index = thrdid; + + kHWThread[process_index].mFrame = stack_frame; + kHWThread[process_index].mThreadID = thrdid; + + STATIC HardwareTimer timer{rtl_milliseconds(1000)}; + timer.Wait(); + + HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); return YES; } /// @internal /// @brief Initialize the Global Interrupt Controller. -BOOL mp_initialize_gic(Void) { +Void mp_init_cores(Void) noexcept { if (!Detail::kGICEnabled) { Detail::kGICEnabled = YES; Detail::mp_setup_gic_el0(); diff --git a/dev/kernel/HALKit/ARM64/HalKernelMain.cc b/dev/kernel/HALKit/ARM64/HalKernelMain.cc index bf5849ef..c92b12cd 100644 --- a/dev/kernel/HALKit/ARM64/HalKernelMain.cc +++ b/dev/kernel/HALKit/ARM64/HalKernelMain.cc @@ -7,9 +7,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -18,9 +20,10 @@ #include #include -#include - +#ifndef __NE_MODULAR_KERNEL_COMPONENTS__ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { + using namespace Kernel; + /************************************************** */ /* INITIALIZE AND VALIDATE HEADER. */ /************************************************** */ @@ -32,6 +35,15 @@ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { return; } + FB::fb_clear_video(); + +#ifdef __NE_ARM64_EFI__ + fw_init_efi((EfiSystemTable*) handover_hdr->f_FirmwareCustomTables[1]); + + Boot::ExitBootServices(handover_hdr->f_HardwareTables.f_ImageKey, + handover_hdr->f_HardwareTables.f_ImageHandle); +#endif + /************************************** */ /* INITIALIZE BIT MAP. */ /************************************** */ @@ -42,31 +54,24 @@ EXTERN_C void hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { /// @note do initialize the interrupts after it. - Kernel::mp_initialize_gic(); - - /// after the scheduler runs, we must look over teams, every 5000s in order to schedule every - /// process according to their affinity fairly. - - auto constexpr kSchedTeamSwitchMS = 5U; /// @brief Team switch time in milliseconds. - - Kernel::HardwareTimer timer(rtl_milliseconds(kSchedTeamSwitchMS)); - - STATIC Kernel::Array kTeams; - - SizeT team_index = 0U; + for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Capacity(); ++index) { + HardwareThreadScheduler::The()[index].Leak()->Kind() = ThreadKind::kAPStandard; + HardwareThreadScheduler::The()[index].Leak()->Busy(NO); + } - /// @brief This just loops over the teams and switches between them. - /// @details Not even round-robin, just a simple loop in this boot core we're at. - while (YES) { - if (team_index > (kSchedTeamCount - 1)) { - team_index = 0U; - } + for (SizeT index = 0UL; index < UserProcessScheduler::The().TheCurrentTeam().AsArray().Count(); + ++index) { + UserProcessScheduler::The().TheCurrentTeam().AsArray()[index].Status = + ProcessStatusKind::kInvalid; + } - while (!UserProcessScheduler::The().SwitchTeam(kTeams[team_index])) - ; + rtl_create_user_process(sched_idle_task, "MgmtSrv"); //! Mgmt command server. + rtl_create_user_process(sched_idle_task, "LaunchSrv"); //! launchd + rtl_create_user_process(sched_idle_task, "SecSrv"); //! Login Server - timer.Wait(); + Kernel::mp_init_cores(); - ++team_index; - } + while (YES) + ; } +#endif \ No newline at end of file diff --git a/dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc b/dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc index e0b67489..faad6778 100644 --- a/dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc +++ b/dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc @@ -13,65 +13,15 @@ namespace Kernel::HAL { typedef UInt32 PageTableIndex; -/// \brief Page store type. -struct NE_PAGE_STORE final { - struct { - PDE* fPde{nullptr}; - PTE* fPte{nullptr}; - VoidPtr fVAddr{nullptr}; - } fInternalStore; - - Bool fStoreOp{No}; // Store operation in progress. - - static NE_PAGE_STORE& The() { - static NE_PAGE_STORE the; - return the; - } -}; - -/// \brief Retrieve the page status of a PTE. -STATIC Void mmi_page_status(PTE* pte) { - NE_UNUSED(pte); -} - -STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, PTE* pt_entry); - /// @brief Maps or allocates a page from virtual_address. /// @param virtual_address a valid virtual address. /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. /// @return Status code of page manipulation process. EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags) { - if (!virtual_address || !flags) return kErrorSuccess; - - NE_PAGE_STORE& page_store = NE_PAGE_STORE::The(); - - while (page_store.fStoreOp) - ; - - page_store.fStoreOp = Yes; - - if (page_store.fInternalStore.fVAddr == virtual_address) { - page_store.fStoreOp = No; - return mmi_map_page_table_entry(page_store.fInternalStore.fVAddr, flags, - page_store.fInternalStore.fPte); - } - - return kErrorSuccess; -} - -/// @brief Maps flags for a specific pte. -/// @internal Internal function. -STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, PTE* pt_entry) { - NE_PAGE_STORE& page_store = NE_PAGE_STORE::The(); - - // Update internal store, and tlbi the virtual address. - - page_store.fInternalStore.fPde = nullptr; - page_store.fInternalStore.fPte = pt_entry; - page_store.fInternalStore.fVAddr = virtual_address; + if (!virtual_address || !flags) return kErrorInvalidData; - page_store.fStoreOp = No; + NE_UNUSED(physical_address); return kErrorSuccess; } diff --git a/dev/kernel/KernelKit/MemoryMgr.h b/dev/kernel/KernelKit/MemoryMgr.h index d84dc9a4..bf389955 100644 --- a/dev/kernel/KernelKit/MemoryMgr.h +++ b/dev/kernel/KernelKit/MemoryMgr.h @@ -21,11 +21,6 @@ namespace Kernel { /// @return a status code regarding the deallocation. Int32 mm_delete_ptr(VoidPtr heap_ptr); -/// @brief Declare a new size for heap_ptr. -/// @param heap_ptr the pointer. -/// @return unsupported always returns nullptr. -VoidPtr mm_realloc_ptr(VoidPtr heap_ptr, SizeT new_sz); - /// @brief Check if pointer is a valid Kernel pointer. /// @param heap_ptr the pointer /// @return if it exists it returns true. diff --git a/dev/kernel/KernelKit/Timer.h b/dev/kernel/KernelKit/Timer.h index d6cfee39..2d040535 100644 --- a/dev/kernel/KernelKit/Timer.h +++ b/dev/kernel/KernelKit/Timer.h @@ -60,16 +60,16 @@ class HardwareTimer final : public TimerInterface { Int64 fWaitFor{0}; }; -inline Int64 rtl_microseconds(Int64 time) { - if (time < 0) return 0; +inline UInt64 rtl_microseconds(UInt64 time) { + if (time < 1) return 0; // TODO: nanoseconds maybe? - return kTimeUnit * time; + return time / kTimeUnit; } -inline Int64 rtl_milliseconds(Int64 time) { - if (time < 0) return 0; +inline UInt64 rtl_milliseconds(UInt64 time) { + if (time < 1) return 0; - return kTimeUnit * kTimeUnit * time; + return time; } } // namespace Kernel diff --git a/dev/kernel/NewKit/Array.h b/dev/kernel/NewKit/Array.h index 767d8678..2b6d31f3 100644 --- a/dev/kernel/NewKit/Array.h +++ b/dev/kernel/NewKit/Array.h @@ -26,7 +26,10 @@ class Array final { SizeT Capacity() { return N; } - SizeT Count() { return N; } + SizeT Count() { + const static SizeT kArrCnt = N; + return kArrCnt; // avoid constexpr error. + } const T* CData() { return fArray; } diff --git a/dev/kernel/src/HardwareThreadScheduler.cc b/dev/kernel/src/HardwareThreadScheduler.cc index 09c1c7d8..b801632c 100644 --- a/dev/kernel/src/HardwareThreadScheduler.cc +++ b/dev/kernel/src/HardwareThreadScheduler.cc @@ -57,19 +57,6 @@ ThreadKind& HardwareThread::Kind() noexcept { //! @return whether the thread is busy or not. /***********************************************************************************/ Bool HardwareThread::IsBusy() noexcept { - STATIC Int64 busy_timer = 0U; - constexpr Int64 kTimeoutMax = - 0x1000000; // an arbitrary value used to tell if the timeout hasn't been reached yet. - - if (fBusy && (busy_timer > kTimeoutMax)) { - busy_timer = 0U; - fBusy = No; - - return No; - } - - ++busy_timer; - return fBusy; } @@ -105,8 +92,6 @@ Void HardwareThread::Wake(const bool wakeup) noexcept { /// @retval false stack is invalid, previous code is running. /***********************************************************************************/ Bool HardwareThread::Switch(HAL::StackFramePtr frame) { - if (this->IsBusy()) return NO; - this->fStack = frame; Bool ret = mp_register_process(fStack, this->fPID); diff --git a/dev/kernel/src/MemoryMgr.cc b/dev/kernel/src/MemoryMgr.cc index f8aa14cf..efb9a35f 100644 --- a/dev/kernel/src/MemoryMgr.cc +++ b/dev/kernel/src/MemoryMgr.cc @@ -93,21 +93,6 @@ namespace Detail { STATIC PageMgr kPageMgr; -/// @brief Declare a new size for ptr_ptr. -/// @param ptr_ptr the pointer. -/// @return Newly allocated heap header. -_Output auto mm_realloc_ptr(VoidPtr ptr_ptr, SizeT new_sz) -> VoidPtr { - if (Detail::mm_check_ptr_address(ptr_ptr) == No) return nullptr; - - if (!ptr_ptr || new_sz < 1) return nullptr; - - kout << "MemoryMgr: This function is not implemented by the kernel yet.\r"; - - ke_panic(RUNTIME_CHECK_INVALID); - - return nullptr; -} - /// @brief Allocate chunk of memory. /// @param sz Size of pointer /// @param wr Read Write bit. diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 393f1419..0de38532 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -492,28 +492,24 @@ SizeT UserProcessScheduler::Run() noexcept { //! Check if the process needs to be run. if (UserProcessHelper::CanBeScheduled(process)) { - kout << ((*process.Name) ? process.Name : "USER_PROCESS") << " will be scheduled...\r"; - - process.PTime = static_cast(process.Affinity); - - if (process.PTime < process.RTime && AffinityKind::kRealTime != process.Affinity) { - if (process.RTime < (Int32) AffinityKind::kVeryHigh) - process.RTime = (Int32) AffinityKind::kLowUsage / 2; - else if (process.RTime < (Int32) AffinityKind::kHigh) - process.RTime = (Int32) AffinityKind::kStandard / 3; - else if (process.RTime < (Int32) AffinityKind::kStandard) - process.RTime = (Int32) AffinityKind::kHigh / 4; - - process.PTime -= process.RTime; - process.RTime = 0UL; - } - - if (!UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { - continue; + kout << process.Name << " will be scheduled...\r"; + + if (UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { + process.PTime = static_cast(process.Affinity); + + if (process.PTime < process.RTime && AffinityKind::kRealTime != process.Affinity) { + if (process.RTime < (Int32) AffinityKind::kVeryHigh) + process.RTime = (Int32) AffinityKind::kLowUsage / 2; + else if (process.RTime < (Int32) AffinityKind::kHigh) + process.RTime = (Int32) AffinityKind::kStandard / 3; + else if (process.RTime < (Int32) AffinityKind::kStandard) + process.RTime = (Int32) AffinityKind::kHigh / 4; + + process.PTime -= process.RTime; + process.RTime = 0UL; + } } } else { - kout << ((*process.Name) ? process.Name : "USER_PROCESS") << " will be scheduled later...\r"; - ++process.RTime; --process.PTime; } @@ -607,13 +603,19 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { (Void)(kout << "AP_" << hex_number(index) << kendl); + if (HardwareThreadScheduler::The()[index].Leak()->IsBusy()) { + (Void)(kout << "AP_" << hex_number(index)); + kout << " is busy\r"; + continue; + } + //////////////////////////////////////////////////////////// /// Prepare task switch. /// //////////////////////////////////////////////////////////// HardwareThreadScheduler::The()[index].Leak()->Busy(YES); + Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(frame_ptr); - HardwareThreadScheduler::The()[index].Leak()->Busy(NO); //////////////////////////////////////////////////////////// /// Rollback on fail. /// @@ -642,13 +644,23 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { /// @brief this checks if any process is on the team. //////////////////////////////////////////////////////////// UserProcessScheduler::operator bool() { - return mTeam.AsArray().Count() > 0; + for (auto process_index = 0UL; process_index < mTeam.AsArray().Count(); ++process_index) { + auto& process = mTeam.AsArray()[process_index]; + if (UserProcessHelper::CanBeScheduled(process)) return true; + } + + return false; } //////////////////////////////////////////////////////////// /// @brief this checks if no process is on the team. //////////////////////////////////////////////////////////// Bool UserProcessScheduler::operator!() { - return mTeam.AsArray().Count() == 0; + for (auto process_index = 0UL; process_index < mTeam.AsArray().Count(); ++process_index) { + auto& process = mTeam.AsArray()[process_index]; + if (UserProcessHelper::CanBeScheduled(process)) return false; + } + + return true; } } // namespace Kernel -- cgit v1.2.3 From c85a99c2afdd4c9dfa9d8f0f212e4625b6adade7 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 21 May 2025 03:45:08 +0200 Subject: feat(kernel): source code improvements. Signed-off-by: Amlal El Mahrouss --- compile_flags.txt | 1 - dev/boot/modules/SysChk/SysChk.cc | 1 + dev/boot/src/BootTextWriter.cc | 16 +++- dev/kernel/HALKit/AMD64/HalAPStartup.s | 12 +++ dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 67 ++++++++------- .../HALKit/AMD64/HalApplicationProcessorGNU.s | 8 -- .../AMD64/HalApplicationProcessorStartup.asm | 75 ----------------- dev/kernel/HALKit/AMD64/Paging.h | 4 + dev/kernel/HALKit/AMD64/Processor.h | 8 +- dev/kernel/HALKit/AMD64/make_ap_blob.sh | 3 - dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc | 97 ++++++++++------------ dev/kernel/HALKit/ARM64/HalCommonAPI.s | 9 ++ dev/kernel/HALKit/ARM64/HalFlushTLB.S | 9 -- dev/kernel/HALKit/ARM64/HalInterruptAPI.s | 3 + dev/kernel/HALKit/ARM64/HalTimerARM64.cc | 1 + dev/kernel/HALKit/ARM64/Paging.h | 4 + dev/kernel/HALKit/ARM64/Processor.h | 28 +++---- dev/kernel/KernelKit/KernelTaskScheduler.h | 5 +- setup_arm64.sh | 5 -- setup_arm64_project.sh | 5 ++ setup_x64.sh | 18 ---- setup_x64_project.sh | 16 ++++ tooling/mk_img.py | 10 +-- 23 files changed, 170 insertions(+), 235 deletions(-) create mode 100644 dev/kernel/HALKit/AMD64/HalAPStartup.s delete mode 100644 dev/kernel/HALKit/AMD64/HalApplicationProcessorGNU.s delete mode 100644 dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm delete mode 100755 dev/kernel/HALKit/AMD64/make_ap_blob.sh create mode 100644 dev/kernel/HALKit/ARM64/HalCommonAPI.s delete mode 100644 dev/kernel/HALKit/ARM64/HalFlushTLB.S create mode 100644 dev/kernel/HALKit/ARM64/HalInterruptAPI.s delete mode 100755 setup_arm64.sh create mode 100755 setup_arm64_project.sh delete mode 100755 setup_x64.sh create mode 100755 setup_x64_project.sh (limited to 'dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc') diff --git a/compile_flags.txt b/compile_flags.txt index b37b28ae..e9a887a3 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -21,7 +21,6 @@ -D__NE_ED__ -xc++ -D__AHCI__ --D__aarch64__ -DNE_USE_MBCI_FLASH -D__ATA_DMA__ -Wall diff --git a/dev/boot/modules/SysChk/SysChk.cc b/dev/boot/modules/SysChk/SysChk.cc index 4f71ee31..1601148e 100644 --- a/dev/boot/modules/SysChk/SysChk.cc +++ b/dev/boot/modules/SysChk/SysChk.cc @@ -34,6 +34,7 @@ EXTERN_C Int32 SysChkModuleMain(Kernel::HEL::BootInfoHeader* handover) { #elif defined(__AHCI__) Boot::BDiskFormatFactory partition_factory; #endif + if (partition_factory.IsPartitionValid()) return kEfiOk; return partition_factory.Format(kMachineModel); diff --git a/dev/boot/src/BootTextWriter.cc b/dev/boot/src/BootTextWriter.cc index 5e826c6d..6ffb7de6 100644 --- a/dev/boot/src/BootTextWriter.cc +++ b/dev/boot/src/BootTextWriter.cc @@ -24,6 +24,8 @@ @brief puts wrapper over EFI ConOut. */ Boot::BootTextWriter& Boot::BootTextWriter::Write(const CharacterTypeUTF16* str) { + NE_UNUSED(str); + #ifdef __DEBUG__ if (!str || *str == 0) return *this; @@ -50,6 +52,8 @@ Boot::BootTextWriter& Boot::BootTextWriter::Write(const CharacterTypeUTF16* str) /// @brief UTF-8 equivalent of Write (UTF-16). /// @param str the input string. Boot::BootTextWriter& Boot::BootTextWriter::Write(const Char* str) { + NE_UNUSED(str); + #ifdef __DEBUG__ if (!str || *str == 0) return *this; @@ -74,6 +78,8 @@ Boot::BootTextWriter& Boot::BootTextWriter::Write(const Char* str) { } Boot::BootTextWriter& Boot::BootTextWriter::Write(const UChar* str) { + NE_UNUSED(str); + #ifdef __DEBUG__ if (!str || *str == 0) return *this; @@ -101,6 +107,8 @@ Boot::BootTextWriter& Boot::BootTextWriter::Write(const UChar* str) { @brief putc wrapper over EFI ConOut. */ Boot::BootTextWriter& Boot::BootTextWriter::WriteCharacter(CharacterTypeUTF16 c) { + NE_UNUSED(c); + #ifdef __DEBUG__ EfiCharType str[2]; @@ -113,6 +121,8 @@ Boot::BootTextWriter& Boot::BootTextWriter::WriteCharacter(CharacterTypeUTF16 c) } Boot::BootTextWriter& Boot::BootTextWriter::Write(const UInt64& x) { + NE_UNUSED(x); + #ifdef __DEBUG__ this->_Write(x); this->Write("h"); @@ -122,6 +132,8 @@ Boot::BootTextWriter& Boot::BootTextWriter::Write(const UInt64& x) { } Boot::BootTextWriter& Boot::BootTextWriter::_Write(const UInt64& x) { + NE_UNUSED(x); + #ifdef __DEBUG__ UInt64 y = (x > 0 ? x : -x) / 16; UInt64 h = (x > 0 ? x : -x) % 16; @@ -136,9 +148,9 @@ Boot::BootTextWriter& Boot::BootTextWriter::_Write(const UInt64& x) { if (y == ~0UL) y = -y; - const char cNumbers[] = "0123456789ABCDEF"; + const char kNumberList[] = "0123456789ABCDEF"; - this->WriteCharacter(cNumbers[h]); + this->WriteCharacter(kNumberList[h]); #endif // ifdef __DEBUG__ return *this; diff --git a/dev/kernel/HALKit/AMD64/HalAPStartup.s b/dev/kernel/HALKit/AMD64/HalAPStartup.s new file mode 100644 index 00000000..ec17bf7b --- /dev/null +++ b/dev/kernel/HALKit/AMD64/HalAPStartup.s @@ -0,0 +1,12 @@ +.data + +.global hal_ap_blob_start +.global hal_ap_blob_length + +hal_ap_blob_start: + cli + hlt + jmp hal_ap_blob_start + +hal_ap_blob_length: + .long 4 diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 46ad8fd6..e4ad1024 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -4,21 +4,8 @@ ------------------------------------------- */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "NewKit/Defines.h" - #define APIC_MAG "APIC" -#define AP_BLOB_SIZE 126 - #define APIC_ICR_LOW 0x300 #define APIC_ICR_HIGH 0x310 #define APIC_SIPI_VEC 0x00500 @@ -35,6 +22,16 @@ #define APIC_BASE_MSR_BSP 0x100 #define APIC_BASE_MSR_ENABLE 0x800 +#include +#include +#include +#include +#include +#include +#include +#include +#include + /// @note: _hal_switch_context is internal /////////////////////////////////////////////////////////////////////////////////////// @@ -44,8 +41,6 @@ /////////////////////////////////////////////////////////////////////////////////////// namespace Kernel::HAL { -EXTERN_C Void sched_jump_to_task(HAL::StackFramePtr stack_frame); - struct HAL_APIC_MADT; struct HAL_HARDWARE_THREAD; @@ -54,6 +49,8 @@ struct HAL_HARDWARE_THREAD final { ProcessID mThreadID{0}; }; +EXTERN_C Void sched_jump_to_task(HAL::StackFramePtr stack_frame); + STATIC HAL_APIC_MADT* kMADTBlock = nullptr; STATIC Bool kSMPAware = false; STATIC Int64 kSMPCount = 0; @@ -64,6 +61,8 @@ STATIC Int32 kSMPInterrupt = 0; STATIC UInt64 kAPICLocales[kMaxAPInsideSched] = {0}; STATIC VoidPtr kRawMADT = nullptr; +STATIC HAL_HARDWARE_THREAD kHWThread[kSchedProcessLimitPerTeam] = {{}}; + /// @brief Multiple APIC Descriptor Table. struct HAL_APIC_MADT final SDT_OBJECT { UInt32 Address; // Madt address @@ -97,7 +96,10 @@ Void hal_send_ipi_msg(UInt32 target, UInt32 apic_id, UInt8 vector) { } } -STATIC HAL_HARDWARE_THREAD kHWThread[kSchedProcessLimitPerTeam] = {{}}; +/***********************************************************************************/ +/// @brief Get current stack frame for a thread. +/// @param thrdid The thread ID. +/***********************************************************************************/ EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 thrdid) { const auto process_index = thrdid % kSchedProcessLimitPerTeam; @@ -105,16 +107,28 @@ EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 thrdid) { return kHWThread[process_index].mFramePtr; } +/***********************************************************************************/ +/// @brief Register current stack frame for a thread. +/// @param stack_frame The current stack frame. +/// @param thrdid The thread ID. +/***********************************************************************************/ + EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID thrdid) { if (thrdid > kSMPCount) return NO; - if (mp_is_smp()) { - kHWThread[thrdid].mFramePtr = stack_frame; - kHWThread[thrdid].mThreadID = thrdid; + if (!mp_is_smp()) { + if (stack_frame) { + kHWThread[thrdid].mFramePtr = stack_frame; + kHWThread[thrdid].mThreadID = thrdid; + HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); - HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); + sched_jump_to_task(stack_frame); - sched_jump_to_task(stack_frame); + return YES; + } + } else { + kHWThread[thrdid].mFramePtr = stack_frame; + kHWThread[thrdid].mThreadID = thrdid; return YES; } @@ -130,20 +144,11 @@ Bool mp_is_smp(Void) noexcept { return kSMPAware; } -/***********************************************************************************/ -/// @brief Assembly symbol to bootstrap AP. -/***********************************************************************************/ -EXTERN_C Char* hal_ap_blob_start; - -/***********************************************************************************/ -/// @brief Assembly symbol to bootstrap AP. -/***********************************************************************************/ -EXTERN_C Char* hal_ap_blob_end; - /***********************************************************************************/ /// @brief Fetch and enable SMP scheduler. /// @param vendor_ptr SMP containing structure. /***********************************************************************************/ + Void mp_init_cores(VoidPtr vendor_ptr) noexcept { if (!vendor_ptr) return; diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessorGNU.s b/dev/kernel/HALKit/AMD64/HalApplicationProcessorGNU.s deleted file mode 100644 index a8ad3b76..00000000 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessorGNU.s +++ /dev/null @@ -1,8 +0,0 @@ -.data - -.global hal_ap_blob_start /* Export the start symbol */ -.global hal_ap_blob_end /* Export the end symbol */ - -hal_ap_blob_start: - .incbin "HALKit/AMD64/HalApplicationProcessorStartup.bin" -hal_ap_blob_end: diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm b/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm deleted file mode 100644 index 2adc8fed..00000000 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm +++ /dev/null @@ -1,75 +0,0 @@ -;; /* -;; * ======================================================== -;; * -;; * NeKernel -;; * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. -;; * -;; * 25/03/25: FIX: Fix warning regarding resb being used inside a non-bss area (using no-op instead). -;; * -;; * ======================================================== -;; */ - -[bits 16] -[org 0x7c00] - -hal_ap_start: - mov ax, 0x0 - mov ss, ax - mov esp, 0x7000 - - cli - mov eax, cr0 - or eax, 1 - mov cr0, eax - jmp .hal_ap_start_flush -.hal_ap_start_flush: - mov ax, 0x10 - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax - - mov eax, cr4 - or eax, 1 << 5 - mov cr4, eax - - mov eax, cr3 - mov cr3, eax - - mov ecx, 0xC0000080 - rdmsr - or eax, 1 - wrmsr - - mov eax, cr0 - or eax, (1 << 31) - mov cr0, eax - - jmp 0x08:hal_ap_64bit_entry -hal_ap_end: - -hal_ap_length: - dq hal_ap_end - hal_ap_start - -[bits 64] - -hal_ap_64bit_entry: - mov ax, 0x23 - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax - - mov rsp, rbx - - push 0x33 - lea rax, [hal_ap_64bit_entry_loop] - push rax - o64 pushf - - o64 iret - -hal_ap_64bit_entry_loop: - jmp $ diff --git a/dev/kernel/HALKit/AMD64/Paging.h b/dev/kernel/HALKit/AMD64/Paging.h index 061bae45..b73b8604 100644 --- a/dev/kernel/HALKit/AMD64/Paging.h +++ b/dev/kernel/HALKit/AMD64/Paging.h @@ -6,6 +6,8 @@ #pragma once +#ifdef __NE_AMD64__ + /** --------------------------------------------------- * THIS FILE CONTAINS CODE FOR X86_64 PAGING. @@ -85,3 +87,5 @@ struct PDE { ATTRIBUTE(aligned(kib_cast(4))) PTE fPTE[512]; }; } // namespace Kernel + +#endif // __NE_AMD64__ \ No newline at end of file diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index 8fb69c0c..c574f8d5 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -13,6 +13,8 @@ #pragma once +#ifdef __NE_AMD64__ + #include #include #include @@ -73,7 +75,7 @@ enum { kMMFlagsNX = 1 << 4, kMMFlagsPCD = 1 << 5, kMMFlagsPwt = 1 << 6, - kMMFlagsCount = 4, + kMMFlagsCount = 6, }; struct PACKED Register64 final { @@ -283,4 +285,6 @@ EXTERN_C ATTRIBUTE(naked) Kernel::Void hal_load_gdt(Kernel::HAL::Register64 ptr) inline Kernel::VoidPtr kKernelBitMpStart = nullptr; inline Kernel::UIntPtr kKernelBitMpSize = 0UL; -inline Kernel::VoidPtr kKernelCR3 = nullptr; \ No newline at end of file +inline Kernel::VoidPtr kKernelCR3 = nullptr; + +#endif // __NE_AMD64__ */ \ No newline at end of file diff --git a/dev/kernel/HALKit/AMD64/make_ap_blob.sh b/dev/kernel/HALKit/AMD64/make_ap_blob.sh deleted file mode 100755 index 3f079187..00000000 --- a/dev/kernel/HALKit/AMD64/make_ap_blob.sh +++ /dev/null @@ -1,3 +0,0 @@ -# !/bin/sh - -nasm -f bin HalApplicationProcessorStartup.asm -o HalApplicationProcessorStartup.bin \ No newline at end of file diff --git a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc index d37a3e54..5be41e4e 100644 --- a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc @@ -4,6 +4,23 @@ ------------------------------------------- */ +#define GICD_BASE 0x08000000 +#define GICC_BASE 0x08010000 + +#define GICD_CTLR 0x000 +#define GICD_ISENABLER 0x100 +#define GICD_ICENABLER 0x180 +#define GICD_ISPENDR 0x200 +#define GICD_ICPENDR 0x280 +#define GICD_IPRIORITYR 0x400 +#define GICD_ITARGETSR 0x800 +#define GICD_ICFGR 0xC00 + +#define GICC_CTLR 0x000 +#define GICC_PMR 0x004 +#define GICC_IAR 0x00C +#define GICC_EOIR 0x010 + #include #include #include @@ -11,28 +28,11 @@ #include #include -#define GICD_BASE 0x08000000 // Distributor base address -#define GICC_BASE 0x08010000 // CPU interface base address - -#define GICD_CTLR 0x000 // Distributor Control Register -#define GICD_ISENABLER 0x100 // Interrupt Set-Enable Registers -#define GICD_ICENABLER 0x180 // Interrupt Clear-Enable Registers -#define GICD_ISPENDR 0x200 // Interrupt Set-Pending Registers -#define GICD_ICPENDR 0x280 // Interrupt Clear-Pending Registers -#define GICD_IPRIORITYR 0x400 // Interrupt Priority Registers -#define GICD_ITARGETSR 0x800 // Interrupt Processor Targets Registers -#define GICD_ICFGR 0xC00 // Interrupt Configuration Registers - -#define GICC_CTLR 0x000 // CPU Interface Control Register -#define GICC_PMR 0x004 // Interrupt Priority Mask Register -#define GICC_IAR 0x00C // Interrupt Acknowledge Register -#define GICC_EOIR 0x010 // End of Interrupt Register - // ================================================================= // namespace Kernel { struct HAL_HARDWARE_THREAD final { - HAL::StackFramePtr mFrame; + HAL::StackFramePtr mFramePtr; ProcessID mThreadID{0}; }; @@ -41,49 +41,37 @@ STATIC HAL_HARDWARE_THREAD kHWThread[kMaxAPInsideSched] = {{nullptr}}; namespace Detail { STATIC BOOL kGICEnabled = NO; - STATIC void mp_hang_fn(void) { - while (YES) - ; - - dbg_break_point(); - } - - Void mp_setup_gic_el0(Void) { - // enable distributor. + /***********************************************************************************/ + /// @brief Enables the GIC with EL0 configuration. + /// @internal + /***********************************************************************************/ + STATIC Void mp_setup_gic_el0(Void) { ke_dma_write(GICD_BASE, GICD_CTLR, YES); UInt32 gicc_ctlr = ke_dma_read(GICC_BASE, GICC_CTLR); - const auto kEnableSignalInt = YES; + const UInt8 kEnableSignalInt = 0x1; - gicc_ctlr |= kEnableSignalInt; // Enable signaling of interrupts - gicc_ctlr |= (kEnableSignalInt << 1); // Allow Group 1 interrupts in EL0 + gicc_ctlr |= kEnableSignalInt; + gicc_ctlr |= (kEnableSignalInt << 0x1); ke_dma_write(GICC_BASE, GICC_CTLR, gicc_ctlr); - // Set priority mask (accept all priorities) ke_dma_write(GICC_BASE, GICC_PMR, 0xFF); UInt32 icfgr = ke_dma_read(GICD_BASE, GICD_ICFGR + (0x20 / 0x10) * 4); - icfgr |= (0x2 << ((32 % 16) * 2)); // Edge-triggered - ke_dma_write(GICD_BASE, GICD_ICFGR + (0x20 / 0x10) * 4, icfgr); + icfgr |= (0x2 << ((32 % 16) * 2)); - // Target interrupt 32 to CPU 1 + ke_dma_write(GICD_BASE, GICD_ICFGR + (0x20 / 0x10) * 4, icfgr); ke_dma_write(GICD_BASE, GICD_ITARGETSR + (0x20 / 0x04) * 4, 0x2 << ((32 % 4) * 8)); - - // Set interrupt 32 priority to lowest (0xFF) ke_dma_write(GICD_BASE, GICD_IPRIORITYR + (0x20 / 0x04) * 4, 0xFF << ((32 % 4) * 8)); - - // Enable interrupt 32 for AP. ke_dma_write(GICD_BASE, GICD_ISENABLER + 4, 0x01); } - BOOL mp_handle_gic_interrupt_el0(Void) { - // Read the interrupt ID + EXTERN_C BOOL mp_handle_gic_interrupt_el0(Void) { UInt32 interrupt_id = ke_dma_read(GICC_BASE, GICC_IAR); - // Check if it's a valid interrupt (not spurious) if ((interrupt_id & 0x3FF) < 1020) { auto interrupt = interrupt_id & 0x3FF; @@ -106,15 +94,25 @@ namespace Detail { return YES; } - // spurious interrupt return NO; } } // namespace Detail +/***********************************************************************************/ +/// @brief Get current stack frame for a thread. +/// @param thrdid The thread ID. +/***********************************************************************************/ + EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID thrdid) { - return kHWThread[thrdid].mFrame; + return kHWThread[thrdid].mFramePtr; } +/***********************************************************************************/ +/// @brief Register current stack frame for a thread. +/// @param stack_frame The current stack frame. +/// @param thrdid The thread ID. +/***********************************************************************************/ + EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame, ProcessID thrdid) { MUST_PASS(Detail::kGICEnabled); @@ -123,25 +121,20 @@ EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame, ProcessID thrd const auto process_index = thrdid; - kHWThread[process_index].mFrame = stack_frame; + kHWThread[process_index].mFramePtr = stack_frame; kHWThread[process_index].mThreadID = thrdid; - STATIC HardwareTimer timer{rtl_milliseconds(1000)}; - timer.Wait(); - - HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); - return YES; } -/// @internal +/***********************************************************************************/ /// @brief Initialize the Global Interrupt Controller. +/// @internal +/***********************************************************************************/ Void mp_init_cores(Void) noexcept { if (!Detail::kGICEnabled) { Detail::kGICEnabled = YES; Detail::mp_setup_gic_el0(); } - - return Detail::kGICEnabled; } } // namespace Kernel \ No newline at end of file diff --git a/dev/kernel/HALKit/ARM64/HalCommonAPI.s b/dev/kernel/HALKit/ARM64/HalCommonAPI.s new file mode 100644 index 00000000..e76b6e3f --- /dev/null +++ b/dev/kernel/HALKit/ARM64/HalCommonAPI.s @@ -0,0 +1,9 @@ +/* (c) 2024-2025 Amlal El Mahrouss */ + +.text + +.global hal_flush_tlb + +hal_flush_tlb: + tlbi + ret diff --git a/dev/kernel/HALKit/ARM64/HalFlushTLB.S b/dev/kernel/HALKit/ARM64/HalFlushTLB.S deleted file mode 100644 index e76b6e3f..00000000 --- a/dev/kernel/HALKit/ARM64/HalFlushTLB.S +++ /dev/null @@ -1,9 +0,0 @@ -/* (c) 2024-2025 Amlal El Mahrouss */ - -.text - -.global hal_flush_tlb - -hal_flush_tlb: - tlbi - ret diff --git a/dev/kernel/HALKit/ARM64/HalInterruptAPI.s b/dev/kernel/HALKit/ARM64/HalInterruptAPI.s new file mode 100644 index 00000000..cafebb7d --- /dev/null +++ b/dev/kernel/HALKit/ARM64/HalInterruptAPI.s @@ -0,0 +1,3 @@ +/* (c) 2024-2025 Amlal El Mahrouss */ + +.text diff --git a/dev/kernel/HALKit/ARM64/HalTimerARM64.cc b/dev/kernel/HALKit/ARM64/HalTimerARM64.cc index 32f64aec..2a595f11 100644 --- a/dev/kernel/HALKit/ARM64/HalTimerARM64.cc +++ b/dev/kernel/HALKit/ARM64/HalTimerARM64.cc @@ -12,3 +12,4 @@ ------------------------------------------- */ #include +#include \ No newline at end of file diff --git a/dev/kernel/HALKit/ARM64/Paging.h b/dev/kernel/HALKit/ARM64/Paging.h index 2eb02bc1..88eedcd8 100644 --- a/dev/kernel/HALKit/ARM64/Paging.h +++ b/dev/kernel/HALKit/ARM64/Paging.h @@ -12,6 +12,8 @@ ------------------------------------------------------- */ +#ifdef __NE_ARM64__ + #include #ifndef kPageMax @@ -101,3 +103,5 @@ typedef HAL::PDE_4KB PDE; } // namespace Kernel EXTERN_C void hal_flush_tlb(); + +#endif // __NE_ARM64__ \ No newline at end of file diff --git a/dev/kernel/HALKit/ARM64/Processor.h b/dev/kernel/HALKit/ARM64/Processor.h index 9f16d8f5..f52b854f 100644 --- a/dev/kernel/HALKit/ARM64/Processor.h +++ b/dev/kernel/HALKit/ARM64/Processor.h @@ -6,12 +6,14 @@ #pragma once +#ifdef __NE_ARM64__ + #include #include #include #include -#define kCPUBackendName "ARMv8" +#define kCPUBackendName "aarch64" namespace Kernel::HAL { struct PACKED Register64 final { @@ -21,11 +23,11 @@ struct PACKED Register64 final { /// @brief Memory Manager mapping flags. enum { - kMMFlagsPresent = 1 << 0, - kMMFlagsWr = 1 << 1, - kMMFlagsUser = 1 << 2, - kMMFlagsNX = 1 << 3, - kMMFlagsPCD = 1 << 4, + kMMFlagsInvalid = 1 << 0, + kMMFlagsPresent = 1 << 1, + kMMFlagsWr = 1 << 2, + kMMFlagsUser = 1 << 3, + kMMFlagsNX = 1 << 4, kMMFlagsCount = 4, }; @@ -62,16 +64,6 @@ inline Void rt_halt() noexcept { } } -template -inline void hal_dma_write(UIntPtr address, DataKind value) { - *reinterpret_cast(address) = value; -} - -template -inline DataKind hal_dma_read(UIntPtr address) { - return *reinterpret_cast(address); -} - inline Void hal_wfi(Void) { asm volatile("wfi"); } @@ -80,6 +72,8 @@ inline Void hal_wfi(Void) { inline Kernel::VoidPtr kKernelBitMpStart = nullptr; inline Kernel::UIntPtr kKernelBitMpSize = 0UL; -inline Kernel::VoidPtr kKernelPhysicalStart = nullptr; +inline Kernel::VoidPtr kKernelPDE = nullptr; #include + +#endif // __NE_ARM64__ \ No newline at end of file diff --git a/dev/kernel/KernelKit/KernelTaskScheduler.h b/dev/kernel/KernelKit/KernelTaskScheduler.h index 942cd8b4..f4ff4125 100644 --- a/dev/kernel/KernelKit/KernelTaskScheduler.h +++ b/dev/kernel/KernelKit/KernelTaskScheduler.h @@ -15,9 +15,8 @@ #include namespace Kernel { -struct KERNEL_TASK; - -struct KERNEL_TASK final { +class KERNEL_TASK final { +public: Char Name[kSchedNameLen] = {"KERNEL_TASK"}; ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemDriver}; HAL::StackFramePtr StackFrame{nullptr}; diff --git a/setup_arm64.sh b/setup_arm64.sh deleted file mode 100755 index ffc642d4..00000000 --- a/setup_arm64.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -cd dev/boot -make -f arm64-desktop.make efi -make -f arm64-desktop.make epm-img \ No newline at end of file diff --git a/setup_arm64_project.sh b/setup_arm64_project.sh new file mode 100755 index 00000000..ffc642d4 --- /dev/null +++ b/setup_arm64_project.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +cd dev/boot +make -f arm64-desktop.make efi +make -f arm64-desktop.make epm-img \ No newline at end of file diff --git a/setup_x64.sh b/setup_x64.sh deleted file mode 100755 index 5eeaafde..00000000 --- a/setup_x64.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -# LOG HISTORY: -# 03/25/25: Add 'disk' build step. -# 04/05/25: Improve and fix script. - -cd dev/user -cd src -make sci_asm_io_x64 -cd .. -btb user.json -cd ../ddk -btb ddk.json -cd ../boot -make -f amd64-desktop.make efi -make -f amd64-desktop.make epm-img -cd ../../dev/kernel/HALKit/AMD64 -./make_ap_blob.sh diff --git a/setup_x64_project.sh b/setup_x64_project.sh new file mode 100755 index 00000000..a6115ba7 --- /dev/null +++ b/setup_x64_project.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# LOG HISTORY: +# 03/25/25: Add 'disk' build step. +# 04/05/25: Improve and fix script. + +cd dev/user +cd src +make sci_asm_io_x64 +cd .. +btb user.json +cd ../ddk +btb ddk.json +cd ../boot +make -f amd64-desktop.make efi +make -f amd64-desktop.make epm-img diff --git a/tooling/mk_img.py b/tooling/mk_img.py index 8227a217..539353fc 100755 --- a/tooling/mk_img.py +++ b/tooling/mk_img.py @@ -24,14 +24,6 @@ def copy_to_fat(image_path, source_dir): command = ["mcopy", "-spm", "-i", image_path] + files_to_copy + ["::"] subprocess.run(command, check=True) - - print(f"Info: Successfully copied contents of '{source_dir}' into '{image_path}'") - except FileNotFoundError: - print("Error: mcopy is not installed. Please install mtools.") - sys.exit(1) - except subprocess.CalledProcessError as e: - print(f"Error: mcopy failed with error code {e.returncode}.") - sys.exit(1) except Exception as e: print(f"Error: failed: {e}") sys.exit(1) @@ -46,4 +38,4 @@ if __name__ == "__main__": copy_to_fat(image_path, source_dir) - print("NeKernel image created successfully.") + print("Info: image created successfully.") -- cgit v1.2.3 From 58d2af14429be02b580cde5b3e23978530d8ab74 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 21 May 2025 10:19:07 +0200 Subject: feat(kernel): Architectural changes, and introducing a kKernelVM. see code for more details. Signed-off-by: Amlal El Mahrouss --- dev/boot/src/BootThread.cc | 3 ++ dev/boot/src/HEL/AMD64/BootEFI.cc | 2 +- dev/kernel/ArchKit/ArchKit.h | 8 +++- dev/kernel/FirmwareKit/Handover.h | 2 + dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 22 +++------- dev/kernel/HALKit/AMD64/HalCommonAPI.asm | 48 +++++++++++++++----- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 51 +--------------------- dev/kernel/HALKit/AMD64/HalInterruptAPI.asm | 22 ---------- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 27 ++++++++++-- dev/kernel/HALKit/AMD64/Processor.h | 2 - dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc | 2 +- dev/kernel/HALKit/ARM64/Processor.h | 2 - dev/kernel/KernelKit/KernelTaskScheduler.h | 2 +- dev/kernel/src/HardwareThreadScheduler.cc | 4 +- dev/kernel/src/UserProcessScheduler.cc | 23 +++++++--- 15 files changed, 100 insertions(+), 120 deletions(-) (limited to 'dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc') diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc index ada864bb..b502b52e 100644 --- a/dev/boot/src/BootThread.cc +++ b/dev/boot/src/BootThread.cc @@ -175,6 +175,9 @@ Int32 BootThread::Start(HEL::BootInfoHeader* handover, Bool own_stack) { writer.Write("BootZ: Stack address: ").Write((UIntPtr) &fStack[mib_cast(16) - 1]).Write("\r"); writer.Write("BootZ: Stack size: ").Write(mib_cast(16)).Write("\r"); + fHandover->f_StackTop = &fStack[mib_cast(16) - 1]; + fHandover->f_StackSz = mib_cast(16); + auto ret = rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(16) - 1]); // we don't need the stack anymore. diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc index 45566d6c..33dfd3ca 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -243,7 +243,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa handover_hdr->f_KernelImage = reader_kernel.Blob(); handover_hdr->f_KernelSz = reader_kernel.Size(); - kernel_thread.Start(handover_hdr, NO); + kernel_thread.Start(handover_hdr, YES); } Boot::BootFileReader reader_netboot(L"net.efi", image_handle); diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index 41a36e69..d511658f 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -77,8 +77,14 @@ struct HalSyscallEntry final { operator bool() { return fHooked; } }; +EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_context(Kernel::Int64 pid); + inline Kernel::Array kSysCalls; inline Kernel::Array kKernCalls; -EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_context(Kernel::Int64 pid); +#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ + +inline Kernel::VoidPtr kKernelVM = nullptr; + +#endif // __NE_VIRTUAL_MEMORY_SUPPORT__ \ No newline at end of file diff --git a/dev/kernel/FirmwareKit/Handover.h b/dev/kernel/FirmwareKit/Handover.h index d3ccc724..cda27e52 100644 --- a/dev/kernel/FirmwareKit/Handover.h +++ b/dev/kernel/FirmwareKit/Handover.h @@ -63,6 +63,8 @@ struct BootInfoHeader final { SizeT f_KernelSz; VoidPtr f_StartupImage; SizeT f_StartupSz; + VoidPtr f_StackTop; + SizeT f_StackSz; WideChar f_FirmwareVendorName[32]; SizeT f_FirmwareVendorLen; diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index e4ad1024..ada2ee3f 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -113,27 +113,17 @@ EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 thrdid) { /// @param thrdid The thread ID. /***********************************************************************************/ -EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID thrdid) { +EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ProcessID thrdid) { if (thrdid > kSMPCount) return NO; - if (!mp_is_smp()) { - if (stack_frame) { - kHWThread[thrdid].mFramePtr = stack_frame; - kHWThread[thrdid].mThreadID = thrdid; - HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); + kHWThread[thrdid].mFramePtr = stack_frame; + kHWThread[thrdid].mThreadID = thrdid; - sched_jump_to_task(stack_frame); + HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); - return YES; - } - } else { - kHWThread[thrdid].mFramePtr = stack_frame; - kHWThread[thrdid].mThreadID = thrdid; - - return YES; - } + sched_jump_to_task(stack_frame); - return NO; + return YES; } /***********************************************************************************/ diff --git a/dev/kernel/HALKit/AMD64/HalCommonAPI.asm b/dev/kernel/HALKit/AMD64/HalCommonAPI.asm index 230f50ed..d0ce2418 100644 --- a/dev/kernel/HALKit/AMD64/HalCommonAPI.asm +++ b/dev/kernel/HALKit/AMD64/HalCommonAPI.asm @@ -56,6 +56,8 @@ extern hal_system_call_enter global mp_system_call_handler mp_system_call_handler: + push rbp + mov rbp, rsp push r8 push r9 @@ -77,7 +79,9 @@ mp_system_call_handler: pop r9 pop r8 - o64 sysret + pop rbp + + o64 iret section .text @@ -88,12 +92,40 @@ sched_jump_to_task: push rbp mov rbp, rsp - mov ax, 0x20 + mov ax, 0x30 mov ds, ax mov es, ax mov fs, ax mov gs, ax + mov ax, 0x18 + ltr ax + + push 0x30 + mov rdx, [rcx + 0x08] + push rdx + o64 pushf + push 0x28 + mov rdx, [rcx + 0x00] + push rdx + + call sched_recover_registers + + o64 iret + +global sched_idle_task + +sched_idle_task: + mov ax, cs + and ax, 3 + + jmp $ + ret + +sched_recover_registers: + push rbp + mov rbp, rsp + mov r8, [rcx + 0x10] mov r9, [rcx + 0x18] mov r10, [rcx + 0x20] @@ -103,14 +135,6 @@ sched_jump_to_task: mov r14, [rcx + 0x40] mov r15, [rcx + 0x48] - mov rax, [rcx + 0x00] - mov rsp, [rcx + 0x08] - - o64 sysret - int 3 ;; Never continue here. + pop rbp -global sched_idle_task - -sched_idle_task: - jmp $ - ret + ret \ No newline at end of file diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index 51fc4f0e..633adccb 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -37,14 +37,6 @@ EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) { auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - if (!process) { - ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "General Access Fault."); - } - if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || - process.Leak().Signal.SignalID == SIGTRAP) { - dbg_break_point(); - } - Kernel::kout << "Kernel: General Access Fault.\r"; process.Leak().Signal.SignalArg = rsp; @@ -63,15 +55,6 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - if (!process) { - ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "Access Fault."); - } - - if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || - process.Leak().Signal.SignalID == SIGTRAP) { - dbg_break_point(); - } - Kernel::kout << "Kernel: Page Fault.\r"; Kernel::kout << "Kernel: SIGKILL\r"; @@ -104,14 +87,6 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - if (!process) { - ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "Math Fault."); - } - if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || - process.Leak().Signal.SignalID == SIGTRAP) { - dbg_break_point(); - } - Kernel::kout << "Kernel: Math error (division by zero?).\r"; process.Leak().Signal.SignalArg = rsp; @@ -130,15 +105,6 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - if (!process) { - ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "Generic Fault."); - } - - if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || - process.Leak().Signal.SignalID == SIGTRAP) { - dbg_break_point(); - } - (Void)(Kernel::kout << "Kernel: Process RSP: " << Kernel::hex_number(rsp) << Kernel::kendl); Kernel::kout << "Kernel: Access Process Fault.\r"; @@ -152,19 +118,9 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { } EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { - auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - - if (!process) { - while (YES) - ; - } - hal_idt_send_eoi(3); - if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || - process.Leak().Signal.SignalID == SIGTRAP) { - dbg_break_point(); - } + auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); (Void)(Kernel::kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << Kernel::kendl); @@ -189,11 +145,6 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { auto& process = Kernel::UserProcessScheduler::The().TheCurrentProcess(); - if (!process) { - while (YES) - ; - } - if (process.Leak().Signal.SignalID == SIGKILL || process.Leak().Signal.SignalID == SIGABRT || process.Leak().Signal.SignalID == SIGTRAP) { dbg_break_point(); diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm index a6b194d3..5e82f969 100644 --- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -20,8 +20,6 @@ __NE_INT_%1: std - add rsp, 8 - o64 iret %endmacro @@ -61,8 +59,6 @@ __NE_INT_0: std - add rsp, 8 - o64 iret __NE_INT_1: @@ -83,8 +79,6 @@ __NE_INT_2: std - add rsp, 8 - o64 iret ;; @brief Triggers a breakpoint and freeze the process. RIP is also fetched. @@ -96,8 +90,6 @@ __NE_INT_3: std - add rsp, 8 - o64 iret __NE_INT_4: @@ -109,16 +101,12 @@ __NE_INT_4: std - add rsp, 8 - o64 iret __NE_INT_5: cld std - add rsp, 8 - o64 iret ;; Invalid opcode interrupt @@ -130,8 +118,6 @@ __NE_INT_6: std - add rsp, 8 - o64 iret __NE_INT_7: @@ -142,8 +128,6 @@ __NE_INT_7: std - add rsp, 8 - o64 iret ;; Invalid opcode interrupt @@ -156,8 +140,6 @@ __NE_INT_8: std - add rsp, 8 - o64 iret IntNormal 9 @@ -187,8 +169,6 @@ __NE_INT_14: std - add rsp, 8 - o64 iret IntNormal 15 @@ -247,8 +227,6 @@ __NE_INT_40: std - add rsp, 8 - o64 iret IntNormal 41 diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 4de43f27..5394645a 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -38,9 +38,9 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { Boot::ExitBootServices(handover_hdr->f_HardwareTables.f_ImageKey, handover_hdr->f_HardwareTables.f_ImageHandle); - kKernelCR3 = kHandoverHeader->f_PageStart; + kKernelVM = kHandoverHeader->f_PageStart; - hal_write_cr3(kKernelCR3); + hal_write_cr3(kKernelVM); /************************************** */ /* INITIALIZE BIT MAP. */ @@ -54,7 +54,12 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { /* INITIALIZE GDT AND SEGMENTS. */ /************************************** */ - STATIC CONST auto kGDTEntriesCount = 6; + STATIC CONST auto kGDTEntriesCount = 8; + + STATIC HAL::Detail::NE_TSS kKernelTSS{}; + + kKernelTSS.fRsp0 = (UInt64) kHandoverHeader->f_StackTop; + kKernelTSS.fIopb = sizeof(HAL::Detail::NE_TSS); /* The GDT, mostly descriptors for user and kernel segments. */ STATIC Kernel::HAL::Detail::NE_GDT_ENTRY ALIGN(0x08) kGDTArray[kGDTEntriesCount] = { @@ -76,6 +81,8 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { .fAccessByte = 0x92, .fFlags = 0xCF, .fBaseHigh = 0}, // Kernel data + {}, // TSS data low + {}, // TSS data high {.fLimitLow = 0x0, .fBaseLow = 0, .fBaseMid = 0, @@ -90,6 +97,20 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { .fBaseHigh = 0}, // User data }; + kGDTArray[3].fLimitLow = sizeof(HAL::Detail::NE_TSS) - 1; + kGDTArray[3].fBaseLow = ((UIntPtr) &kKernelTSS) & 0xFFFF; + kGDTArray[3].fBaseMid = (((UIntPtr) &kKernelTSS) >> 16) & 0xFF; + kGDTArray[3].fAccessByte = 0x89; // Present, type 9 = 64-bit available TSS + kGDTArray[3].fFlags = 0x20 | ((((UIntPtr) &kKernelTSS) >> 24) & 0x0F); + kGDTArray[3].fBaseHigh = (((UIntPtr) &kKernelTSS) >> 24) & 0xFF; + + kGDTArray[4].fLimitLow = ((UIntPtr) &kKernelTSS >> 32) & 0xFFFF; + kGDTArray[4].fBaseLow = 0; + kGDTArray[4].fBaseMid = 0; + kGDTArray[4].fAccessByte = 0; + kGDTArray[4].fFlags = 0; + kGDTArray[4].fBaseHigh = 0; + // Load memory descriptors. Kernel::HAL::Register64 gdt_reg; diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index c574f8d5..3bf0ad3e 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -285,6 +285,4 @@ EXTERN_C ATTRIBUTE(naked) Kernel::Void hal_load_gdt(Kernel::HAL::Register64 ptr) inline Kernel::VoidPtr kKernelBitMpStart = nullptr; inline Kernel::UIntPtr kKernelBitMpSize = 0UL; -inline Kernel::VoidPtr kKernelCR3 = nullptr; - #endif // __NE_AMD64__ */ \ No newline at end of file diff --git a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc index 5be41e4e..70a5e2d9 100644 --- a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc @@ -113,7 +113,7 @@ EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID thrdid) { /// @param thrdid The thread ID. /***********************************************************************************/ -EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame, ProcessID thrdid) { +EXTERN_C Bool mp_register_task(HAL::StackFramePtr stack_frame, ProcessID thrdid) { MUST_PASS(Detail::kGICEnabled); if (!stack_frame) return NO; diff --git a/dev/kernel/HALKit/ARM64/Processor.h b/dev/kernel/HALKit/ARM64/Processor.h index f52b854f..ba1ed11e 100644 --- a/dev/kernel/HALKit/ARM64/Processor.h +++ b/dev/kernel/HALKit/ARM64/Processor.h @@ -72,8 +72,6 @@ inline Void hal_wfi(Void) { inline Kernel::VoidPtr kKernelBitMpStart = nullptr; inline Kernel::UIntPtr kKernelBitMpSize = 0UL; -inline Kernel::VoidPtr kKernelPDE = nullptr; - #include #endif // __NE_ARM64__ \ No newline at end of file diff --git a/dev/kernel/KernelKit/KernelTaskScheduler.h b/dev/kernel/KernelKit/KernelTaskScheduler.h index f4ff4125..57b83ccb 100644 --- a/dev/kernel/KernelKit/KernelTaskScheduler.h +++ b/dev/kernel/KernelKit/KernelTaskScheduler.h @@ -16,7 +16,7 @@ namespace Kernel { class KERNEL_TASK final { -public: + public: Char Name[kSchedNameLen] = {"KERNEL_TASK"}; ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemDriver}; HAL::StackFramePtr StackFrame{nullptr}; diff --git a/dev/kernel/src/HardwareThreadScheduler.cc b/dev/kernel/src/HardwareThreadScheduler.cc index b801632c..23365af5 100644 --- a/dev/kernel/src/HardwareThreadScheduler.cc +++ b/dev/kernel/src/HardwareThreadScheduler.cc @@ -21,7 +21,7 @@ namespace Kernel { /***********************************************************************************/ EXTERN_C Bool hal_check_stack(HAL::StackFramePtr frame); -EXTERN_C Bool mp_register_process(HAL::StackFramePtr frame, ProcessID pid); +EXTERN_C Bool mp_register_task(HAL::StackFramePtr frame, ProcessID pid); STATIC HardwareThreadScheduler kHardwareThreadScheduler; @@ -94,7 +94,7 @@ Void HardwareThread::Wake(const bool wakeup) noexcept { Bool HardwareThread::Switch(HAL::StackFramePtr frame) { this->fStack = frame; - Bool ret = mp_register_process(fStack, this->fPID); + Bool ret = mp_register_task(fStack, this->fPID); return ret; } diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 0de38532..a901e6d0 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -21,6 +21,7 @@ #include #include #include +#include "NewKit/Macros.h" ///! BUGS: 0 @@ -125,7 +126,7 @@ ErrorOr USER_PROCESS::New(SizeT sz, SizeT pad_amount) { if (this->UsedMemory > kSchedMaxMemoryLimit) return ErrorOr(-kErrorHeapOutOfMemory); #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - auto vm_register = kKernelCR3; + auto vm_register = kKernelVM; hal_write_cr3(this->VMRegister); auto ptr = mm_new_ptr(sz, Yes, Yes, pad_amount); @@ -271,7 +272,7 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { auto memory_ptr_list = this->HeapTree; #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - auto pd = kKernelCR3; + auto pd = kKernelVM; hal_write_cr3(this->VMRegister); #endif @@ -384,7 +385,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im rt_copy_memory(reinterpret_cast(const_cast(name)), process.Name, len); #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - process.VMRegister = kKernelCR3; + process.VMRegister = kKernelVM; #else process.VMRegister = 0UL; #endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ @@ -401,6 +402,15 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im process.StackFrame->IP = reinterpret_cast(code); process.StackFrame->SP = reinterpret_cast(&process.StackReserve[0] + process.StackSize); +#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ + HAL::mm_map_page((VoidPtr) process.StackFrame->IP, + (VoidPtr) HAL::mm_get_phys_address((VoidPtr) process.StackFrame->IP), + HAL::kMMFlagsUser | HAL::kMMFlagsPresent); + HAL::mm_map_page((VoidPtr) process.StackFrame->SP, + (VoidPtr) HAL::mm_get_phys_address((VoidPtr) process.StackFrame->SP), + HAL::kMMFlagsUser | HAL::kMMFlagsPresent); +#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ + process.StackSize = kSchedMaxStackSz; rt_set_memory(process.StackReserve, 0, process.StackSize); @@ -494,6 +504,8 @@ SizeT UserProcessScheduler::Run() noexcept { if (UserProcessHelper::CanBeScheduled(process)) { kout << process.Name << " will be scheduled...\r"; + this->TheCurrentProcess() = process; + if (UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { process.PTime = static_cast(process.Affinity); @@ -606,6 +618,7 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { if (HardwareThreadScheduler::The()[index].Leak()->IsBusy()) { (Void)(kout << "AP_" << hex_number(index)); kout << " is busy\r"; + continue; } @@ -627,10 +640,6 @@ Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid].PTime; - HardwareThreadScheduler::The()[index].Leak()->Wake(YES); - - UserProcessScheduler::The().TheCurrentProcess() = - UserProcessScheduler::The().TheCurrentTeam().AsArray()[new_pid]; return YES; } -- cgit v1.2.3 From 8dd831a5bff24ba599c1ba8ff49e9d094756ea7c Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 26 May 2025 04:57:17 +0200 Subject: fix(HAL/AP): Fix task getter function inside AP system. why: - It used to modulo the index value, which will index an invalid index. - Also refactored the function name to mp_get_current_task. Signed-off-by: Amlal El Mahrouss --- dev/kernel/ArchKit/ArchKit.h | 2 +- dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 5 +++-- dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) (limited to 'dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc') diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index 3254bae7..08e8ab88 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -77,7 +77,7 @@ struct HalSyscallEntry final { operator bool() { return fHooked; } }; -EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_context(Kernel::Int64 pid); +EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_task(Kernel::Int64 pid); inline Kernel::Array kSysCalls; diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 2ce05e7c..1d298698 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -101,8 +101,9 @@ Void hal_send_ipi_msg(UInt32 target, UInt32 apic_id, UInt8 vector) { /// @param thrdid The thread ID. /***********************************************************************************/ -EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 thrdid) { - const auto process_index = thrdid % kSchedProcessLimitPerTeam; +EXTERN_C HAL::StackFramePtr mp_get_current_task(Int64 thrdid) { + const auto process_index = thrdid; + if (thrdid > kSMPCount) return nullptr; return kHWThread[process_index].mFramePtr; } diff --git a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc index 70a5e2d9..02f09e23 100644 --- a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc @@ -103,7 +103,7 @@ namespace Detail { /// @param thrdid The thread ID. /***********************************************************************************/ -EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID thrdid) { +EXTERN_C HAL::StackFramePtr mp_get_current_task(ProcessID thrdid) { return kHWThread[thrdid].mFramePtr; } -- cgit v1.2.3