summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel/HALKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-01-06 20:11:53 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-01-06 20:11:53 +0100
commit98110adc9f47666696e18a6c7c97a3edc89c5d90 (patch)
treee39f76352995abfdcc154637b2dae00ed246d5c7 /dev/Kernel/HALKit
parent8c179d8801df7f5f77fe7ec65a0a98b7901dad09 (diff)
ADD: Fix kernel build and bootloader build on aarch64, add syschk for
aarch64. WIP: aarch64 on CoreBoot (EFI is unpractical) Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/Kernel/HALKit')
-rw-r--r--dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc (renamed from dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc)43
-rw-r--r--dev/Kernel/HALKit/AMD64/HalKernelMain.cc21
-rw-r--r--dev/Kernel/HALKit/AMD64/Processor.h5
-rw-r--r--dev/Kernel/HALKit/ARM64/AP.h36
-rw-r--r--dev/Kernel/HALKit/ARM64/ApplicationProcessor.h19
-rw-r--r--dev/Kernel/HALKit/ARM64/HalApplicationProcessor.cc140
-rw-r--r--dev/Kernel/HALKit/ARM64/HalCoreMPScheduler.cc28
-rw-r--r--dev/Kernel/HALKit/ARM64/HalKernelMain.cc6
-rw-r--r--dev/Kernel/HALKit/ARM64/HalKernelPanic.cc80
-rw-r--r--dev/Kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc16
-rw-r--r--dev/Kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc (renamed from dev/Kernel/HALKit/ARM64/HalSchedulerCore.cc)2
-rw-r--r--dev/Kernel/HALKit/ARM64/Processor.h13
12 files changed, 242 insertions, 167 deletions
diff --git a/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc b/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc
index 5d314aa7..bd14253f 100644
--- a/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc
+++ b/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc
@@ -13,13 +13,11 @@
#include <KernelKit/Timer.h>
#include <Mod/GfxMgr/TextMgr.h>
#include <NewKit/KernelPanic.h>
-
-// Needed for SMP.
#include <KernelKit/HardwareThreadScheduler.h>
#define kApicSignature "APIC"
-#define kApicBaseAddress (0xFEE00000)
+#define kApicBaseAddress (0xFEE00000)
#define kAPIC_ICR_Low 0x300
#define kAPIC_ICR_High 0x310
@@ -140,12 +138,12 @@ namespace Kernel::HAL
Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector);
}
- STATIC struct PROCESS_CONTROL_BLOCK final
+ struct PROCESS_CONTROL_BLOCK final
{
HAL::StackFramePtr f_Frame;
- UInt8* f_Stack;
- VoidPtr f_Image;
- } kProcessBlocks[kSchedProcessLimitPerTeam] = {0};
+ };
+
+ STATIC PROCESS_CONTROL_BLOCK kProcessBlocks[kSchedProcessLimitPerTeam] = {0};
EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 pid)
{
@@ -160,37 +158,6 @@ namespace Kernel::HAL
const auto process_index = pid % kSchedProcessLimitPerTeam;
kProcessBlocks[process_index].f_Frame = stack_frame;
- kProcessBlocks[process_index].f_Stack = stack_ptr;
- kProcessBlocks[process_index].f_Image = image;
-
- if (!mp_is_smp())
- {
- ke_panic(RUNTIME_CHECK_PROCESS, "The Kernel does not support non-SMP profiles as of now. We are unable to process this context switch.");
- }
- else
- {
- for (SizeT smpi = 0UL; smpi < kSMPMax; ++smpi)
- {
- if (!kAPICAddresses[smpi].mUsed)
- {
- kAPICAddresses[smpi].mUsed = YES;
-
- hal_send_start_ipi(kAPICLocales[smpi], ((UIntPtr)image) >> 12, kApicBaseAddress);
-
- for (SizeT i = 0; i < 1000000; ++i)
- ;
-
- hal_send_sipi(kAPICLocales[smpi], ((UIntPtr)image) >> 12, kApicBaseAddress);
-
- for (SizeT i = 0; i < 1000000; ++i)
- ;
-
- hal_send_sipi(kAPICLocales[smpi], ((UIntPtr)image) >> 12, kApicBaseAddress);
-
- kAPICAddresses[smpi].mUsed = NO;
- }
- }
- }
return YES;
}
diff --git a/dev/Kernel/HALKit/AMD64/HalKernelMain.cc b/dev/Kernel/HALKit/AMD64/HalKernelMain.cc
index 16571373..7b3e2345 100644
--- a/dev/Kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/Kernel/HALKit/AMD64/HalKernelMain.cc
@@ -93,27 +93,6 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
{
rtl_kernel_main(0, nullptr, nullptr, 0);
- auto id = Kernel::rtl_create_process([] (const Kernel::SizeT argc, Kernel::Char** argv, Kernel::Char** envp, const Kernel::SizeT envp_len) -> void {
- while (YES);
- }, "SMP Process #1");
-
- Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].PTime = 0;
- Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].Status = Kernel::ProcessStatusKind::kRunning;
-
- id = Kernel::rtl_create_process([] (const Kernel::SizeT argc, Kernel::Char** argv, Kernel::Char** envp, const Kernel::SizeT envp_len) -> void {
- while (YES);
- }, "SMP Process #2");
-
- Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].PTime = 0;
- Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].Status = Kernel::ProcessStatusKind::kRunning;
-
- id = Kernel::rtl_create_process([] (const Kernel::SizeT argc, Kernel::Char** argv, Kernel::Char** envp, const Kernel::SizeT envp_len) -> void {
- while (YES);
- }, "SMP Process #3");
-
- Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].PTime = 0;
- Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].Status = Kernel::ProcessStatusKind::kRunning;
-
Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
Kernel::HAL::Register64 idt_reg;
diff --git a/dev/Kernel/HALKit/AMD64/Processor.h b/dev/Kernel/HALKit/AMD64/Processor.h
index 26256baf..def26fa9 100644
--- a/dev/Kernel/HALKit/AMD64/Processor.h
+++ b/dev/Kernel/HALKit/AMD64/Processor.h
@@ -177,10 +177,12 @@ namespace Kernel::HAL
static Void Load(Register64& idt);
static Void Load(Ref<Register64>& idt);
};
+
/***********************************************************************************/
/// @brief Is the current config SMP aware?
/// @return True if YES, False if not.
/***********************************************************************************/
+
Bool mp_is_smp(Void) noexcept;
/***********************************************************************************/
@@ -192,6 +194,9 @@ namespace Kernel::HAL
/***********************************************************************************/
Void hal_send_start_ipi(UInt32 apicId, UInt8 vector, UInt32 targetAddress);
+
+ /***********************************************************************************/
+
Void hal_send_end_ipi(UInt32 apicId, UInt8 vector, UInt32 targetAddress);
/***********************************************************************************/
diff --git a/dev/Kernel/HALKit/ARM64/AP.h b/dev/Kernel/HALKit/ARM64/AP.h
deleted file mode 100644
index 8cebfeca..00000000
--- a/dev/Kernel/HALKit/ARM64/AP.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -------------------------------------------
-
- Copyright (C) 2024, Theater Quality Corp, all rights reserved.
-
- File: AP.h
- Purpose: RISC-V hardware threads.
-
- Revision History:
-
- 30/01/24: Added file (amlel)
-
-------------------------------------------- */
-
-#pragma once
-
-#include <NewKit/Defines.h>
-
-namespace Kernel
-{
- typedef Int64 hal_ap_kind;
-
- typedef struct HAL_HARDWARE_THREAD
- {
- Kernel::UIntPtr fStartAddress;
- Kernel::UInt8 fPrivleged : 1;
- Kernel::UInt32 fPageMemoryFlags;
- hal_ap_kind fIdentNumber;
- } HAL_HARDWARE_THREAD;
-
- /// @brief Set PC to specific hart.
- /// @param hart the hart
- /// @param epc the pc.
- /// @return
- EXTERN_C Kernel::Void hal_set_pc_to_hart(HAL_HARDWARE_THREAD* hart, Kernel::VoidPtr epc);
-
-} // namespace Kernel
diff --git a/dev/Kernel/HALKit/ARM64/ApplicationProcessor.h b/dev/Kernel/HALKit/ARM64/ApplicationProcessor.h
new file mode 100644
index 00000000..25d948d5
--- /dev/null
+++ b/dev/Kernel/HALKit/ARM64/ApplicationProcessor.h
@@ -0,0 +1,19 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Theater Quality Corp, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <NewKit/Defines.h>
+#include <HALKit/ARM64/Processor.h>
+
+/************************************************** */
+/* INITIALIZE THE GIC ON CPU. */
+/************************************************** */
+
+namespace Kernel
+{
+ BOOL mp_initialize_gic(Kernel::Void);
+} \ No newline at end of file
diff --git a/dev/Kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/Kernel/HALKit/ARM64/HalApplicationProcessor.cc
index fa62cf20..91252455 100644
--- a/dev/Kernel/HALKit/ARM64/HalApplicationProcessor.cc
+++ b/dev/Kernel/HALKit/ARM64/HalApplicationProcessor.cc
@@ -6,35 +6,129 @@
#include <HALKit/ARM64/Processor.h>
#include <KernelKit/DebugOutput.h>
-#include <HALKit/ARM64/AP.h>
+#include <HALKit/ARM64/ApplicationProcessor.h>
+#include <KernelKit/UserProcessScheduler.h>
-using namespace Kernel;
+#define GICD_BASE 0x08000000 // Distributor base address
+#define GICC_BASE 0x08010000 // CPU interface base address
-namespace Kernel::Detail
+#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
{
- STATIC void mp_hang_fn(void)
+ struct PROCESS_CONTROL_BLOCK final
+ {
+ HAL::StackFramePtr f_Frame;
+ };
+
+ STATIC PROCESS_CONTROL_BLOCK kProcessBlocks[kSchedProcessLimitPerTeam] = {0};
+
+ namespace Detail
+ {
+ STATIC BOOL kGICEnabled = NO;
+
+ STATIC void mp_hang_fn(void)
+ {
+ while (YES)
+ ;
+ }
+
+ Void mp_setup_gic_el0(Void)
+ {
+ // enable distributor.
+ HAL::hal_mmio_write(GICD_BASE + GICD_CTLR, 0x1);
+
+ UInt32 gicc_ctlr = HAL::hal_mmio_read<UInt32>(GICC_BASE + GICC_CTLR);
+
+ gicc_ctlr |= 0x1; // Enable signaling of interrupts
+ gicc_ctlr |= (1 << 1); // Allow Group 1 interrupts in EL0
+
+ HAL::hal_mmio_write(GICC_BASE + GICC_CTLR, gicc_ctlr);
+
+ // Set priority mask (accept all priorities)
+ HAL::hal_mmio_write(GICC_BASE + GICC_PMR, 0xFF);
+
+ UInt32 icfgr = HAL::hal_mmio_read<UInt32>(GICD_BASE + GICD_ICFGR + (32 / 16) * 4);
+
+ icfgr |= (0x2 << ((32 % 16) * 2)); // Edge-triggered
+ HAL::hal_mmio_write(GICD_BASE + GICD_ICFGR + (32 / 16) * 4, icfgr);
+
+ // Target interrupt 32 to CPU 1
+ HAL::hal_mmio_write(GICD_BASE + GICD_ITARGETSR + (32 / 4) * 4, 0x2 << ((32 % 4) * 8));
+
+ // Set interrupt 32 priority to lowest (0xFF)
+ HAL::hal_mmio_write(GICD_BASE + GICD_IPRIORITYR + (32 / 4) * 4, 0xFF << ((32 % 4) * 8));
+
+ // Enable interrupt 32 for AP.
+ HAL::hal_mmio_write(GICD_BASE + GICD_ISENABLER + (32 / 32) * 4, 0x01 << (32 % 32));
+
+ kcout << "AP's GIC configured for interrupt 32." << endl;
+ }
+
+ BOOL mp_handle_gic_interrupt_el0(Void)
+ {
+ // Read the interrupt ID
+ UInt32 interrupt_id = HAL::hal_mmio_read<UInt32>(GICC_BASE + GICC_IAR);
+
+ // Check if it's a valid interrupt (not spurious)
+ if ((interrupt_id & 0x3FF) < 1020)
+ {
+ kcout << "Handling interrupt for AP: " << (interrupt_id & 0x3FF) << endl;
+
+ // TODO: Handle code here.
+
+ // End the interrupt
+
+ HAL::hal_mmio_write(GICC_BASE + GICC_EOIR, interrupt_id);
+
+ return YES;
+ }
+
+ // spurious interrupt
+ return NO;
+ }
+ } // namespace Detail
+
+ EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID pid)
{
- while (YES)
- ;
+ return kProcessBlocks[pid % kSchedProcessLimitPerTeam].f_Frame;
}
-} // namespace Kernel::Detail
-/// @brief wakes up thread from it's hang state.
-/// wakes up thread from hang.
-Void mp_wakeup_thread(HAL::StackFramePtr stack)
-{
- if (!stack)
- return;
+ EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame, ProcessID pid)
+ {
+ MUST_PASS(image && stack_ptr && stack_frame);
- hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(stack->BP));
-}
+ const auto process_index = pid % kSchedProcessLimitPerTeam;
-/// @brief makes thread go to hang state.
-/// hooks and hangs thread to prevent code from executing.
-Void mp_hang_thread(HAL::StackFramePtr stack)
-{
- if (!stack)
- return;
+ kProcessBlocks[process_index].f_Frame = stack_frame;
+
+ return YES;
+ }
- hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(Kernel::Detail::mp_hang_fn));
-}
+ BOOL mp_initialize_gic(Void)
+ {
+ if (!Detail::kGICEnabled)
+ {
+ Detail::kGICEnabled = YES;
+ Detail::mp_setup_gic_el0();
+
+ return YES;
+ }
+
+ return NO;
+ }
+} // namespace Kernel \ No newline at end of file
diff --git a/dev/Kernel/HALKit/ARM64/HalCoreMPScheduler.cc b/dev/Kernel/HALKit/ARM64/HalCoreMPScheduler.cc
deleted file mode 100644
index fe055db8..00000000
--- a/dev/Kernel/HALKit/ARM64/HalCoreMPScheduler.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -------------------------------------------
-
- Copyright (C) 2024, Theater Quality Corp, all rights reserved.
-
-------------------------------------------- */
-
-#include <Mod/ACPI/ACPIFactoryInterface.h>
-#include <KernelKit/UserProcessScheduler.h>
-
-using namespace Kernel;
-
-STATIC struct PROCESS_CONTROL_BLOCK final
-{
- HAL::StackFramePtr f_Frame;
- UInt8* f_Stack;
- VoidPtr f_Image;
-} kProcessBlocks[kSchedProcessLimitPerTeam] = {0};
-
-EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID pid)
-{
- return kProcessBlocks[pid % kSchedProcessLimitPerTeam].f_Frame;
-}
-
-EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame, ProcessID pid)
-{
- MUST_PASS(image && stack_ptr && stack_frame);
- return No;
-}
diff --git a/dev/Kernel/HALKit/ARM64/HalKernelMain.cc b/dev/Kernel/HALKit/ARM64/HalKernelMain.cc
index 692c6be2..1869d97b 100644
--- a/dev/Kernel/HALKit/ARM64/HalKernelMain.cc
+++ b/dev/Kernel/HALKit/ARM64/HalKernelMain.cc
@@ -4,6 +4,7 @@
------------------------------------------- */
+#include "HALKit/ARM64/ApplicationProcessor.h"
#include <ArchKit/ArchKit.h>
#include <Mod/GfxMgr/FBMgr.h>
#include <FirmwareKit/Handover.h>
@@ -15,10 +16,9 @@
#include <KernelKit/CodeMgr.h>
#include <Mod/ACPI/ACPIFactoryInterface.h>
#include <NetworkKit/IPC.h>
+#include <HALKit/ARM64/Processor.h>
#include <CFKit/Property.h>
-Kernel::Void hal_real_init(Kernel::Void) noexcept;
-EXTERN_C Kernel::Void rtl_kernel_main(Kernel::SizeT argc, char** argv, char** envp, Kernel::SizeT envp_len);
EXTERN_C void hal_init_platform(
Kernel::HEL::BootInfoHeader* handover_hdr)
@@ -46,7 +46,7 @@ EXTERN_C void hal_init_platform(
/// @note do initialize the interrupts after it.
- rtl_kernel_main(0, nullptr, nullptr, 0);
+ Kernel::mp_initialize_gic();
while (YES)
{
diff --git a/dev/Kernel/HALKit/ARM64/HalKernelPanic.cc b/dev/Kernel/HALKit/ARM64/HalKernelPanic.cc
new file mode 100644
index 00000000..4cd61aff
--- /dev/null
+++ b/dev/Kernel/HALKit/ARM64/HalKernelPanic.cc
@@ -0,0 +1,80 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Theater Quality Corp, all rights reserved.
+
+------------------------------------------- */
+
+#include <NewKit/KernelPanic.h>
+#include <ArchKit/ArchKit.h>
+#include <KernelKit/Timer.h>
+#include <KernelKit/DebugOutput.h>
+#include <NewKit/KString.h>
+#include <FirmwareKit/Handover.h>
+#include <KernelKit/FileMgr.h>
+#include <Mod/GfxMgr/FBMgr.h>
+#include <Mod/GfxMgr/TextMgr.h>
+#include <NewKit/Utils.h>
+
+/* Each error code is attributed with an ID, which will prompt a string onto the
+ * screen. Wait for debugger... */
+
+namespace Kernel
+{
+ /// @brief Dumping factory class.
+ class RecoveryFactory final
+ {
+ public:
+ STATIC Void Recover() noexcept;
+ };
+
+ /***********************************************************************************/
+ /// @brief Stops execution of the kernel.
+ /// @param id kernel stop ID.
+ /***********************************************************************************/
+ Void ke_panic(const Kernel::Int32& id, const Char* message)
+ {
+ fb_init();
+
+ auto panic_text = RGB(0xff, 0xff, 0xff);
+
+ auto y = 10;
+ auto x = 10;
+
+ Char* message_apicid = new Char[128];
+ rt_set_memory(message_apicid, 0, 128);
+
+ rt_copy_memory((VoidPtr) "panic id: ", message_apicid, rt_string_len("panic id: "));
+ rt_to_string(message_apicid + rt_string_len("panic id: "), (UIntPtr)id, 10);
+
+ fb_render_string(message_apicid, y, x, panic_text);
+
+ y += 10;
+
+ fb_render_string((message ? message : "message: panic raised, going nowhere after this!"), y, x, panic_text);
+
+ y += 10;
+
+ fb_clear();
+
+ RecoveryFactory::Recover();
+ }
+
+ Void RecoveryFactory::Recover() noexcept
+ {
+ while (YES)
+ {
+ HAL::rt_halt();
+ }
+ }
+
+ void ke_runtime_check(bool expr, const Char* file, const Char* line)
+ {
+ if (!expr)
+ {
+ kcout << "FAILED: FILE: " << file << endl;
+ kcout << "FAILED: LINE: " << line << endl;
+
+ ke_panic(RUNTIME_CHECK_FAILED, file); // Runtime Check failed
+ }
+ }
+} // namespace Kernel
diff --git a/dev/Kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc b/dev/Kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc
index b015f001..e0a21c2f 100644
--- a/dev/Kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc
+++ b/dev/Kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc
@@ -8,22 +8,6 @@
namespace Kernel
{
- EXTERN_C Void __zka_pure_call(void)
- {
- UserProcessScheduler::The().GetCurrentProcess().Leak().Crash();
- }
-
- bool hal_check_stack(HAL::StackFramePtr stackPtr)
- {
- if (!stackPtr)
- return No;
-
- if (stackPtr->BP == 0 || stackPtr->SP == 0)
- return No;
-
- return Yes;
- }
-
/// @brief Wakes up thread.
/// Wakes up thread from the hang state.
Void mp_wakeup_thread(HAL::StackFrame* stack)
diff --git a/dev/Kernel/HALKit/ARM64/HalSchedulerCore.cc b/dev/Kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc
index c6585cb8..941fdf7a 100644
--- a/dev/Kernel/HALKit/ARM64/HalSchedulerCore.cc
+++ b/dev/Kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc
@@ -4,7 +4,7 @@
------------------------------------------- */
-#include <HALKit/AMD64/Processor.h>
+#include <HALKit/ARM64/Processor.h>
#include <KernelKit/UserProcessScheduler.h>
namespace Kernel
diff --git a/dev/Kernel/HALKit/ARM64/Processor.h b/dev/Kernel/HALKit/ARM64/Processor.h
index 422fafe1..bdf3272a 100644
--- a/dev/Kernel/HALKit/ARM64/Processor.h
+++ b/dev/Kernel/HALKit/ARM64/Processor.h
@@ -58,13 +58,24 @@ namespace Kernel::HAL
typedef StackFrame* StackFramePtr;
- inline Void rt_halt()
+ inline Void rt_halt() noexcept
{
while (Yes)
{
}
}
+ template <typename DataKind>
+ inline void hal_mmio_write(UIntPtr address, DataKind value)
+ {
+ *reinterpret_cast<volatile DataKind*>(address) = value;
+ }
+
+ template <typename DataKind>
+ inline DataKind hal_mmio_read(UIntPtr address)
+ {
+ return *reinterpret_cast<volatile DataKind*>(address);
+ }
} // namespace Kernel::HAL
inline Kernel::VoidPtr kKernelBitMpStart = nullptr;