summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel
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
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')
-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
-rwxr-xr-x[-rw-r--r--]dev/Kernel/MoveAll.ARM64.sh0
-rw-r--r--dev/Kernel/amd64-desktop.make2
-rw-r--r--dev/Kernel/arm64-desktop.make2
-rw-r--r--dev/Kernel/src/KernelMain.cc4
-rw-r--r--dev/Kernel/src/UserProcessScheduler.cc14
17 files changed, 257 insertions, 174 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;
diff --git a/dev/Kernel/MoveAll.ARM64.sh b/dev/Kernel/MoveAll.ARM64.sh
index 35e0909e..35e0909e 100644..100755
--- a/dev/Kernel/MoveAll.ARM64.sh
+++ b/dev/Kernel/MoveAll.ARM64.sh
diff --git a/dev/Kernel/amd64-desktop.make b/dev/Kernel/amd64-desktop.make
index 99be29ad..cfc4db9f 100644
--- a/dev/Kernel/amd64-desktop.make
+++ b/dev/Kernel/amd64-desktop.make
@@ -7,7 +7,7 @@ CC = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
CCFLAGS = -fshort-wchar -c -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \
-std=c++20 -D__ZKA_SUPPORT_NX__ -O0 -I../Vendor -D__FSKIT_INCLUDES_NEFS__ \
- -D__MINOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA__ -I./ -I../ -I../zba
+ -D__MINOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA_VIRTUAL_MEMORY_SUPPORT__ -D__ZKA_AUTO_FORMAT__ -D__ZKA__ -I./ -I../ -I../zba
ASM = nasm
diff --git a/dev/Kernel/arm64-desktop.make b/dev/Kernel/arm64-desktop.make
index a899ae18..27e68679 100644
--- a/dev/Kernel/arm64-desktop.make
+++ b/dev/Kernel/arm64-desktop.make
@@ -11,7 +11,7 @@ CCFLAGS = -fshort-wchar -c -ffreestanding -MMD -mno-red-zone -D__ZKA_ARM64__ -f
ASM = clang++
-DISKDRIVER = -D__USE_FLASH_MEM__ -D__USE_SAS__ -D__USE_SATA__
+DISKDRIVER = -D__USE_FLASH_MEM__
ifneq ($(DEBUG_SUPPORT), )
DEBUG = -D__DEBUG__
diff --git a/dev/Kernel/src/KernelMain.cc b/dev/Kernel/src/KernelMain.cc
index 303b1d81..af835183 100644
--- a/dev/Kernel/src/KernelMain.cc
+++ b/dev/Kernel/src/KernelMain.cc
@@ -24,6 +24,7 @@
#include <CFKit/Property.h>
#include <KernelKit/Timer.h>
+#ifdef __ZKA_AUTO_FORMAT__
namespace Kernel::Detail
{
/// @brief Filesystem auto formatter, additional checks are also done by the class.
@@ -91,12 +92,15 @@ namespace Kernel::Detail
ZKA_COPY_DEFAULT(NeFilesystemInstaller);
};
} // namespace Kernel::Detail
+#endif // ifdef __ZKA_AUTO_FORMAT__
/// @brief Kernel entrypoint.
/// @param Void
/// @return Void
EXTERN_C Kernel::Void rtl_kernel_main(Kernel::SizeT argc, char** argv, char** envp, Kernel::SizeT envp_len)
{
+#ifdef __ZKA_AUTO_FORMAT__
Kernel::Detail::fs_init_newfs();
Kernel::Detail::NeFilesystemInstaller installer{};
+#endif // __ZKA_AUTO_FORMAT__
}
diff --git a/dev/Kernel/src/UserProcessScheduler.cc b/dev/Kernel/src/UserProcessScheduler.cc
index 936d0547..55d3474b 100644
--- a/dev/Kernel/src/UserProcessScheduler.cc
+++ b/dev/Kernel/src/UserProcessScheduler.cc
@@ -106,7 +106,7 @@ namespace Kernel
ErrorOr<VoidPtr> UserThread::New(const SizeT& sz, const SizeT& pad_amount)
{
-#ifdef __ZKA_AMD64__
+#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__
auto vm_register = hal_read_cr3();
hal_write_cr3(this->VMRegister);
@@ -206,7 +206,7 @@ namespace Kernel
auto memory_heap_list = this->ProcessMemoryHeap;
-#ifdef __ZKA_AMD64__
+#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__
auto pd = hal_read_cr3();
hal_write_cr3(this->VMRegister);
#endif
@@ -219,7 +219,7 @@ namespace Kernel
MUST_PASS(mm_delete_heap(memory_heap_list->MemoryEntry));
}
-#ifdef __ZKA_AMD64__
+#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__
hal_write_cr3(pd);
#endif
@@ -297,7 +297,7 @@ namespace Kernel
rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(name)), process.Name, rt_string_len(name));
-#ifdef __ZKA_AMD64__
+#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__
process.VMRegister = new PDE();
if (!process.VMRegister)
@@ -311,7 +311,7 @@ namespace Kernel
flags |= HAL::kMMFlagsUser;
HAL::mm_map_page((VoidPtr)process.VMRegister, flags);
-#endif // __ZKA_AMD64__
+#endif // __ZKA_VIRTUAL_MEMORY_SUPPORT__
process.StackFrame = new HAL::StackFrame();
@@ -321,11 +321,13 @@ namespace Kernel
return kErrorProcessFault;
}
+#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__
flags = HAL::kMMFlagsPresent;
flags |= HAL::kMMFlagsWr;
flags |= HAL::kMMFlagsUser;
HAL::mm_map_page((VoidPtr)process.StackFrame, flags);
+#endif // __ZKA_VIRTUAL_MEMORY_SUPPORT__
// Create heap according to type of process.
if (process.Kind == UserThread::kExectuableDLLKind)
@@ -336,11 +338,13 @@ namespace Kernel
process.StackReserve = new UInt8[process.StackSize];
+#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__
flags = HAL::kMMFlagsPresent;
flags |= HAL::kMMFlagsWr;
flags |= HAL::kMMFlagsUser;
HAL::mm_map_page((VoidPtr)process.StackReserve, flags);
+#endif // __ZKA_VIRTUAL_MEMORY_SUPPORT__
if (!process.StackReserve)
{