diff options
| author | Amlal <amlalelmahrouss@icloud.com> | 2024-07-28 16:11:46 +0000 |
|---|---|---|
| committer | Amlal <amlalelmahrouss@icloud.com> | 2024-07-28 16:11:46 +0000 |
| commit | c4023005e029ae092dad2689564c490580dd5c28 (patch) | |
| tree | 3080ba07a6b552bf3d7591574cf69b2a3c8fd0fd /Kernel/HALKit | |
| parent | 8c8822fff78f9ff9cd640271da9b3634c4c2f97f (diff) | |
| parent | 4db57a2d646b1538783a0675b38bada7a0f903ae (diff) | |
Merged in MHR-36 (pull request #17)
MHR-36
Diffstat (limited to 'Kernel/HALKit')
59 files changed, 798 insertions, 431 deletions
diff --git a/Kernel/HALKit/64x0/HalVirtualMemory.cxx b/Kernel/HALKit/64x0/HalVirtualMemory.cxx index f62f888f..9aeb6b8e 100644 --- a/Kernel/HALKit/64x0/HalVirtualMemory.cxx +++ b/Kernel/HALKit/64x0/HalVirtualMemory.cxx @@ -1,10 +1,10 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ -#include <HALKit/POWER/Processor.hpp> +#include <HALKit/POWER/Processor.hxx> #include <KernelKit/DebugOutput.hpp> using namespace Kernel; diff --git a/Kernel/HALKit/64x0/ReadMe.md b/Kernel/HALKit/64x0/ReadMe.md index a22d0385..2e72d5bf 100644 --- a/Kernel/HALKit/64x0/ReadMe.md +++ b/Kernel/HALKit/64x0/ReadMe.md @@ -1,4 +1,4 @@ 64x0 Hardware Abstraction Layer -- Supported CPU: Zeta Electronics Corporation 64x0 +- Supported CPU: ZKA Technologies 64x0 - Supported Firmware: CoreBoot
\ No newline at end of file diff --git a/Kernel/HALKit/AMD64/CPUID.hxx b/Kernel/HALKit/AMD64/CPUID.hxx index 602b2466..5c05277e 100644 --- a/Kernel/HALKit/AMD64/CPUID.hxx +++ b/Kernel/HALKit/AMD64/CPUID.hxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies File: CPUID.hxx Purpose: CPUID flags. diff --git a/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx b/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx index ca6a7417..6f66ae5b 100644 --- a/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx +++ b/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx @@ -1,14 +1,14 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ #include <Modules/ACPI/ACPIFactoryInterface.hxx> -#include <HALKit/AMD64/Processor.hpp> +#include <HALKit/AMD64/Processor.hxx> #include <NewKit/String.hpp> #include <ArchKit/ArchKit.hpp> -#include <KernelKit/KernelHeap.hpp> +#include <KernelKit/Heap.hxx> namespace Kernel { @@ -104,7 +104,8 @@ namespace Kernel { SDT& sdt = *reinterpret_cast<SDT*>(xsdt->AddressArr[index]); - kcout << "ACPI: Revision: " << number(sdt.CreatorID) << endl; + kcout << "ACPI: Checksum: " << number(sdt.Checksum) << endl; + kcout << "ACPI: Revision: " << number(sdt.Revision) << endl; for (short signature_index = 0; signature_index < cAcpiSignatureLength; ++signature_index) { diff --git a/Kernel/HALKit/AMD64/HalAPIC.cxx b/Kernel/HALKit/AMD64/HalAPIC.cxx new file mode 100644 index 00000000..34ec7494 --- /dev/null +++ b/Kernel/HALKit/AMD64/HalAPIC.cxx @@ -0,0 +1,36 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#include <Modules/ACPI/ACPIFactoryInterface.hxx> +#include <HALKit/AMD64/Processor.hxx> + +namespace Kernel::HAL +{ + /// @brief Read from APIC controller. + /// @param reg register. + UInt32 APICController::Read(UInt32 reg) noexcept + { + MUST_PASS(this->fApic); + + UInt32 volatile* ioapic = (UInt32 volatile*)this->fApic; + ioapic[0] = (reg & 0xff); + + return ioapic[4]; + } + + /// @brief Write to APIC controller. + /// @param reg register. + /// @param value value. + Void APICController::Write(UInt32 reg, UInt32 value) noexcept + { + MUST_PASS(this->fApic); + + UInt32 volatile* ioapic = (UInt32 volatile*)this->fApic; + + ioapic[0] = (reg & 0xFF); + ioapic[4] = value; + } +} // namespace Kernel::HAL diff --git a/Kernel/HALKit/AMD64/HalNewBoot.asm b/Kernel/HALKit/AMD64/HalBoot.asm index 5f0342a3..ab8273a1 100644 --- a/Kernel/HALKit/AMD64/HalNewBoot.asm +++ b/Kernel/HALKit/AMD64/HalBoot.asm @@ -2,7 +2,7 @@ ;; * ======================================================== ;; * ;; * Kernel -;; * Copyright Zeta Electronics Corporation, all rights reserved. +;; * Copyright ZKA Technologies, all rights reserved. ;; * ;; * ======================================================== ;; */ diff --git a/Kernel/HALKit/AMD64/HalControlRegister.s b/Kernel/HALKit/AMD64/HalControlRegister.s index 20eda96f..34b3da90 100644 --- a/Kernel/HALKit/AMD64/HalControlRegister.s +++ b/Kernel/HALKit/AMD64/HalControlRegister.s @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx index f41ee55e..29c0f3c7 100644 --- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp +++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -14,7 +14,7 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { Kernel::kcout << "newoskrnl: General Protection Fault, caused by " - << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); + << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetProcessName(); Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } @@ -25,7 +25,7 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { Kernel::kcout << "newoskrnl: Segmentation Fault, caused by " - << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); + << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetProcessName(); Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } @@ -36,7 +36,7 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { Kernel::kcout << "newoskrnl: Math error, caused by " - << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); + << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetProcessName(); Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } @@ -47,7 +47,7 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { Kernel::kcout << "newoskrnl: Execution error, caused by " - << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); + << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetProcessName(); Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } @@ -58,7 +58,7 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { Kernel::kcout << "newoskrnl: Invalid interrupt, caused by " - << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); + << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetProcessName(); Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx index 94fe68ad..48d737fe 100644 --- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp +++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx @@ -1,11 +1,11 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ #include <Modules/ACPI/ACPIFactoryInterface.hxx> -#include <HALKit/AMD64/Processor.hpp> +#include <HALKit/AMD64/Processor.hxx> #include <NewKit/KernelCheck.hpp> #include <ArchKit/ArchKit.hpp> #include <KernelKit/Semaphore.hpp> @@ -17,10 +17,14 @@ #define kAPIC_SIPI_Vector 0x00500 #define kAPIC_EIPI_Vector 0x00400 +#define kAPIC_BASE_MSR 0x1B +#define kAPIC_BASE_MSR_BSP 0x100 +#define kAPIC_BASE_MSR_ENABLE 0x800 + /// @brief assembly routine. internal use only. EXTERN_C void _hal_enable_smp(void); -/// @note: _hal_switch_context +/// @note: _hal_switch_context is internal /////////////////////////////////////////////////////////////////////////////////////// @@ -57,8 +61,8 @@ namespace Kernel::HAL } Selector; }; - STATIC voidPtr kApicMadt = nullptr; - STATIC const char* kApicSignature = "APIC"; + STATIC VoidPtr kApicMadt = nullptr; + STATIC const Char* kApicSignature = "APIC"; /// @brief Multiple APIC Descriptor Table. struct MadtType final : public SDT @@ -122,11 +126,7 @@ namespace Kernel::HAL UInt32 fKind{0}; } kApicMadtAddresses[255] = {}; - STATIC SizeT kApicMadtAddressesCount = 0UL; - STATIC UIntPtr cBaseAddressAPIC = 0xFEE00000; - - /// @brief this will help us schedule our cores. - STATIC Boolean* cProgramInitialized = nullptr; + STATIC SizeT kApicMadtAddressesCount = 0UL; enum { @@ -142,7 +142,7 @@ namespace Kernel::HAL /// @return Void hal_send_start_ipi(UInt32 apicId, UInt8 vector, UInt32 targetAddress) { - Kernel::ke_dma_write(targetAddress, kAPIC_ICR_High, apicId << 24); + Kernel::ke_dma_write(targetAddress, kAPIC_ICR_High, (apicId << 24)); Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_SIPI_Vector | vector); } @@ -159,25 +159,23 @@ namespace Kernel::HAL Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector); } - STATIC HAL::StackFramePtr cFramePtr = nullptr; - STATIC Int32 cSMPInterrupt = 0x40; - - EXTERN_C Void hal_apic_acknowledge_cont(Void) - { - kcout << "newoskrnl: stopping core...\r"; - ke_stop(RUNTIME_CHECK_BOOTSTRAP); - } + STATIC HAL::StackFramePtr cFramePtr = nullptr; + STATIC Int32 cSMPInterrupt = 34; + /// @brief Current context getter. + /// @retval StackFramePtr the current context. EXTERN_C StackFramePtr _hal_leak_current_context(Void) { return cFramePtr; } + /// @internal EXTERN_C Void hal_apic_acknowledge(Void) { - hal_apic_acknowledge_cont(); + kcout << "newoskrnl: acknowledge APIC.\r"; } + /// @internal EXTERN_C Void _hal_switch_context(HAL::StackFramePtr stackFrame) { hal_switch_context(stackFrame); @@ -187,17 +185,37 @@ namespace Kernel::HAL { Semaphore sem; - HardwareTimer timer(Seconds(5)); + constexpr auto cSeconds = 1U; + + HardwareTimer timer(Seconds(cSeconds)); sem.LockOrWait(&ProcessScheduler::The().Leak().TheCurrent().Leak(), &timer); cFramePtr = stackFrame; - /// yes the exception field contains the core id. - hal_send_start_ipi(stackFrame->Rcx, cSMPInterrupt, cBaseAddressAPIC); - sem.Unlock(); } + STATIC auto cAPICAddress = 0x0FEC00000; + + STATIC Void cpu_set_apic_base(UIntPtr apic) + { + UInt32 edx = 0; + UInt32 eax = (apic & 0xfffff0000) | kAPIC_BASE_MSR_ENABLE; + + edx = (apic >> 32) & 0x0f; + + hal_set_msr(kAPIC_BASE_MSR, eax, edx); + } + + STATIC UIntPtr cpu_get_apic_base(Void) + { + UInt32 eax, edx; + + hal_get_msr(kAPIC_BASE_MSR, &eax, &edx); + + return (eax & 0xfffff000) | ((UIntPtr)(edx & 0x0f) << 32); + } + /// @brief Fetch and enable cores inside main CPU. /// @param rsdPtr RSD PTR structure. Void hal_system_get_cores(voidPtr rsdPtr) @@ -209,47 +227,14 @@ namespace Kernel::HAL { MadtType* madt = reinterpret_cast<MadtType*>(kApicMadt); - constexpr auto cMaxProbableCores = 4; // the amount of cores we want. - constexpr auto cStartAt = 0; // start here to avoid boot core. - - for (SizeT coreAt = cStartAt; coreAt < cMaxProbableCores; ++coreAt) - { - if (madt->MadtRecords[coreAt].Flags < kThreadBoot) // if local apic. - { - MadtType::MadtAddress& madtRecord = madt->MadtRecords[coreAt]; - - // then register as a core for scheduler. - kcout << "newoskrnl: Register APIC.\r"; - - kApicMadtAddresses[kApicMadtAddressesCount].fAddress = madtRecord.Address; - kApicMadtAddresses[kApicMadtAddressesCount].fKind = madt->MadtRecords[coreAt].Flags; + cpu_set_apic_base(cpu_get_apic_base()); - ++kApicMadtAddressesCount; - } - } + // set SVR register to bit 8 to start recieve interrupts. - /////////////////////////////////////////////////////////////////////////// - /// Start local APIC now. - /////////////////////////////////////////////////////////////////////////// - - auto flagsSet = Kernel::ke_dma_read(cBaseAddressAPIC, 0xF0); // SVR register. - - // enable APIC. + auto flagsSet = Kernel::ke_dma_read(cAPICAddress, 0xF0); // SVR register. flagsSet |= 0x100; - Kernel::ke_dma_write(cBaseAddressAPIC, 0xF0, flagsSet); - - /// Set sprurious interrupt vector. - Kernel::ke_dma_write(cBaseAddressAPIC, 0xF0, 0x100 | 0xFF); - - // highest task priority. for our realtime kernel. - Kernel::ke_dma_write(cBaseAddressAPIC, 0x21, 0); - - cProgramInitialized = new Boolean(true); - - constexpr auto cWhatCore = 1; - - hal_send_start_ipi(cWhatCore, cSMPInterrupt, cBaseAddressAPIC); + Kernel::ke_dma_write(cAPICAddress, 0xF0, flagsSet | 0x100); } else { diff --git a/Kernel/HALKit/AMD64/HalDebugOutput.cxx b/Kernel/HALKit/AMD64/HalDebugOutput.cxx index 3dd70dc6..36ae96b0 100644 --- a/Kernel/HALKit/AMD64/HalDebugOutput.cxx +++ b/Kernel/HALKit/AMD64/HalDebugOutput.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -27,7 +27,7 @@ namespace Kernel /// @brief Init COM1. /// @return - bool serial_init() noexcept + bool hal_serial_init() noexcept { #ifdef __DEBUG__ if (kState == kStateReady || kState == kStateTransmit) @@ -64,7 +64,7 @@ namespace Kernel EXTERN_C void ke_io_write(const char* bytes) { #ifdef __DEBUG__ - Detail::serial_init(); + Detail::hal_serial_init(); if (!bytes || Detail::kState != kStateReady) return; @@ -74,7 +74,10 @@ namespace Kernel Detail::kState = kStateTransmit; SizeT index = 0; - SizeT len = rt_string_len(bytes, 256); + SizeT len = 0; + + index = 0; + len = rt_string_len(bytes, 255); while (index < len) { @@ -92,7 +95,7 @@ namespace Kernel EXTERN_C void ke_io_read(const char* bytes) { #ifdef __DEBUG__ - Detail::serial_init(); + Detail::hal_serial_init(); if (!bytes || Detail::kState != kStateReady) return; diff --git a/Kernel/HALKit/AMD64/HalDebugPort.cxx b/Kernel/HALKit/AMD64/HalDebugPort.cxx index a29a8129..8a161cc7 100644 --- a/Kernel/HALKit/AMD64/HalDebugPort.cxx +++ b/Kernel/HALKit/AMD64/HalDebugPort.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/AMD64/HalDescriptorLoader.cpp b/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx index 964b402a..7ded9259 100644 --- a/Kernel/HALKit/AMD64/HalDescriptorLoader.cpp +++ b/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -61,13 +61,14 @@ namespace Kernel::HAL { MUST_PASS(baseIdt[i]); - Detail::kInterruptVectorTable[i].Selector = kGdtCodeSelector; + Detail::kInterruptVectorTable[i].Selector = (i == kSyscallRoute) ? ((3 * 8) | 3) : kGdtCodeSelector; Detail::kInterruptVectorTable[i].Ist = 0x0; Detail::kInterruptVectorTable[i].TypeAttributes = kInterruptGate; - Detail::kInterruptVectorTable[i].OffsetLow = ((UIntPtr)baseIdt[i] & 0xFFFF); - Detail::kInterruptVectorTable[i].OffsetMid = (((UIntPtr)baseIdt[i] >> 16) & 0xFFFF); + Detail::kInterruptVectorTable[i].OffsetLow = ((UIntPtr)baseIdt[i] & __INT16_MAX__); + Detail::kInterruptVectorTable[i].OffsetMid = (((UIntPtr)baseIdt[i] >> 16) & __INT16_MAX__); Detail::kInterruptVectorTable[i].OffsetHigh = - (((UIntPtr)baseIdt[i] >> 32) & 0xFFFFFFFF); + (((UIntPtr)baseIdt[i] >> 32) & __INT32_MAX__); + Detail::kInterruptVectorTable[i].Zero = 0x0; } diff --git a/Kernel/HALKit/AMD64/HalHart.cpp b/Kernel/HALKit/AMD64/HalHart.cxx index 2a12ec50..adbf148c 100644 --- a/Kernel/HALKit/AMD64/HalHart.cpp +++ b/Kernel/HALKit/AMD64/HalHart.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/AMD64/HalInstallTIB.asm b/Kernel/HALKit/AMD64/HalInstallTIB.asm deleted file mode 100644 index aad5d6d0..00000000 --- a/Kernel/HALKit/AMD64/HalInstallTIB.asm +++ /dev/null @@ -1,24 +0,0 @@ -;; /* -;; * ======================================================== -;; * -;; * Kernel -;; * Copyright Zeta Electronics Corporation, all rights reserved. -;; * -;; * ======================================================== -;; */ - -[bits 64] - -[global rt_install_tib] - -section .text - -;; changed: rs, fs -;; expected: rcx, rdx - -rt_install_tib: - mov rcx, gs ;; TIB -> Thread Information Block - mov rdx, fs ;; PIB -> Process Information Block - ret - -;; //////////////////////////////////////////////////// ;; diff --git a/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/Kernel/HALKit/AMD64/HalInterruptAPI.asm index 016c9cd8..c09d5a06 100644 --- a/Kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/Kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -1,7 +1,7 @@ ;; /* ;; * --------------------------------------------------- ;; * -;; * Copyright Zeta Electronics Corporation, all rights reserved. +;; * Copyright ZKA Technologies, all rights reserved. ;; * ;; * File: HalInterruptAPI.asm ;; * Purpose: Interrupt routing, redirect raw interrupts into their handlers. @@ -121,53 +121,16 @@ IntNormal 31 [extern hal_apic_acknowledge] -__NEW_INT_32: -;; make this active, SMP works again. -%if 0 +__NEW_INT_34: push rax - push rcx - push rdx - push rbx - push rbp - push rsi - push rdi - push r8 - push r9 - push r10 - push r11 - push r12 - push r13 - push r14 - push r15 - - jmp hal_apic_acknowledge - - pop r15 - pop r14 - pop r13 - pop r12 - pop r11 - pop r10 - pop r9 - pop r8 - pop rdi - pop rsi - pop rbp - pop rbx - pop rdx - pop rcx + call hal_apic_acknowledge pop rax - mov rax, 0 - - ;; tell there local apic that we're done. - mov [0xFEE00000 + 0xB0], rax ; LAPIC_EOI -%endif iretq -IntNormal 33 +IntNormal 32 -IntNormal 34 +IntNormal 33 IntNormal 35 IntNormal 36 IntNormal 37 diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index 628314b5..1628e5e9 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -9,21 +9,26 @@ #include <FirmwareKit/Handover.hxx> #include <KernelKit/FileManager.hpp> #include <KernelKit/Framebuffer.hpp> -#include <KernelKit/KernelHeap.hpp> +#include <KernelKit/Heap.hxx> #include <KernelKit/PEFCodeManager.hxx> #include <KernelKit/ProcessScheduler.hxx> -#include <KernelKit/UserHeap.hpp> -#include <NewKit/Json.hpp> +#include <KernelKit/ProcessHeap.hxx> +#include <NewKit/Json.hxx> #include <Modules/CoreCG/Accessibility.hxx> #include <KernelKit/CodeManager.hpp> #include <Modules/ACPI/ACPIFactoryInterface.hxx> #include <NetworkKit/IPCEP.hxx> +#include <CFKit/Property.hpp> -#define KERNEL_INIT(X) X; \ +#define mInitKernel(X) \ + X; \ Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); +Kernel::Property cKernelVersion; +Kernel::Property cAutoFormatDisk; + /// @brief This symbol is the kernel main symbol. EXTERN_C void KeMain(); @@ -32,7 +37,7 @@ EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; struct PACKED HeapAllocInfo final { Kernel::VoidPtr fThe; - Kernel::Size fTheSz; + Kernel::Size fTheSz; }; struct PACKED ProcessBlockInfo final @@ -46,7 +51,7 @@ struct PACKED ProcessExitInfo final STATIC constexpr auto cReasonLen = 512; Kernel::Int64 fCode; - Kernel::Char fReason[cReasonLen]; + Kernel::Char fReason[cReasonLen]; }; namespace Kernel::HAL @@ -121,9 +126,9 @@ EXTERN_C void hal_init_platform( constexpr auto cCatalogCreate = 0x22; constexpr auto cRebootInterrupt = 0x23; constexpr auto cShutdownInterrupt = 0x24; - constexpr auto cLPCSendMsg = 0x25; - constexpr auto cLPCOpenMsg = 0x26; - constexpr auto cLPCCloseMsg = 0x27; + constexpr auto cLPCSendMsg = 0x25; + constexpr auto cLPCOpenMsg = 0x26; + constexpr auto cLPCCloseMsg = 0x27; constexpr auto cLPCSanitizeMsg = 0x28; kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { @@ -142,8 +147,9 @@ EXTERN_C void hal_init_platform( kSyscalls[cNewInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { // get HAC struct. HeapAllocInfo* rdxInf = reinterpret_cast<HeapAllocInfo*>(rdx); - - if (!rdxInf) return; + + if (!rdxInf) + return; // assign the fThe field with the pointer. rdxInf->fThe = Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().New(rdxInf->fTheSz); @@ -153,7 +159,8 @@ EXTERN_C void hal_init_platform( // get HAC struct. HeapAllocInfo* rdxInf = reinterpret_cast<HeapAllocInfo*>(rdx); - if (!rdxInf) return; + if (!rdxInf) + return; // delete ptr with sz in mind. Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Delete(rdxInf->fThe, rdxInf->fTheSz); @@ -161,8 +168,9 @@ EXTERN_C void hal_init_platform( kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { ProcessBlockInfo* rdxPb = reinterpret_cast<ProcessBlockInfo*>(rdx); - - if (!rdxPb) return; + + if (!rdxPb) + return; // install the fTIB and fPIB. rt_install_tib(rdxPb->fTIB, rdxPb->fPIB); @@ -170,8 +178,9 @@ EXTERN_C void hal_init_platform( kSyscalls[cExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { ProcessExitInfo* rdxEi = reinterpret_cast<ProcessExitInfo*>(rdx); - - if (!rdxEi) return; + + if (!rdxEi) + return; Kernel::kcout << "newoskrnl: " << rdxEi->fReason << "\r"; Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Exit(rdxEi->fCode); @@ -179,19 +188,20 @@ EXTERN_C void hal_init_platform( kSyscalls[cLastExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { ProcessExitInfo* rdxEi = reinterpret_cast<ProcessExitInfo*>(rdx); - - if (!rdxEi) return; - rdxEi->fCode = Kernel::rt_get_exit_code(); + if (!rdxEi) + return; + + rdxEi->fCode = Kernel::rt_get_exit_code(); }; kSyscalls[cRebootInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_RsdPtr); + Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_VendorPtr); acpi.Reboot(); }; kSyscalls[cShutdownInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_RsdPtr); + Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_VendorPtr); acpi.Shutdown(); }; @@ -206,7 +216,20 @@ EXTERN_C void hal_init_platform( kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true; kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fHooked = true; - Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr); + // newoskrnl version 1.00 + Kernel::StringView strVer(cMaxPropLen); + strVer += "\\Properties\\KernelVersion"; + + cKernelVersion.GetKey() = strVer; + cKernelVersion.GetValue() = __MAHROUSS__; + + Kernel::StringView strAutoMount(cMaxPropLen); + strAutoMount += "\\Properties\\AutoMountFS?"; + + cAutoFormatDisk.GetKey() = strAutoMount; + cAutoFormatDisk.GetValue() = Yes; + + Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); - KERNEL_INIT(KeMain()); + mInitKernel(KeMain()); } diff --git a/Kernel/HALKit/AMD64/HalKernelMouse.cxx b/Kernel/HALKit/AMD64/HalKernelMouse.cxx index 9cad6d35..9b3467fa 100644 --- a/Kernel/HALKit/AMD64/HalKernelMouse.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMouse.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -14,16 +14,16 @@ EXTERN_C Kernel::Boolean _hal_draw_mouse(); EXTERN_C Kernel::Void _hal_init_mouse(); -STATIC Kernel::Int32 kPrevX = 10; -STATIC Kernel::Int32 kPrevY = 10; -STATIC Kernel::Int32 kX = 10; -STATIC Kernel::Int32 kY = 10; +STATIC Kernel::Int32 kPrevX = 10; +STATIC Kernel::Int32 kPrevY = 10; +STATIC Kernel::Int32 kX = 10; +STATIC Kernel::Int32 kY = 10; STATIC Kernel::Int32 kMouseCycle = 0; STATIC Kernel::PS2MouseInterface kMousePS2; -STATIC Kernel::Char kMousePacket[4] = {}; +STATIC Kernel::Char kMousePacket[4] = {}; STATIC Kernel::Boolean kMousePacketReady = false; -STATIC GXInit(); +STATIC CGInit(); #define kPS2Leftbutton 0b00000001 #define kPS2Middlebutton 0b00000010 diff --git a/Kernel/HALKit/AMD64/HalPageAlloc.hpp b/Kernel/HALKit/AMD64/HalPageAlloc.hxx index 55193686..6e05e58e 100644 --- a/Kernel/HALKit/AMD64/HalPageAlloc.hpp +++ b/Kernel/HALKit/AMD64/HalPageAlloc.hxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -26,6 +26,10 @@ #define kPTESize (0x1000) #endif // !kPTESize +#ifndef kAlign +#define kAlign __BIGGEST_ALIGNMENT__ +#endif // !kAlign + EXTERN_C void hal_flush_tlb(); EXTERN_C void hal_write_cr3(Kernel::UIntPtr pde); EXTERN_C void hal_write_cr0(Kernel::UIntPtr bit); @@ -38,16 +42,16 @@ namespace Kernel::HAL { struct PACKED PageTable64 final { - bool Present : 1; - bool Rw : 1; - bool User : 1; - bool Wt : 1; - bool Cache : 1; - bool Accessed : 1; + bool Present : 1; + bool Rw : 1; + bool User : 1; + bool Wt : 1; + bool Cache : 1; + bool Accessed : 1; Kernel::Int32 Reserved : 6; Kernel::UInt64 PhysicalAddress : 36; Kernel::Int32 Reserved1 : 15; - bool ExecDisable : 1; + bool ExecDisable : 1; }; namespace Detail diff --git a/Kernel/HALKit/AMD64/HalProcessor.cpp b/Kernel/HALKit/AMD64/HalProcessor.cxx index 01f3879a..2eb2d693 100644 --- a/Kernel/HALKit/AMD64/HalProcessor.cpp +++ b/Kernel/HALKit/AMD64/HalProcessor.cxx @@ -1,10 +1,10 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ -#include <HALKit/AMD64/Processor.hpp> +#include <HALKit/AMD64/Processor.hxx> /** * @file Processor.cpp @@ -13,7 +13,7 @@ namespace Kernel::HAL { - void Out8(UInt16 port, UInt8 value) + Void Out8(UInt16 port, UInt8 value) { asm volatile("outb %%al, %1" : @@ -21,7 +21,7 @@ namespace Kernel::HAL : "memory"); } - void Out16(UInt16 port, UInt16 value) + Void Out16(UInt16 port, UInt16 value) { asm volatile("outw %%ax, %1" : @@ -29,7 +29,7 @@ namespace Kernel::HAL : "memory"); } - void Out32(UInt16 port, UInt32 value) + Void Out32(UInt16 port, UInt32 value) { asm volatile("outl %%eax, %1" : @@ -70,27 +70,27 @@ namespace Kernel::HAL return value; } - void rt_halt() + Void rt_halt() { asm volatile("hlt"); } - void rt_cli() + Void rt_cli() { asm volatile("cli"); } - void rt_sti() + Void rt_sti() { asm volatile("sti"); } - void rt_cld() + Void rt_cld() { asm volatile("cld"); } - void rt_std() + Void rt_std() { asm volatile("std"); } diff --git a/Kernel/HALKit/AMD64/HalSMPCoreManager.asm b/Kernel/HALKit/AMD64/HalSMPCoreManager.asm index 7b0926bb..7f6aa26a 100644 --- a/Kernel/HALKit/AMD64/HalSMPCoreManager.asm +++ b/Kernel/HALKit/AMD64/HalSMPCoreManager.asm @@ -2,7 +2,7 @@ ;; * ======================================================== ;; * ;; * Kernel -;; * Copyright Zeta Electronics Corporation, all rights reserved. +;; * Copyright ZKA Technologies, all rights reserved. ;; * ;; * ======================================================== ;; */ diff --git a/Kernel/HALKit/AMD64/HalSMPCore.cxx b/Kernel/HALKit/AMD64/HalScheduler.cxx index 4cb87542..791361b5 100644 --- a/Kernel/HALKit/AMD64/HalSMPCore.cxx +++ b/Kernel/HALKit/AMD64/HalScheduler.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -12,8 +12,8 @@ Void ProcessHeader::SetEntrypoint(UIntPtr& imageStart) noexcept if (imageStart == 0) this->Crash(); - this->StackFrame->Rbp = imageStart; - this->StackFrame->Rsp = this->StackFrame->Rbp; + this->StackFrame->BP = imageStart; + this->StackFrame->SP = this->StackFrame->BP; } namespace Kernel @@ -22,7 +22,7 @@ namespace Kernel { if (!stackPtr) return false; - if (stackPtr->Rbp == 0 || stackPtr->Rsp == 0) + if (stackPtr->BP == 0 || stackPtr->SP == 0) return false; return true; diff --git a/Kernel/HALKit/AMD64/HalTimer.cxx b/Kernel/HALKit/AMD64/HalTimer.cxx index e69de29b..e893198f 100644 --- a/Kernel/HALKit/AMD64/HalTimer.cxx +++ b/Kernel/HALKit/AMD64/HalTimer.cxx @@ -0,0 +1,14 @@ +/* -------------------------------------------
+
+ Copyright ZKA Technologies
+
+ File: HalTimer.cxx
+ Purpose: HAL timer
+
+ Revision History:
+
+ 07/07/24: Added file (amlel)
+
+------------------------------------------- */
+
+#include <ArchKit/ArchKit.hpp>
\ No newline at end of file diff --git a/Kernel/HALKit/AMD64/HalUtils.asm b/Kernel/HALKit/AMD64/HalUtils.asm new file mode 100644 index 00000000..6681a692 --- /dev/null +++ b/Kernel/HALKit/AMD64/HalUtils.asm @@ -0,0 +1,49 @@ +;; /* +;; * ======================================================== +;; * +;; * Kernel +;; * Copyright ZKA Technologies, all rights reserved. +;; * +;; * ======================================================== +;; */ + +[bits 64] + +[global rt_install_tib] + +section .text + +;; changed: rs, fs +;; expected: rcx, rdx + +rt_install_tib: + mov rcx, gs ;; TIB -> Thread Information Block + mov rdx, fs ;; PIB -> Process Information Block + ret + +;; //////////////////////////////////////////////////// ;; + +[global rt_jump_user_mode] + +;; @used rcx, address to jump on. +;; @note adjusted for long mode. +rt_jump_user_mode: + cmp rcx, 0 + je rt_jump_user_mode_failed + + mov ax, (6 * 8) | 3 ; user data segment with RPL 3 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax ; SS is handled by iret + + mov rax, rsp + push (6 * 8) | 3 + push rax + pushf + push (5 * 8) | 3 ; user code segment with RPL 3 + push rcx + iretq + ;; we just failed to validate the rcx, fallback and return to previous pc. +rt_jump_user_mode_failed: + ret
\ No newline at end of file diff --git a/Kernel/HALKit/AMD64/Hypervisor.hpp b/Kernel/HALKit/AMD64/Hypervisor.hpp index 1ab69ef4..b5fe48c2 100644 --- a/Kernel/HALKit/AMD64/Hypervisor.hpp +++ b/Kernel/HALKit/AMD64/Hypervisor.hpp @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -21,6 +21,5 @@ namespace Kernel ENUM_STRING(ParallelsAlt, " lrpepyh vr "); ENUM_STRING(Bhyve, "bhyve bhyve "); ENUM_STRING(Qnx, " QNXQVMBSQG "); - END_STRING_ENUM() } // namespace Kernel diff --git a/Kernel/HALKit/AMD64/PCI/Database.cxx b/Kernel/HALKit/AMD64/PCI/Database.cxx index 65ec307e..67ebc6df 100644 --- a/Kernel/HALKit/AMD64/PCI/Database.cxx +++ b/Kernel/HALKit/AMD64/PCI/Database.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/AMD64/PCI/Device.cxx b/Kernel/HALKit/AMD64/PCI/Device.cxx index c1fdc401..bec401d9 100644 --- a/Kernel/HALKit/AMD64/PCI/Device.cxx +++ b/Kernel/HALKit/AMD64/PCI/Device.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -10,11 +10,11 @@ Kernel::UInt NewOSPCIReadRaw(Kernel::UInt bar, Kernel::UShort bus, Kernel::UShort dev, Kernel::UShort fun) { Kernel::UInt target = 0x80000000 | ((Kernel::UInt)bus << 16) | - ((Kernel::UInt)dev << 11) | ((Kernel::UInt)fun << 8) | - (bar & 0xFC); + ((Kernel::UInt)dev << 11) | ((Kernel::UInt)fun << 8) | + (bar & 0xFC); Kernel::HAL::Out32((Kernel::UShort)Kernel::PCI::PciConfigKind::ConfigAddress, - target); + target); return Kernel::HAL::In32((Kernel::UShort)Kernel::PCI::PciConfigKind::ConfigData); } @@ -22,11 +22,11 @@ Kernel::UInt NewOSPCIReadRaw(Kernel::UInt bar, Kernel::UShort bus, Kernel::UShor void NewOSPCISetCfgTarget(Kernel::UInt bar, Kernel::UShort bus, Kernel::UShort dev, Kernel::UShort fun) { Kernel::UInt target = 0x80000000 | ((Kernel::UInt)bus << 16) | - ((Kernel::UInt)dev << 11) | ((Kernel::UInt)fun << 8) | - (bar & ~3); + ((Kernel::UInt)dev << 11) | ((Kernel::UInt)fun << 8) | + (bar & ~3); Kernel::HAL::Out32((Kernel::UShort)Kernel::PCI::PciConfigKind::ConfigAddress, - target); + target); } namespace Kernel::PCI diff --git a/Kernel/HALKit/AMD64/PCI/Dma.cxx b/Kernel/HALKit/AMD64/PCI/Dma.cxx index 3e6319e3..65bf7e72 100644 --- a/Kernel/HALKit/AMD64/PCI/Dma.cxx +++ b/Kernel/HALKit/AMD64/PCI/Dma.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/AMD64/PCI/Express.cxx b/Kernel/HALKit/AMD64/PCI/Express.cxx index 2b88f312..cb999fe0 100644 --- a/Kernel/HALKit/AMD64/PCI/Express.cxx +++ b/Kernel/HALKit/AMD64/PCI/Express.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/AMD64/PCI/IO.cxx b/Kernel/HALKit/AMD64/PCI/IO.cxx index 24ee05b3..8da2b21e 100644 --- a/Kernel/HALKit/AMD64/PCI/IO.cxx +++ b/Kernel/HALKit/AMD64/PCI/IO.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/AMD64/PCI/Iterator.cxx b/Kernel/HALKit/AMD64/PCI/Iterator.cxx index 0f766111..df593f7a 100644 --- a/Kernel/HALKit/AMD64/PCI/Iterator.cxx +++ b/Kernel/HALKit/AMD64/PCI/Iterator.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/AMD64/PCI/PCI.cxx b/Kernel/HALKit/AMD64/PCI/PCI.cxx index eaf7f20a..d15b1b9a 100644 --- a/Kernel/HALKit/AMD64/PCI/PCI.cxx +++ b/Kernel/HALKit/AMD64/PCI/PCI.cxx @@ -1,7 +1,7 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ -#include <KernelKit/PCI/PCI.hpp> +#include <KernelKit/PCI/PCI.hxx> diff --git a/Kernel/HALKit/AMD64/Processor.hpp b/Kernel/HALKit/AMD64/Processor.hxx index 756c5770..92b91c70 100644 --- a/Kernel/HALKit/AMD64/Processor.hpp +++ b/Kernel/HALKit/AMD64/Processor.hxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies File: Prcoessor.hxx Purpose: AMD64 processor abstraction. @@ -17,7 +17,12 @@ #include <NewKit/Defines.hpp> #include <NewKit/Utils.hpp> #include <FirmwareKit/Handover.hxx> -#include <HALKit/AMD64/HalPageAlloc.hpp> +#include <HALKit/AMD64/HalPageAlloc.hxx> + +EXTERN_C +{ +#include <cpuid.h> +} #ifdef kCPUBackendName #undef kCPUBackendName @@ -25,6 +30,8 @@ #define kCPUBackendName "AMD64" +#define kSyscallRoute 0x32 + #define IsActiveLow(FLG) (FLG & 2) #define IsLevelTriggered(FLG) (FLG & 8) @@ -32,6 +39,7 @@ #define kTrapGate (0xEF) #define kTaskGate (0b10001100) #define kGdtCodeSelector (0x08) +#define kGdtUserCodeSelector (0x10) #define cHeapStartOffset (0x10000000) namespace Kernel @@ -71,16 +79,17 @@ namespace Kernel::HAL { UInt16 pml4_index = (virt_addr >> 39) & 0x1FF; - if (!pde->Pte[pml4_index].Present) + if (pde && !pde->Pte[pml4_index].Present) { pde->Pte[pml4_index].Present = true; - kcout << "PM is present now.\r"; pde->Pte[pml4_index].PhysicalAddress = phys_addr; pde->Pte[pml4_index].Rw = flags & eFlagsRw; pde->Pte[pml4_index].User = flags & eFlagsUser; pde->Pte[pml4_index].ExecDisable = flags & eFlagsExecDisable; + kcout << "PTE is present now.\r"; + return 0; } else @@ -90,13 +99,13 @@ namespace Kernel::HAL kcout << "PhysicalAddress: " << hex_number(pde->Pte[pml4_index].PhysicalAddress); kcout << "\r"; - kcout << "User: " << (pde->Pte[pml4_index].User ? "YES" : "NO") << "\r"; - kcout << "RW: " << (pde->Pte[pml4_index].Rw ? "YES" : "NO") << "\r"; + kcout << "User: " << (pde->Pte[pml4_index].User ? "true" : "false") << "\r"; + kcout << "RW: " << (pde->Pte[pml4_index].Rw ? "true" : "false") << "\r"; - return 1; + return 0; } - return 0; + return 1; } /// @brief Map address to PDE. @@ -104,7 +113,7 @@ namespace Kernel::HAL /// @param phys_addr /// @param virt_addr /// @param flags - inline void ke_unmap_address(PDE* pde, UIntPtr phys_addr, UIntPtr virt_addr, UInt32 flags) + inline Void ke_unmap_address(PDE* pde, UIntPtr phys_addr, UIntPtr virt_addr, UInt32 flags) { UInt16 pml4_index = (virt_addr >> 39) & 0x1FF; @@ -152,10 +161,11 @@ namespace Kernel::HAL typedef UIntPtr Reg; + /// @brief Stack frame (as retrieved from assembly.) struct PACKED StackFrame final { Reg IntNum, Exception; - Reg Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax; + Reg A0, A2, BP, SP, A3, A4, A5, A6; Reg R8, R9, R10, R11, R12, R13, R14, R15; Reg Gs, Fs; }; @@ -200,11 +210,12 @@ namespace Kernel::HAL class SegmentDescriptorComparator final { public: - bool IsValid(SegmentDescriptor& seg) + Bool IsValid(SegmentDescriptor& seg) { return seg.Base > seg.Limit; } - bool Equals(SegmentDescriptor& seg, SegmentDescriptor& segRight) + + Bool Equals(SegmentDescriptor& seg, SegmentDescriptor& segRight) { return seg.Base == segRight.Base && seg.Limit == segRight.Limit; } @@ -215,29 +226,65 @@ namespace Kernel::HAL class GDTLoader final { public: - static void Load(RegisterGDT& gdt); - static void Load(Ref<RegisterGDT>& gdt); + static Void Load(RegisterGDT& gdt); + static Void Load(Ref<RegisterGDT>& gdt); }; class IDTLoader final { public: - static void Load(Register64& idt); - static void Load(Ref<Register64>& idt); + static Void Load(Register64& idt); + static Void Load(Ref<Register64>& idt); }; Void hal_system_get_cores(VoidPtr rsdPtr); Void hal_send_start_ipi(UInt32 apicId, UInt8 vector, UInt32 targetAddress); Void hal_send_end_ipi(UInt32 apicId, UInt8 vector, UInt32 targetAddress); - /// @brief Processor specific structures. - namespace Detail + /// @brief Do a cpuid to check if MSR exists on CPU. + /// @retval true it does exists. + /// @retval false it doesn't. + inline Bool hal_has_msr() noexcept + { + static UInt32 eax, unused, edx; // eax, edx + + __get_cpuid(1, &eax, &unused, &unused, &edx); + + // edx returns the flag for MSR (which is 1 shifted to 5.) + return edx & (1 << 5); + } + + /// @brief Get Model-specific register. + /// @param msr MSR + /// @param lo low byte + /// @param hi high byte + inline Void hal_get_msr(UInt32 msr, UInt32* lo, UInt32* hi) noexcept + { + if (!lo || !hi) + return; + + asm volatile("rdmsr" + : "=a"(*lo), "=d"(*hi) + : "c"(msr)); + } + + /// @brief Set Model-specific register. + /// @param msr MSR + /// @param lo low byte + /// @param hi high byte + inline Void hal_set_msr(UInt32 msr, UInt32 lo, UInt32 hi) noexcept { - EXTERN_C void _ke_power_on_self_test(void); + asm volatile("wrmsr" + : + : "a"(lo), "d"(hi), "c"(msr)); + } + /// @brief Processor specific namespace. + namespace Detail + { /** - @brief Global descriptor table entry, either null, code or data. -*/ + @brief Global descriptor table entry, either null, code or data. + */ struct PACKED NewOSGDTRecord final { @@ -259,15 +306,35 @@ namespace Kernel::HAL NewOSGDTRecord UserData; }; } // namespace Detail + + class APICController + { + public: + explicit APICController(VoidPtr base) + : fApic(base) + { + } + + ~APICController() = default; + + NEWOS_COPY_DEFAULT(APICController); + + public: + UInt32 Read(UInt32 reg) noexcept; + Void Write(UInt32 reg, UInt32 value) noexcept; + + private: + VoidPtr fApic{nullptr}; + }; } // namespace Kernel::HAL -EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp); -EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp); -EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp); -EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp); +EXTERN_C Kernel::Void idt_handle_generic(Kernel::UIntPtr rsp); +EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp); +EXTERN_C Kernel::Void idt_handle_math(Kernel::UIntPtr rsp); +EXTERN_C Kernel::Void idt_handle_pf(Kernel::UIntPtr rsp); -EXTERN_C void hal_load_idt(Kernel::HAL::Register64 ptr); -EXTERN_C void hal_load_gdt(Kernel::HAL::RegisterGDT ptr); +EXTERN_C Kernel::Void hal_load_idt(Kernel::HAL::Register64 ptr); +EXTERN_C Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr); /// @brief Maximum size of the IDT. #define kKernelIdtSize 0x100 diff --git a/Kernel/HALKit/AMD64/Storage/AHCI.cxx b/Kernel/HALKit/AMD64/Storage/AHCI.cxx index 51153417..7a83b836 100644 --- a/Kernel/HALKit/AMD64/Storage/AHCI.cxx +++ b/Kernel/HALKit/AMD64/Storage/AHCI.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -11,7 +11,7 @@ * @version 0.1 * @date 2024-02-02 * - * @copyright Copyright (c) Zeta Electronics Corporation + * @copyright Copyright (c) ZKA Technologies * */ diff --git a/Kernel/HALKit/AMD64/Storage/ATA-DMA.cxx b/Kernel/HALKit/AMD64/Storage/ATA-DMA.cxx index 33e6bc31..bcba23e1 100644 --- a/Kernel/HALKit/AMD64/Storage/ATA-DMA.cxx +++ b/Kernel/HALKit/AMD64/Storage/ATA-DMA.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -11,7 +11,7 @@ * @version 0.1 * @date 2024-02-02 * - * @copyright Copyright (c) Zeta Electronics Corporation + * @copyright Copyright (c) ZKA Technologies * */ diff --git a/Kernel/HALKit/AMD64/Storage/ATA-PIO.cxx b/Kernel/HALKit/AMD64/Storage/ATA-PIO.cxx index 1a8e78c3..fa64294d 100644 --- a/Kernel/HALKit/AMD64/Storage/ATA-PIO.cxx +++ b/Kernel/HALKit/AMD64/Storage/ATA-PIO.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -11,7 +11,7 @@ * @version 0.1 * @date 2024-02-02 * - * @copyright Copyright (c) Zeta Electronics Corporation + * @copyright Copyright (c) ZKA Technologies * */ diff --git a/Kernel/HALKit/ARM64/HalHart.cxx b/Kernel/HALKit/ARM64/HalHart.cxx new file mode 100644 index 00000000..d7a34505 --- /dev/null +++ b/Kernel/HALKit/ARM64/HalHart.cxx @@ -0,0 +1,29 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#include <ArchKit/ArchKit.hpp> + +// bugs = 0 + +namespace Kernel +{ + /// @brief wakes up thread. + /// wakes up thread from hang. + void rt_wakeup_thread(HAL::StackFrame* stack) + { + rt_do_context_switch(stack); + } + + /// @brief makes the thread sleep on a loop. + /// hooks and hangs thread to prevent code from executing. + void rt_hang_thread(HAL::StackFrame* stack) + { + while (true) + { + /* nohing, code is spinning */ + } + } +} // namespace Kernel diff --git a/Kernel/HALKit/ARM64/HalKernelMain.cxx b/Kernel/HALKit/ARM64/HalKernelMain.cxx new file mode 100644 index 00000000..a2d215f6 --- /dev/null +++ b/Kernel/HALKit/ARM64/HalKernelMain.cxx @@ -0,0 +1,178 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#include <ArchKit/ArchKit.hpp> +#include <Modules/CoreCG/CoreCG.hxx> +#include <FirmwareKit/Handover.hxx> +#include <KernelKit/FileManager.hpp> +#include <KernelKit/Framebuffer.hpp> +#include <KernelKit/Heap.hxx> +#include <KernelKit/PEFCodeManager.hxx> +#include <KernelKit/ProcessScheduler.hxx> +#include <KernelKit/ProcessHeap.hxx> +#include <NewKit/Json.hxx> +#include <Modules/CoreCG/Accessibility.hxx> +#include <KernelKit/CodeManager.hpp> +#include <Modules/ACPI/ACPIFactoryInterface.hxx> +#include <NetworkKit/IPCEP.hxx> + +#define KERNEL_INIT(X) \ + X; \ + Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); + +/// @brief This symbol is the kernel main symbol. +EXTERN_C void KeMain(); + +EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; + +struct PACKED HeapAllocInfo final +{ + Kernel::VoidPtr fThe; + Kernel::Size fTheSz; +}; + +struct PACKED ProcessBlockInfo final +{ + ThreadInformationBlock* fTIB; + ThreadInformationBlock* fPIB; +}; + +struct PACKED ProcessExitInfo final +{ + STATIC constexpr auto cReasonLen = 512; + + Kernel::Int64 fCode; + Kernel::Char fReason[cReasonLen]; +}; + +EXTERN_C void hal_init_platform( + Kernel::HEL::HandoverInformationHeader* HandoverHeader) +{ + /* Setup globals. */ + + kHandoverHeader = HandoverHeader; + + if (kHandoverHeader->f_Magic != kHandoverMagic && + kHandoverHeader->f_Version != kHandoverVersion) + { + return; + } + + kKernelVirtualSize = HandoverHeader->f_VirtualSize; + kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>( + reinterpret_cast<Kernel::UIntPtr>(HandoverHeader->f_VirtualStart) + cHeapStartOffset); + + kKernelPhysicalStart = HandoverHeader->f_PhysicalStart; + + // Register the basic SCI functions. + + constexpr auto cSerialAlertInterrupt = 0x10; + constexpr auto cTlsInterrupt = 0x11; + constexpr auto cTlsInstallInterrupt = 0x12; + constexpr auto cNewInterrupt = 0x13; + constexpr auto cDeleteInterrupt = 0x14; + constexpr auto cExitInterrupt = 0x15; + constexpr auto cLastExitInterrupt = 0x16; + constexpr auto cCatalogOpen = 0x17; + constexpr auto cForkRead = 0x18; + constexpr auto cForkWrite = 0x19; + constexpr auto cCatalogClose = 0x20; + constexpr auto cCatalogRemove = 0x21; + constexpr auto cCatalogCreate = 0x22; + constexpr auto cRebootInterrupt = 0x23; + constexpr auto cShutdownInterrupt = 0x24; + constexpr auto cLPCSendMsg = 0x25; + constexpr auto cLPCOpenMsg = 0x26; + constexpr auto cLPCCloseMsg = 0x27; + constexpr auto cLPCSanitizeMsg = 0x28; + + kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + const char* msg = (const char*)rdx; + Kernel::kcout << "serial: " << msg << "\r"; + }; + + kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + tls_check_syscall_impl(rdx); + }; + + kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + Kernel::ipc_sanitize_packet(reinterpret_cast<Kernel::IPCEPMessageHeader*>(rdx)); + }; + + kSyscalls[cNewInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + // get HAC struct. + HeapAllocInfo* rdxInf = reinterpret_cast<HeapAllocInfo*>(rdx); + + if (!rdxInf) + return; + + // assign the fThe field with the pointer. + rdxInf->fThe = Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().New(rdxInf->fTheSz); + }; + + kSyscalls[cDeleteInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + // get HAC struct. + HeapAllocInfo* rdxInf = reinterpret_cast<HeapAllocInfo*>(rdx); + + if (!rdxInf) + return; + + // delete ptr with sz in mind. + Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Delete(rdxInf->fThe, rdxInf->fTheSz); + }; + + kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + ProcessBlockInfo* rdxPb = reinterpret_cast<ProcessBlockInfo*>(rdx); + + if (!rdxPb) + return; + + // install the fTIB and fPIB. + rt_install_tib(rdxPb->fTIB, rdxPb->fPIB); + }; + + kSyscalls[cExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + ProcessExitInfo* rdxEi = reinterpret_cast<ProcessExitInfo*>(rdx); + + if (!rdxEi) + return; + + Kernel::kcout << "newoskrnl: " << rdxEi->fReason << "\r"; + Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Exit(rdxEi->fCode); + }; + + kSyscalls[cLastExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + ProcessExitInfo* rdxEi = reinterpret_cast<ProcessExitInfo*>(rdx); + + if (!rdxEi) + return; + + rdxEi->fCode = Kernel::rt_get_exit_code(); + }; + + kSyscalls[cRebootInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_VendorPtr); + acpi.Reboot(); + }; + + kSyscalls[cShutdownInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { + Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_VendorPtr); + acpi.Shutdown(); + }; + + kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cDeleteInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cNewInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cExitInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fHooked = true; + + KERNEL_INIT(KeMain()); +} diff --git a/Kernel/HALKit/ARM64/HalPageAlloc.hpp b/Kernel/HALKit/ARM64/HalPageAlloc.hxx index 8286b5cd..7e34dc75 100644 --- a/Kernel/HALKit/ARM64/HalPageAlloc.hpp +++ b/Kernel/HALKit/ARM64/HalPageAlloc.hxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/ARM64/HalScheduler.cxx b/Kernel/HALKit/ARM64/HalScheduler.cxx new file mode 100644 index 00000000..08703435 --- /dev/null +++ b/Kernel/HALKit/ARM64/HalScheduler.cxx @@ -0,0 +1,31 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#include <KernelKit/ProcessScheduler.hxx> + +using namespace Kernel; + +Void ProcessHeader::SetEntrypoint(UIntPtr& imageStart) noexcept +{ + if (imageStart == 0) + this->Crash(); + + this->StackFrame->BP = imageStart; + this->StackFrame->SP = this->StackFrame->BP; +} + +namespace Kernel +{ + bool rt_check_stack(HAL::StackFramePtr stackPtr) + { + if (!stackPtr) + return false; + if (stackPtr->BP == 0 || stackPtr->SP == 0) + return false; + + return true; + } +} // namespace Kernel diff --git a/Kernel/HALKit/ARM64/HalTimer.cxx b/Kernel/HALKit/ARM64/HalTimer.cxx index aa39adef..63e924c3 100644 --- a/Kernel/HALKit/ARM64/HalTimer.cxx +++ b/Kernel/HALKit/ARM64/HalTimer.cxx @@ -1,7 +1,16 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies + + File: HalTimer.cxx + Purpose: HAL timer + + Revision History: + + 07/07/24: Added file (amlel) ------------------------------------------- */ -#include <NewKit/Defines.hpp> +#include <ArchKit/ArchKit.hpp> + +struct TimerInfoStruct; diff --git a/Kernel/HALKit/ARM64/Processor.hxx b/Kernel/HALKit/ARM64/Processor.hxx index 631ecdf0..63c73972 100644 --- a/Kernel/HALKit/ARM64/Processor.hxx +++ b/Kernel/HALKit/ARM64/Processor.hxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ @@ -36,10 +36,11 @@ namespace Kernel::HAL typedef UIntPtr Reg; typedef Register64 Register; + /// @note let's keep the same name as AMD64 HAL. struct PACKED StackFrame final { Reg IntNum, Exception; - Reg Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax; + Reg A0, A2, BP, SP, A3, A4, A5, A6; Reg R8, R9, R10, R11, R12, R13, R14, R15; Reg Gs, Fs; }; @@ -52,4 +53,4 @@ inline Kernel::UIntPtr kKernelVirtualSize = 0UL; inline Kernel::VoidPtr kKernelPhysicalStart = nullptr; -#include <HALKit/ARM64/HalPageAlloc.hpp> +#include <HALKit/ARM64/HalPageAlloc.hxx> diff --git a/Kernel/HALKit/ARM64/ReadMe.md b/Kernel/HALKit/ARM64/ReadMe.md index d4d35a0b..c51229f2 100644 --- a/Kernel/HALKit/ARM64/ReadMe.md +++ b/Kernel/HALKit/ARM64/ReadMe.md @@ -1,3 +1,3 @@ # ARM64 Hardware Abstraction Layer -- Supported Firmware: CoreBoot
\ No newline at end of file +- Supported Firmware: CoreBoot/EDK/OpenMobileBoot diff --git a/Kernel/HALKit/ARM64/Storage/HalFlash.cxx b/Kernel/HALKit/ARM64/Storage/HalFlash.cxx index 20c2836d..ca2d4883 100644 --- a/Kernel/HALKit/ARM64/Storage/HalFlash.cxx +++ b/Kernel/HALKit/ARM64/Storage/HalFlash.cxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp b/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp index 4469eee9..579af6b5 100644 --- a/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp +++ b/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp @@ -1,11 +1,11 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ #include <ArchKit/ArchKit.hpp> -#include <HALKit/AXP/Processor.hpp> +#include <HALKit/AXP/Processor.hxx> /// @brief Internal call for syscall, to work with C++. /// @param stack diff --git a/Kernel/HALKit/AXP/Processor.hpp b/Kernel/HALKit/AXP/Processor.hpp index a3799ae7..a244ff91 100644 --- a/Kernel/HALKit/AXP/Processor.hpp +++ b/Kernel/HALKit/AXP/Processor.hpp @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/POWER/HalContextSwitchPowerPC.s b/Kernel/HALKit/POWER/HalContextSwitchPowerPC.s index 14d805db..e14efb6b 100644 --- a/Kernel/HALKit/POWER/HalContextSwitchPowerPC.s +++ b/Kernel/HALKit/POWER/HalContextSwitchPowerPC.s @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/POWER/HalHardware.cxx b/Kernel/HALKit/POWER/HalHardware.cxx index 15407eb3..a057355e 100644 --- a/Kernel/HALKit/POWER/HalHardware.cxx +++ b/Kernel/HALKit/POWER/HalHardware.cxx @@ -1,10 +1,10 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ -#include <HALKit/POWER/Processor.hpp> +#include <HALKit/POWER/Processor.hxx> #include <KernelKit/DebugOutput.hpp> namespace Kernel diff --git a/Kernel/HALKit/POWER/HalHart.cxx b/Kernel/HALKit/POWER/HalHart.cxx index 614828cb..5ff12218 100644 --- a/Kernel/HALKit/POWER/HalHart.cxx +++ b/Kernel/HALKit/POWER/HalHart.cxx @@ -1,10 +1,10 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ -#include <HALKit/POWER/Processor.hpp> +#include <HALKit/POWER/Processor.hxx> #include <KernelKit/DebugOutput.hpp> #include <HALKit/POWER/Hart.hxx> diff --git a/Kernel/HALKit/POWER/HalSerialPort.cxx b/Kernel/HALKit/POWER/HalSerialPort.cxx index abddd291..86b43bb7 100644 --- a/Kernel/HALKit/POWER/HalSerialPort.cxx +++ b/Kernel/HALKit/POWER/HalSerialPort.cxx @@ -1,10 +1,10 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ -#include <HALKit/POWER/Processor.hpp> +#include <HALKit/POWER/Processor.hxx> #include <KernelKit/DebugOutput.hpp> using namespace Kernel; @@ -17,7 +17,7 @@ void ke_io_write(const Char* bytes) return; SizeT index = 0; - SizeT len = rt_string_len(bytes, 256); + SizeT len = rt_string_len(bytes, 255); while (index < len) { diff --git a/Kernel/HALKit/POWER/HalStartSequence.s b/Kernel/HALKit/POWER/HalStartSequence.s index 07cec350..a2741103 100644 --- a/Kernel/HALKit/POWER/HalStartSequence.s +++ b/Kernel/HALKit/POWER/HalStartSequence.s @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ diff --git a/Kernel/HALKit/POWER/HalThread.cxx b/Kernel/HALKit/POWER/HalThread.cxx index 18d84d4f..b3be23c4 100644 --- a/Kernel/HALKit/POWER/HalThread.cxx +++ b/Kernel/HALKit/POWER/HalThread.cxx @@ -1,10 +1,10 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ -#include <HALKit/POWER/Processor.hpp> +#include <HALKit/POWER/Processor.hxx> #include <KernelKit/DebugOutput.hpp> EXTERN_C Kernel::HAL::StackFramePtr rt_get_current_context() diff --git a/Kernel/HALKit/POWER/HalVirtualMemory.cxx b/Kernel/HALKit/POWER/HalVirtualMemory.cxx index eb04a43d..039bf509 100644 --- a/Kernel/HALKit/POWER/HalVirtualMemory.cxx +++ b/Kernel/HALKit/POWER/HalVirtualMemory.cxx @@ -1,26 +1,20 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ #include <HALKit/POWER/ppc-cpu.h> #include <HALKit/POWER/ppc-mmu.h> -#include <HALKit/POWER/Processor.hpp> +#include <HALKit/POWER/Processor.hxx> #include <KernelKit/DebugOutput.hpp> -/// @note refer to our SoC documentation. +/// @note refer to the SoC documentation. using namespace Kernel; -/// @brief Write directly to the specific TLB. -/// @param mas0 -/// @param mas1 -/// @param mas2 -/// @param mas3 -/// @param mas7 -static void hal_write_tlb(uint32_t mas0, uint32_t mas1, uint32_t mas2, uint32_t mas3, uint32_t mas7) +Void hal_write_tlb(UInt32 mas0, UInt32 mas1, UInt32 mas2, UInt32 mas3, UInt32 mas7) { mtspr(MAS0, mas0); mtspr(MAS1, mas1); @@ -31,23 +25,26 @@ static void hal_write_tlb(uint32_t mas0, uint32_t mas1, uint32_t mas2, uint32_t hal_flush_tlb(); } -void hal_set_tlb(uint8_t tlb, uint32_t epn, uint64_t rpn, uint8_t perms, uint8_t wimge, uint8_t ts, uint8_t esel, uint8_t tsize, uint8_t iprot) +Bool hal_set_tlb(UInt8 tlb, UInt32 epn, UInt64 rpn, UInt8 perms, UInt8 wimge, UInt8 ts, UInt8 esel, UInt8 tsize, UInt8 iprot) { if ((mfspr(SPRN_MMUCFG) & MMUCFG_MAVN) == MMUCFG_MAVN_V1 && (tsize & 1)) { // this mmu-version does not allow odd tsize values - return; + return false; } - uint32_t mas0 = FSL_BOOKE_MAS0(tlb, esel, 0); - uint32_t mas1 = FSL_BOOKE_MAS1(1, iprot, 0, ts, tsize); - uint32_t mas2 = FSL_BOOKE_MAS2(epn, wimge); - uint32_t mas3 = FSL_BOOKE_MAS3(rpn, 0, perms); - uint32_t mas7 = FSL_BOOKE_MAS7(rpn); + + UInt32 mas0 = FSL_BOOKE_MAS0(tlb, esel, 0); + UInt32 mas1 = FSL_BOOKE_MAS1(1, iprot, 0, ts, tsize); + UInt32 mas2 = FSL_BOOKE_MAS2(epn, wimge); + UInt32 mas3 = FSL_BOOKE_MAS3(rpn, 0, perms); + UInt32 mas7 = FSL_BOOKE_MAS7(rpn); hal_write_tlb(mas0, mas1, mas2, mas3, mas7); + + return true; } -/// @brief Flush system TLB. +/// @brief Flush TLB EXTERN_C void hal_flush_tlb() { asm volatile("isync;tlbwe;msync;isync"); diff --git a/Kernel/HALKit/POWER/Hart.hxx b/Kernel/HALKit/POWER/Hart.hxx index 8f466098..e887ce4a 100644 --- a/Kernel/HALKit/POWER/Hart.hxx +++ b/Kernel/HALKit/POWER/Hart.hxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies File: Hart.hxx Purpose: POWER hardware threads. @@ -22,9 +22,9 @@ typedef Kernel::Int32 PPCHartType; typedef struct HalHardwareThread { Kernel::UIntPtr fStartAddress; - Kernel::UInt8 fPrivleged : 1; - Kernel::UInt32 fPageFlags; - PPCHartType fIdentNumber; + Kernel::UInt8 fPrivleged : 1; + Kernel::UInt32 fPageFlags; + PPCHartType fIdentNumber; } HalHardwareThread; /// @brief Set PC to specific hart. diff --git a/Kernel/HALKit/POWER/MBCI/HalMBCIHost.cxx b/Kernel/HALKit/POWER/MBCI/HalMBCIHost.cxx index 8a24506a..93cf86ae 100644 --- a/Kernel/HALKit/POWER/MBCI/HalMBCIHost.cxx +++ b/Kernel/HALKit/POWER/MBCI/HalMBCIHost.cxx @@ -1,8 +1,8 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ -#include <HALKit/POWER/Processor.hpp> +#include <HALKit/POWER/Processor.hxx> #include <KernelKit/DebugOutput.hpp> diff --git a/Kernel/HALKit/POWER/Processor.hpp b/Kernel/HALKit/POWER/Processor.hpp deleted file mode 100644 index 5ff7eef3..00000000 --- a/Kernel/HALKit/POWER/Processor.hpp +++ /dev/null @@ -1,55 +0,0 @@ -/* ------------------------------------------- - - Copyright Zeta Electronics Corporation - - Purpose: POWER processor header. - -------------------------------------------- */ - -#pragma once - -#include <NewKit/Defines.hpp> -#include <NewKit/Utils.hpp> - -#define kHalPPCAlignment __attribute__((aligned(4))) - -namespace Kernel::HAL -{ - typedef UIntPtr Reg; - - struct kHalPPCAlignment StackFrame - { - Reg R0; - Reg R1; - Reg R2; - Reg R3; - Reg R4; - Reg R5; - Reg R6; - Reg R7; - Reg R8; - Reg PC; - Reg SP; - }; - - typedef StackFrame* StackFramePtr; - - inline void rt_halt() - { - while (1) - { - asm volatile("mr 0, 0"); // no oop. - } - } - - inline void rt_cli() - { - asm volatile("mr 0, 0"); // no oop - } -} // namespace Kernel::HAL - -EXTERN_C void int_handle_math(Kernel::UIntPtr sp); -EXTERN_C void int_handle_pf(Kernel::UIntPtr sp); - -/// @brief Flush system TLB. -EXTERN_C void hal_flush_tlb(); diff --git a/Kernel/HALKit/POWER/Processor.hxx b/Kernel/HALKit/POWER/Processor.hxx new file mode 100644 index 00000000..b2186aa7 --- /dev/null +++ b/Kernel/HALKit/POWER/Processor.hxx @@ -0,0 +1,56 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + + Purpose: POWER processor header. + +------------------------------------------- */ + +#pragma once + +#include <NewKit/Defines.hpp> +#include <NewKit/Utils.hpp> + +#define NoOp() asm volatile("mr 0, 0") +#define kHalPPCAlignment __attribute__((aligned(4))) + +namespace Kernel::HAL +{ + typedef UIntPtr Reg; + + /// @brief Stack frame (as retrieved from assembly.) + struct PACKED StackFrame final + { + Reg IntNum, Exception; + Reg A0, A2, BP, SP, A3, A4, A5, A6; + Reg R8, R9, R10, R11, R12, R13, R14, R15; + Reg Gs, Fs; + }; + + typedef StackFrame* StackFramePtr; + + inline void rt_halt() + { + while (true) + { + NoOp(); // no oop. + } + } + + inline void rt_cli() + { + NoOp(); // no oop + } +} // namespace Kernel::HAL + +EXTERN_C Kernel::Void int_handle_math(Kernel::UIntPtr sp); +EXTERN_C Kernel::Void int_handle_pf(Kernel::UIntPtr sp); + +/// @brief Set TLB. +Kernel::Bool hal_set_tlb(Kernel::UInt8 tlb, Kernel::UInt32 epn, Kernel::UInt64 rpn, Kernel::UInt8 perms, Kernel::UInt8 wimge, Kernel::UInt8 ts, Kernel::UInt8 esel, Kernel::UInt8 tsize, Kernel::UInt8 iprot); + +/// @brief Write TLB. +Kernel::Void hal_write_tlb(Kernel::UInt32 mas0, Kernel::UInt32 mas1, Kernel::UInt32 mas2, Kernel::UInt32 mas3, Kernel::UInt32 mas7); + +/// @brief Flush TLB. +EXTERN_C Kernel::Void hal_flush_tlb(); diff --git a/Kernel/HALKit/POWER/ppc-cpu.h b/Kernel/HALKit/POWER/ppc-cpu.h index 3855b85c..46979e5f 100644 --- a/Kernel/HALKit/POWER/ppc-cpu.h +++ b/Kernel/HALKit/POWER/ppc-cpu.h @@ -141,36 +141,36 @@ struct pt_regs #define SPRN_DBCR 0x3F2 /* Debug Control Regsiter */ #define DBCR_EDM 0x80000000 #define DBCR_IDM 0x40000000 -#define DBCR_RST(x) (((x)&0x3) << 28) +#define DBCR_RST(x) (((x) & 0x3) << 28) #define DBCR_RST_NONE 0 #define DBCR_RST_CORE 1 #define DBCR_RST_CHIP 2 #define DBCR_RST_SYSTEM 3 -#define DBCR_IC 0x08000000 /* Instruction Completion Debug Evnt */ -#define DBCR_BT 0x04000000 /* Branch Taken Debug Event */ -#define DBCR_EDE 0x02000000 /* Exception Debug Event */ -#define DBCR_TDE 0x01000000 /* TRAP Debug Event */ -#define DBCR_FER 0x00F80000 /* First Events Remaining Mask */ -#define DBCR_FT 0x00040000 /* Freeze Timers on Debug Event */ -#define DBCR_IA1 0x00020000 /* Instr. Addr. Compare 1 Enable */ -#define DBCR_IA2 0x00010000 /* Instr. Addr. Compare 2 Enable */ -#define DBCR_D1R 0x00008000 /* Data Addr. Compare 1 Read Enable */ -#define DBCR_D1W 0x00004000 /* Data Addr. Compare 1 Write Enable */ -#define DBCR_D1S(x) (((x)&0x3) << 12) /* Data Adrr. Compare 1 Size */ +#define DBCR_IC 0x08000000 /* Instruction Completion Debug Evnt */ +#define DBCR_BT 0x04000000 /* Branch Taken Debug Event */ +#define DBCR_EDE 0x02000000 /* Exception Debug Event */ +#define DBCR_TDE 0x01000000 /* TRAP Debug Event */ +#define DBCR_FER 0x00F80000 /* First Events Remaining Mask */ +#define DBCR_FT 0x00040000 /* Freeze Timers on Debug Event */ +#define DBCR_IA1 0x00020000 /* Instr. Addr. Compare 1 Enable */ +#define DBCR_IA2 0x00010000 /* Instr. Addr. Compare 2 Enable */ +#define DBCR_D1R 0x00008000 /* Data Addr. Compare 1 Read Enable */ +#define DBCR_D1W 0x00004000 /* Data Addr. Compare 1 Write Enable */ +#define DBCR_D1S(x) (((x) & 0x3) << 12) /* Data Adrr. Compare 1 Size */ #define DAC_BYTE 0 #define DAC_HALF 1 #define DAC_WORD 2 #define DAC_QUAD 3 -#define DBCR_D2R 0x00000800 /* Data Addr. Compare 2 Read Enable */ -#define DBCR_D2W 0x00000400 /* Data Addr. Compare 2 Write Enable */ -#define DBCR_D2S(x) (((x)&0x3) << 8) /* Data Addr. Compare 2 Size */ -#define DBCR_SBT 0x00000040 /* Second Branch Taken Debug Event */ -#define DBCR_SED 0x00000020 /* Second Exception Debug Event */ -#define DBCR_STD 0x00000010 /* Second Trap Debug Event */ -#define DBCR_SIA 0x00000008 /* Second IAC Enable */ -#define DBCR_SDA 0x00000004 /* Second DAC Enable */ -#define DBCR_JOI 0x00000002 /* JTAG Serial Outbound Int. Enable */ -#define DBCR_JII 0x00000001 /* JTAG Serial Inbound Int. Enable */ +#define DBCR_D2R 0x00000800 /* Data Addr. Compare 2 Read Enable */ +#define DBCR_D2W 0x00000400 /* Data Addr. Compare 2 Write Enable */ +#define DBCR_D2S(x) (((x) & 0x3) << 8) /* Data Addr. Compare 2 Size */ +#define DBCR_SBT 0x00000040 /* Second Branch Taken Debug Event */ +#define DBCR_SED 0x00000020 /* Second Exception Debug Event */ +#define DBCR_STD 0x00000010 /* Second Trap Debug Event */ +#define DBCR_SIA 0x00000008 /* Second IAC Enable */ +#define DBCR_SDA 0x00000004 /* Second DAC Enable */ +#define DBCR_JOI 0x00000002 /* JTAG Serial Outbound Int. Enable */ +#define DBCR_JII 0x00000001 /* JTAG Serial Inbound Int. Enable */ #ifndef CONFIG_BOOKE #define SPRN_DBCR0 0x3F2 /* Debug Control Register 0 */ #else @@ -395,27 +395,27 @@ struct pt_regs #define TCR_WP(x) (((64 - x) & 0x3) << 30) | \ (((64 - x) & 0x3c) << 15) /* WDT Period 2^x clocks*/ #else -#define TCR_WP(x) (((x)&0x3) << 30) /* WDT Period */ -#define WP_2_17 0 /* 2^17 clocks */ -#define WP_2_21 1 /* 2^21 clocks */ -#define WP_2_25 2 /* 2^25 clocks */ -#define WP_2_29 3 /* 2^29 clocks */ -#endif /* CONFIG_E500 */ -#define TCR_WRC(x) (((x)&0x3) << 28) /* WDT Reset Control */ -#define WRC_NONE 0 /* No reset will occur */ -#define WRC_CORE 1 /* Core reset will occur */ -#define WRC_CHIP 2 /* Chip reset will occur */ -#define WRC_SYSTEM 3 /* System reset will occur */ -#define TCR_WIE 0x08000000 /* WDT Interrupt Enable */ -#define TCR_PIE 0x04000000 /* PIT Interrupt Enable */ -#define TCR_FP(x) (((x)&0x3) << 24) /* FIT Period */ -#define FP_2_9 0 /* 2^9 clocks */ -#define FP_2_13 1 /* 2^13 clocks */ -#define FP_2_17 2 /* 2^17 clocks */ -#define FP_2_21 3 /* 2^21 clocks */ -#define TCR_FIE 0x00800000 /* FIT Interrupt Enable */ -#define TCR_ARE 0x00400000 /* Auto Reload Enable */ -#define SPRN_THRM1 0x3FC /* Thermal Management Register 1 */ +#define TCR_WP(x) (((x) & 0x3) << 30) /* WDT Period */ +#define WP_2_17 0 /* 2^17 clocks */ +#define WP_2_21 1 /* 2^21 clocks */ +#define WP_2_25 2 /* 2^25 clocks */ +#define WP_2_29 3 /* 2^29 clocks */ +#endif /* CONFIG_E500 */ +#define TCR_WRC(x) (((x) & 0x3) << 28) /* WDT Reset Control */ +#define WRC_NONE 0 /* No reset will occur */ +#define WRC_CORE 1 /* Core reset will occur */ +#define WRC_CHIP 2 /* Chip reset will occur */ +#define WRC_SYSTEM 3 /* System reset will occur */ +#define TCR_WIE 0x08000000 /* WDT Interrupt Enable */ +#define TCR_PIE 0x04000000 /* PIT Interrupt Enable */ +#define TCR_FP(x) (((x) & 0x3) << 24) /* FIT Period */ +#define FP_2_9 0 /* 2^9 clocks */ +#define FP_2_13 1 /* 2^13 clocks */ +#define FP_2_17 2 /* 2^17 clocks */ +#define FP_2_21 3 /* 2^21 clocks */ +#define TCR_FIE 0x00800000 /* FIT Interrupt Enable */ +#define TCR_ARE 0x00400000 /* Auto Reload Enable */ +#define SPRN_THRM1 0x3FC /* Thermal Management Register 1 */ #define THRM1_TIN (1 << 0) #define THRM1_TIV (1 << 1) #define THRM1_THRES (0x7f << 2) @@ -429,26 +429,26 @@ struct pt_regs #ifndef CONFIG_BOOKE #define SPRN_TSR 0x3D8 /* Timer Status Register */ #else -#define SPRN_TSR 0x150 /* Book E Timer Status Register */ -#endif /* CONFIG_BOOKE */ -#define TSR_ENW 0x80000000 /* Enable Next Watchdog */ -#define TSR_WIS 0x40000000 /* WDT Interrupt Status */ -#define TSR_WRS(x) (((x)&0x3) << 28) /* WDT Reset Status */ -#define WRS_NONE 0 /* No WDT reset occurred */ -#define WRS_CORE 1 /* WDT forced core reset */ -#define WRS_CHIP 2 /* WDT forced chip reset */ -#define WRS_SYSTEM 3 /* WDT forced system reset */ -#define TSR_PIS 0x08000000 /* PIT Interrupt Status */ -#define TSR_FIS 0x04000000 /* FIT Interrupt Status */ -#define SPRN_UMMCR0 0x3A8 /* User Monitor Mode Control Register 0 */ -#define SPRN_UMMCR1 0x3AC /* User Monitor Mode Control Register 0 */ -#define SPRN_UPMC1 0x3A9 /* User Performance Counter Register 1 */ -#define SPRN_UPMC2 0x3AA /* User Performance Counter Register 2 */ -#define SPRN_UPMC3 0x3AD /* User Performance Counter Register 3 */ -#define SPRN_UPMC4 0x3AE /* User Performance Counter Register 4 */ -#define SPRN_USIA 0x3AB /* User Sampled Instruction Address Register */ -#define SPRN_XER 0x001 /* Fixed Point Exception Register */ -#define SPRN_ZPR 0x3B0 /* Zone Protection Register */ +#define SPRN_TSR 0x150 /* Book E Timer Status Register */ +#endif /* CONFIG_BOOKE */ +#define TSR_ENW 0x80000000 /* Enable Next Watchdog */ +#define TSR_WIS 0x40000000 /* WDT Interrupt Status */ +#define TSR_WRS(x) (((x) & 0x3) << 28) /* WDT Reset Status */ +#define WRS_NONE 0 /* No WDT reset occurred */ +#define WRS_CORE 1 /* WDT forced core reset */ +#define WRS_CHIP 2 /* WDT forced chip reset */ +#define WRS_SYSTEM 3 /* WDT forced system reset */ +#define TSR_PIS 0x08000000 /* PIT Interrupt Status */ +#define TSR_FIS 0x04000000 /* FIT Interrupt Status */ +#define SPRN_UMMCR0 0x3A8 /* User Monitor Mode Control Register 0 */ +#define SPRN_UMMCR1 0x3AC /* User Monitor Mode Control Register 0 */ +#define SPRN_UPMC1 0x3A9 /* User Performance Counter Register 1 */ +#define SPRN_UPMC2 0x3AA /* User Performance Counter Register 2 */ +#define SPRN_UPMC3 0x3AD /* User Performance Counter Register 3 */ +#define SPRN_UPMC4 0x3AE /* User Performance Counter Register 4 */ +#define SPRN_USIA 0x3AB /* User Sampled Instruction Address Register */ +#define SPRN_XER 0x001 /* Fixed Point Exception Register */ +#define SPRN_ZPR 0x3B0 /* Zone Protection Register */ /* Book E definitions */ #define SPRN_DECAR 0x036 /* Decrementer Auto Reload Register */ @@ -853,7 +853,7 @@ struct pt_regs #define IOCR_PTD 0x00000400 #define IOCR_ARE 0x00000080 #define IOCR_DRC 0x00000020 -#define IOCR_RDM(x) (((x)&0x3) << 3) +#define IOCR_RDM(x) (((x) & 0x3) << 3) #define IOCR_TCS 0x00000004 #define IOCR_SCS 0x00000002 #define IOCR_SPC 0x00000001 @@ -1252,7 +1252,7 @@ int fsl_qoriq_dsp_core_to_cluster(unsigned int core); #if defined(CONFIG_MPC83xx) #define CPU_TYPE_ENTRY(x) \ { \ -#x, SPR_##x \ + #x, SPR_##x \ } #endif #endif diff --git a/Kernel/HALKit/POWER/ppc-mmu.h b/Kernel/HALKit/POWER/ppc-mmu.h index 8546b0fb..8e4b3595 100644 --- a/Kernel/HALKit/POWER/ppc-mmu.h +++ b/Kernel/HALKit/POWER/ppc-mmu.h @@ -411,7 +411,7 @@ extern void print_bats(void); #define MAS0_TLBSEL(x) (((x) << 28) & MAS0_TLBSEL_MSK) #define MAS0_ESEL_MSK 0x0FFF0000 #define MAS0_ESEL(x) (((x) << 16) & MAS0_ESEL_MSK) -#define MAS0_NV(x) ((x)&0x00000FFF) +#define MAS0_NV(x) ((x) & 0x00000FFF) #define MAS1_VALID 0x80000000 #define MAS1_IPROT 0x40000000 @@ -468,9 +468,9 @@ extern void print_bats(void); (((ts) << 12) & MAS1_TS) | \ (MAS1_TSIZE(tsize))) #define FSL_BOOKE_MAS2(epn, wimge) \ - (((epn)&MAS3_RPN) | (wimge)) + (((epn) & MAS3_RPN) | (wimge)) #define FSL_BOOKE_MAS3(rpn, user, perms) \ - (((rpn)&MAS3_RPN) | (user) | (perms)) + (((rpn) & MAS3_RPN) | (user) | (perms)) #define FSL_BOOKE_MAS7(rpn) \ (((uint64_t)(rpn)) >> 32) @@ -638,10 +638,10 @@ extern int num_tlb_entries; /* Some handy macros */ -#define EPN(e) ((e)&0xfffffc00) +#define EPN(e) ((e) & 0xfffffc00) #define TLB0(epn, sz) ((EPN((epn)) | (sz) | TLB_VALID)) -#define TLB1(rpn, erpn) (((rpn)&0xfffffc00) | (erpn)) -#define TLB2(a) ((a)&0x00000fbf) +#define TLB1(rpn, erpn) (((rpn) & 0xfffffc00) | (erpn)) +#define TLB2(a) ((a) & 0x00000fbf) #define tlbtab_start \ mflr r1; \ diff --git a/Kernel/HALKit/RISCV/Hart.hxx b/Kernel/HALKit/RISCV/Hart.hxx index 92cc286e..56d4be92 100644 --- a/Kernel/HALKit/RISCV/Hart.hxx +++ b/Kernel/HALKit/RISCV/Hart.hxx @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies File: Hart.hxx Purpose: RISC-V hardware threads. |
