diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-01-06 20:11:53 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-01-06 20:11:53 +0100 |
| commit | 98110adc9f47666696e18a6c7c97a3edc89c5d90 (patch) | |
| tree | e39f76352995abfdcc154637b2dae00ed246d5c7 /dev/Kernel | |
| parent | 8c179d8801df7f5f77fe7ec65a0a98b7901dad09 (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')
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) { |
