summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit/ARM64
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-05-29 10:51:53 +0200
committerGitHub <noreply@github.com>2025-05-29 10:51:53 +0200
commit5c0bb7ee7b1b0fee02cc179fb21f4c57a61d6c2d (patch)
treecb17577bcdc9714c97a84ce417a075117097f146 /dev/kernel/HALKit/ARM64
parentd608230b1350b064ceb01e6572519b108f6139b0 (diff)
parent3167f59dbb401d6a79b1524537e04218baf49ee3 (diff)
Merge pull request #32 from nekernel-org/dev
0.0.2e3
Diffstat (limited to 'dev/kernel/HALKit/ARM64')
-rw-r--r--dev/kernel/HALKit/ARM64/ApplicationProcessor.h7
-rw-r--r--dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc4
-rw-r--r--dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc115
-rw-r--r--dev/kernel/HALKit/ARM64/HalApplicationProcessorStartup.s12
-rw-r--r--dev/kernel/HALKit/ARM64/HalCommonAPI.s (renamed from dev/kernel/HALKit/ARM64/HalFlushTLB.S)0
-rw-r--r--dev/kernel/HALKit/ARM64/HalDebugOutput.cc4
-rw-r--r--dev/kernel/HALKit/ARM64/HalInterruptAPI.s3
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelMain.cc59
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelPanic.cc6
-rw-r--r--dev/kernel/HALKit/ARM64/HalPagingMgr.cc28
-rw-r--r--dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc78
-rw-r--r--dev/kernel/HALKit/ARM64/HalSchedulerCore.cc (renamed from dev/kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc)0
-rw-r--r--dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc (renamed from dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc)2
-rw-r--r--dev/kernel/HALKit/ARM64/HalTimer.cc (renamed from dev/kernel/HALKit/ARM64/HalTimerARM64.cc)1
-rw-r--r--dev/kernel/HALKit/ARM64/Paging.h6
-rw-r--r--dev/kernel/HALKit/ARM64/Processor.h58
16 files changed, 179 insertions, 204 deletions
diff --git a/dev/kernel/HALKit/ARM64/ApplicationProcessor.h b/dev/kernel/HALKit/ARM64/ApplicationProcessor.h
index f48c1483..3d472bf0 100644
--- a/dev/kernel/HALKit/ARM64/ApplicationProcessor.h
+++ b/dev/kernel/HALKit/ARM64/ApplicationProcessor.h
@@ -7,12 +7,13 @@
#pragma once
#include <HALKit/ARM64/Processor.h>
-#include <NewKit/Defines.h>
+#include <NeKit/Defines.h>
/************************************************** */
-/* INITIALIZE THE GIC ON CPU. */
+/* INITIALIZE THE GIC ON THE CURRENT CORE. */
+/* WITH AN EXECUTION LEVEL IN MIND. */
/************************************************** */
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/HalACPIFactoryInterface.cc b/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc
index 31f5a4f2..dc883239 100644
--- a/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc
+++ b/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc
@@ -5,8 +5,8 @@
------------------------------------------- */
#include <ArchKit/ArchKit.h>
-#include <KernelKit/MemoryMgr.h>
-#include <NewKit/KString.h>
+#include <KernelKit/HeapMgr.h>
+#include <NeKit/KString.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
#include <modules/APM/APM.h>
diff --git a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
index 7e55aa07..02f09e23 100644
--- a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
@@ -4,89 +4,80 @@
------------------------------------------- */
+#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 <HALKit/ARM64/ApplicationProcessor.h>
#include <HALKit/ARM64/Processor.h>
#include <KernelKit/DebugOutput.h>
+#include <KernelKit/HardwareThreadScheduler.h>
#include <KernelKit/ProcessScheduler.h>
-
-#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
+#include <KernelKit/Timer.h>
// ================================================================= //
namespace Kernel {
-struct PROCESS_CONTROL_BLOCK final {
- HAL::StackFramePtr mFrame;
+struct HAL_HARDWARE_THREAD final {
+ HAL::StackFramePtr mFramePtr;
+ ProcessID mThreadID{0};
};
-STATIC PROCESS_CONTROL_BLOCK kProcessBlocks[kSchedProcessLimitPerTeam] = {0};
+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<UInt32>(GICD_BASE, GICD_CTLR, YES);
UInt32 gicc_ctlr = ke_dma_read<UInt32>(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<UInt32>(GICC_BASE, GICC_CTLR, gicc_ctlr);
- // Set priority mask (accept all priorities)
ke_dma_write<UInt32>(GICC_BASE, GICC_PMR, 0xFF);
UInt32 icfgr = ke_dma_read<UInt32>(GICD_BASE, GICD_ICFGR + (0x20 / 0x10) * 4);
- icfgr |= (0x2 << ((32 % 16) * 2)); // Edge-triggered
- ke_dma_write<UInt32>(GICD_BASE, GICD_ICFGR + (0x20 / 0x10) * 4, icfgr);
+ icfgr |= (0x2 << ((32 % 16) * 2));
- // Target interrupt 32 to CPU 1
+ ke_dma_write<UInt32>(GICD_BASE, GICD_ICFGR + (0x20 / 0x10) * 4, icfgr);
ke_dma_write<UInt32>(GICD_BASE, GICD_ITARGETSR + (0x20 / 0x04) * 4, 0x2 << ((32 % 4) * 8));
-
- // Set interrupt 32 priority to lowest (0xFF)
ke_dma_write<UInt32>(GICD_BASE, GICD_IPRIORITYR + (0x20 / 0x04) * 4, 0xFF << ((32 % 4) * 8));
-
- // Enable interrupt 32 for AP.
ke_dma_write<UInt32>(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<UInt32>(GICC_BASE, GICC_IAR);
- // Check if it's a valid interrupt (not spurious)
if ((interrupt_id & 0x3FF) < 1020) {
auto interrupt = interrupt_id & 0x3FF;
const UInt16 kInterruptScheduler = 0x20;
- (Void)(kout << "Handling interrupt for AP: " << interrupt << kendl);
+ (Void)(kout << "SMP: AP: " << hex_number(interrupt) << kendl);
switch (interrupt) {
case kInterruptScheduler: {
@@ -103,31 +94,47 @@ namespace Detail {
return YES;
}
- // spurious interrupt
return NO;
}
} // namespace Detail
-EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID pid) {
- return kProcessBlocks[pid % kSchedProcessLimitPerTeam].mFrame;
+/***********************************************************************************/
+/// @brief Get current stack frame for a thread.
+/// @param thrdid The thread ID.
+/***********************************************************************************/
+
+EXTERN_C HAL::StackFramePtr mp_get_current_task(ProcessID thrdid) {
+ return kHWThread[thrdid].mFramePtr;
}
-EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame, ProcessID pid) {
- MUST_PASS(stack_frame);
+/***********************************************************************************/
+/// @brief Register current stack frame for a thread.
+/// @param stack_frame The current stack frame.
+/// @param thrdid The thread ID.
+/***********************************************************************************/
- const auto process_index = pid % kSchedProcessLimitPerTeam;
+EXTERN_C Bool mp_register_task(HAL::StackFramePtr stack_frame, ProcessID thrdid) {
+ MUST_PASS(Detail::kGICEnabled);
- kProcessBlocks[process_index].mFrame = stack_frame;
+ if (!stack_frame) return NO;
+ if (thrdid > kMaxAPInsideSched) return NO;
+
+ const auto process_index = thrdid;
+
+ kHWThread[process_index].mFramePtr = stack_frame;
+ kHWThread[process_index].mThreadID = thrdid;
return YES;
}
-BOOL mp_initialize_gic(Void) {
+/***********************************************************************************/
+/// @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/HalApplicationProcessorStartup.s b/dev/kernel/HALKit/ARM64/HalApplicationProcessorStartup.s
new file mode 100644
index 00000000..dca52571
--- /dev/null
+++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessorStartup.s
@@ -0,0 +1,12 @@
+.text
+
+.global hal_ap_blob_start
+.global hal_ap_blob_length
+
+hal_ap_blob_start:
+ ret
+
+.data
+
+hal_ap_blob_length:
+ .long 4
diff --git a/dev/kernel/HALKit/ARM64/HalFlushTLB.S b/dev/kernel/HALKit/ARM64/HalCommonAPI.s
index e76b6e3f..e76b6e3f 100644
--- a/dev/kernel/HALKit/ARM64/HalFlushTLB.S
+++ b/dev/kernel/HALKit/ARM64/HalCommonAPI.s
diff --git a/dev/kernel/HALKit/ARM64/HalDebugOutput.cc b/dev/kernel/HALKit/ARM64/HalDebugOutput.cc
index 7ec90c6e..3c518e2f 100644
--- a/dev/kernel/HALKit/ARM64/HalDebugOutput.cc
+++ b/dev/kernel/HALKit/ARM64/HalDebugOutput.cc
@@ -6,8 +6,8 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/DebugOutput.h>
-#include <NewKit/New.h>
-#include <NewKit/Utils.h>
+#include <NeKit/New.h>
+#include <NeKit/Utils.h>
namespace Kernel {
EXTERN_C void ke_io_write(IDeviceObject<const Char*>* self, const Char* bytes) {
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/HalKernelMain.cc b/dev/kernel/HALKit/ARM64/HalKernelMain.cc
index bf5849ef..20bd3d8a 100644
--- a/dev/kernel/HALKit/ARM64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/ARM64/HalKernelMain.cc
@@ -7,20 +7,23 @@
#include <ArchKit/ArchKit.h>
#include <CFKit/Property.h>
#include <FirmwareKit/Handover.h>
+#include <HALKit/ARM64/ApplicationProcessor.h>
#include <HALKit/ARM64/Processor.h>
#include <KernelKit/CodeMgr.h>
#include <KernelKit/FileMgr.h>
-#include <KernelKit/MemoryMgr.h>
+#include <KernelKit/HardwareThreadScheduler.h>
+#include <KernelKit/HeapMgr.h>
#include <KernelKit/PEFCodeMgr.h>
#include <KernelKit/ProcessScheduler.h>
+#include <NeKit/Json.h>
#include <NetworkKit/IPC.h>
-#include <NewKit/Json.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
#include <modules/CoreGfx/CoreGfx.h>
-#include <HALKit/ARM64/ApplicationProcessor.h>
-
+#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<UserProcessTeam, kSchedTeamCount> 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/HalKernelPanic.cc b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
index c3d3175c..5feb6c75 100644
--- a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
+++ b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
@@ -9,9 +9,9 @@
#include <KernelKit/DebugOutput.h>
#include <KernelKit/FileMgr.h>
#include <KernelKit/Timer.h>
-#include <NewKit/KString.h>
-#include <NewKit/KernelPanic.h>
-#include <NewKit/Utils.h>
+#include <NeKit/KString.h>
+#include <NeKit/KernelPanic.h>
+#include <NeKit/Utils.h>
#include <modules/CoreGfx/CoreGfx.h>
#include <modules/CoreGfx/TextGfx.h>
diff --git a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc
new file mode 100644
index 00000000..faad6778
--- /dev/null
+++ b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc
@@ -0,0 +1,28 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
+
+ File: HalPagingMgr.cc
+ Purpose: Platform Paging Manager.
+
+------------------------------------------- */
+
+#include <HALKit/ARM64/Paging.h>
+#include <HALKit/ARM64/Processor.h>
+
+namespace Kernel::HAL {
+typedef UInt32 PageTableIndex;
+
+/// @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 kErrorInvalidData;
+
+ NE_UNUSED(physical_address);
+
+ return kErrorSuccess;
+}
+} // namespace Kernel::HAL
diff --git a/dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc b/dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc
deleted file mode 100644
index e0b67489..00000000
--- a/dev/kernel/HALKit/ARM64/HalPagingMgrARM64.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -------------------------------------------
-
- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
-
- File: HalPagingMgr.cc
- Purpose: Platform Paging Manager.
-
-------------------------------------------- */
-
-#include <HALKit/ARM64/Paging.h>
-#include <HALKit/ARM64/Processor.h>
-
-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;
-
- page_store.fStoreOp = No;
-
- return kErrorSuccess;
-}
-} // namespace Kernel::HAL
diff --git a/dev/kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc b/dev/kernel/HALKit/ARM64/HalSchedulerCore.cc
index b3f1b62a..b3f1b62a 100644
--- a/dev/kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc
+++ b/dev/kernel/HALKit/ARM64/HalSchedulerCore.cc
diff --git a/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc b/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc
index a8f0b1e1..ee286639 100644
--- a/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc
+++ b/dev/kernel/HALKit/ARM64/HalSchedulerCorePrimitives.cc
@@ -25,6 +25,6 @@ EXTERN_C Void __zka_pure_call(USER_PROCESS* process) {
EXTERN_C Bool hal_check_stack(HAL::StackFramePtr stack_ptr) {
if (!stack_ptr) return No;
- return stack_ptr->SP != 0 && stack_ptr->BP != 0;
+ return stack_ptr->SP != 0 && stack_ptr->IP != 0;
}
} // namespace Kernel
diff --git a/dev/kernel/HALKit/ARM64/HalTimerARM64.cc b/dev/kernel/HALKit/ARM64/HalTimer.cc
index 32f64aec..2a595f11 100644
--- a/dev/kernel/HALKit/ARM64/HalTimerARM64.cc
+++ b/dev/kernel/HALKit/ARM64/HalTimer.cc
@@ -12,3 +12,4 @@
------------------------------------------- */
#include <ArchKit/ArchKit.h>
+#include <KernelKit/Timer.h> \ No newline at end of file
diff --git a/dev/kernel/HALKit/ARM64/Paging.h b/dev/kernel/HALKit/ARM64/Paging.h
index 2eb02bc1..5001871b 100644
--- a/dev/kernel/HALKit/ARM64/Paging.h
+++ b/dev/kernel/HALKit/ARM64/Paging.h
@@ -12,7 +12,9 @@
------------------------------------------------------- */
-#include <NewKit/Defines.h>
+#ifdef __NE_ARM64__
+
+#include <NeKit/Defines.h>
#ifndef kPageMax
#define kPageMax (0x200)
@@ -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 1d9d2af2..068b798d 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 <FirmwareKit/Handover.h>
-#include <NewKit/Array.h>
-#include <NewKit/Defines.h>
-#include <NewKit/Utils.h>
+#include <NeKit/Array.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Utils.h>
-#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,
};
@@ -36,23 +38,23 @@ enum {
/// @return Status code of page manip.
EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags);
-EXTERN_C UIntPtr mm_get_phys_address(VoidPtr virtual_address);
+EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address);
typedef UIntPtr Reg;
typedef Register64 Register;
/// @note let's keep the same name as AMD64 HAL.
-struct PACKED StackFrame final {
- Reg R8{0};
- Reg R9{0};
- Reg R10{0};
- Reg R11{0};
- Reg R12{0};
- Reg R13{0};
- Reg R14{0};
- Reg R15{0};
- Reg SP{0};
- Reg BP{0};
+struct PACKED StackFrame {
+ Reg IP;
+ Reg SP;
+ Reg R8;
+ Reg R9;
+ Reg R10;
+ Reg R11;
+ Reg R12;
+ Reg R13;
+ Reg R14;
+ Reg R15;
};
typedef StackFrame* StackFramePtr;
@@ -62,16 +64,6 @@ inline Void rt_halt() noexcept {
}
}
-template <typename DataKind>
-inline void hal_dma_write(UIntPtr address, DataKind value) {
- *reinterpret_cast<volatile DataKind*>(address) = value;
-}
-
-template <typename DataKind>
-inline DataKind hal_dma_read(UIntPtr address) {
- return *reinterpret_cast<volatile DataKind*>(address);
-}
-
inline Void hal_wfi(Void) {
asm volatile("wfi");
}
@@ -80,6 +72,6 @@ inline Void hal_wfi(Void) {
inline Kernel::VoidPtr kKernelBitMpStart = nullptr;
inline Kernel::UIntPtr kKernelBitMpSize = 0UL;
-inline Kernel::VoidPtr kKernelPhysicalStart = nullptr;
-
#include <HALKit/ARM64/Paging.h>
+
+#endif // __NE_ARM64__ \ No newline at end of file