summaryrefslogtreecommitdiffhomepage
path: root/Kernel/HALKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-06-19 17:56:55 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-06-19 17:57:16 +0200
commit19d0857d84cbc0267a8b222368e143bdcdaaf9a7 (patch)
tree8d8a274003cbe6837a5f565e97a810d0774f0624 /Kernel/HALKit
parent720e24cea004356da037648b92fd7eb02f3c74a8 (diff)
ARM64: Got into the linking stage, writing missing drivers in HAL now.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Kernel/HALKit')
-rw-r--r--Kernel/HALKit/AMD64/HalPageAlloc.cpp103
-rw-r--r--Kernel/HALKit/AMD64/HalPageAlloc.hpp2
-rw-r--r--Kernel/HALKit/AMD64/Processor.hpp12
-rw-r--r--Kernel/HALKit/ARM64/HalPageAlloc.hpp82
-rw-r--r--Kernel/HALKit/ARM64/HalPageInternal.S5
-rw-r--r--Kernel/HALKit/ARM64/Hart.hxx4
-rw-r--r--Kernel/HALKit/ARM64/Processor.hxx55
-rw-r--r--Kernel/HALKit/ARM64/Storage/Flash.cxx27
-rw-r--r--Kernel/HALKit/POWER/Hart.hxx4
-rw-r--r--Kernel/HALKit/RISCV/Hart.hxx4
10 files changed, 183 insertions, 115 deletions
diff --git a/Kernel/HALKit/AMD64/HalPageAlloc.cpp b/Kernel/HALKit/AMD64/HalPageAlloc.cpp
deleted file mode 100644
index ac043cff..00000000
--- a/Kernel/HALKit/AMD64/HalPageAlloc.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -------------------------------------------
-
- Copyright Zeta Electronics Corporation
-
-------------------------------------------- */
-
-#include <ArchKit/ArchKit.hpp>
-#include <HALKit/AMD64/HalPageAlloc.hpp>
-#include <NewKit/Defines.hpp>
-#include <NewKit/KernelCheck.hpp>
-
-STATIC NewOS::Boolean kAllocationInProgress = false;
-
-namespace NewOS
-{
- namespace HAL
- {
- namespace Detail
- {
- struct VirtualMemoryHeader
- {
- UInt32 Magic;
- Boolean Present;
- Boolean ReadWrite;
- Boolean User;
- SizeT PageSize;
- };
-
- struct VirtualMemoryHeaderTraits
- {
- /// @brief Get next header.
- /// @param current
- /// @return
- VirtualMemoryHeader* Next(VirtualMemoryHeader* current)
- {
- return current + sizeof(PTE) + current->PageSize;
- }
-
- /// @brief Get previous header.
- /// @param current
- /// @return
- VirtualMemoryHeader* Prev(VirtualMemoryHeader* current)
- {
- return current - sizeof(PTE) - current->PageSize;
- }
- };
- } // namespace Detail
-
- /// @brief Allocates a new page of memory.
- /// @param sz the size of it.
- /// @param rw read/write flag.
- /// @param user user flag.
- /// @return the page table of it.
- STATIC auto hal_try_alloc_new_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr
- {
- if (kAllocationInProgress)
- return nullptr;
-
- kAllocationInProgress = true;
-
- constexpr auto cVMTMagic = 0xDEEFD00D;
-
- ///! fetch from the start.
- Detail::VirtualMemoryHeader* vmHeader = reinterpret_cast<Detail::VirtualMemoryHeader*>(kKernelVirtualStart);
- Detail::VirtualMemoryHeaderTraits traits;
-
- while (vmHeader->Present &&
- vmHeader->Magic != cVMTMagic)
- {
- vmHeader = traits.Next(vmHeader);
- }
-
- vmHeader->Magic = cVMTMagic;
- vmHeader->Present = true;
- vmHeader->ReadWrite = rw;
- vmHeader->User = user;
- vmHeader->PageSize = size;
-
- kAllocationInProgress = false;
-
- return reinterpret_cast<VoidPtr>(vmHeader);
- }
-
- /// @brief Allocate a new page to be used by the OS.
- /// @param rw read/write bit.
- /// @param user user bit.
- /// @return
- auto hal_alloc_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr
- {
- /// Wait for a ongoing allocation to complete.
- while (kAllocationInProgress)
- {
- ;
- }
-
- if (size == 0)
- ++size;
-
- /// allocate new page.
- return hal_try_alloc_new_page(rw, user, size);
- }
- } // namespace HAL
-} // namespace NewOS
diff --git a/Kernel/HALKit/AMD64/HalPageAlloc.hpp b/Kernel/HALKit/AMD64/HalPageAlloc.hpp
index 29947f2f..332c8ed4 100644
--- a/Kernel/HALKit/AMD64/HalPageAlloc.hpp
+++ b/Kernel/HALKit/AMD64/HalPageAlloc.hpp
@@ -45,7 +45,7 @@ namespace NewOS::HAL
bool Cache : 1;
bool Accessed : 1;
NewOS::Int32 Reserved : 6;
- NewOS::UIntPtr PhysicalAddress : 36;
+ NewOS::UInt64 PhysicalAddress : 36;
NewOS::Int32 Reserved1 : 15;
bool ExecDisable : 1;
};
diff --git a/Kernel/HALKit/AMD64/Processor.hpp b/Kernel/HALKit/AMD64/Processor.hpp
index c52fecdf..7c0a4415 100644
--- a/Kernel/HALKit/AMD64/Processor.hpp
+++ b/Kernel/HALKit/AMD64/Processor.hpp
@@ -54,7 +54,7 @@ namespace NewOS
namespace NewOS::HAL
{
-
+ /// @brief Virtual memory flags.
enum
{
eFlagsUser,
@@ -87,9 +87,11 @@ namespace NewOS::HAL
{
kcout << "PM is already present.\r";
- kcout << "PhysicalAddress: " << hex_number(pde->Pte[pml4_index].PhysicalAddress) << endl;
- kcout << "User: " << (pde->Pte[pml4_index].User ? "yes" : "no") << "\r";
- kcout << "RW: " << (pde->Pte[pml4_index].Rw ? "yes" : "no") << "\r";
+ 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";
return 1;
}
@@ -146,7 +148,7 @@ namespace NewOS::HAL
using RawRegister = UInt64;
using InterruptId = UShort; /* For each element in the IVT */
- using interruptTrap = UIntPtr(UIntPtr sp);
+ using InterruptTrapKind = UIntPtr(UIntPtr sp);
typedef UIntPtr Reg;
diff --git a/Kernel/HALKit/ARM64/HalPageAlloc.hpp b/Kernel/HALKit/ARM64/HalPageAlloc.hpp
new file mode 100644
index 00000000..57e1e193
--- /dev/null
+++ b/Kernel/HALKit/ARM64/HalPageAlloc.hpp
@@ -0,0 +1,82 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+#pragma once
+
+/** ---------------------------------------------------
+
+ * THIS FILE CONTAINS CODE FOR ARM64 PAGING.
+
+------------------------------------------------------- */
+
+#include <NewKit/Defines.hpp>
+
+#ifndef kPTEMax
+#define kPTEMax (0x200)
+#endif //! kPTEMax
+
+#ifndef kPTEAlign
+#define kPTEAlign (0x1000)
+#endif //! kPTEAlign
+
+#ifndef kPTESize
+#define kPTESize (0x1000)
+#endif // !kPTESize
+
+EXTERN_C void hal_flush_tlb();
+
+namespace NewOS::HAL
+{
+ struct PACKED PageTable64 final
+ {
+ bool Present : 1;
+ bool Rw : 1;
+ bool User : 1;
+ bool Wt : 1;
+ bool Cache : 1;
+ bool Accessed : 1;
+ NewOS::Int32 Reserved : 6;
+ NewOS::UInt64 PhysicalAddress : 36;
+ NewOS::Int32 Reserved1 : 15;
+ bool ExecDisable : 1;
+ };
+
+ namespace Detail
+ {
+ enum class ControlRegisterBits
+ {
+ ProtectedModeEnable = 0,
+ MonitorCoProcessor = 1,
+ Emulation = 2,
+ TaskSwitched = 3,
+ ExtensionType = 4,
+ NumericError = 5,
+ WriteProtect = 16,
+ AlignementMask = 18,
+ NotWriteThrough = 29,
+ CacheDisable = 30,
+ PageEnable = 31,
+ };
+
+ inline UInt8 control_register_cast(ControlRegisterBits reg)
+ {
+ return static_cast<UInt8>(reg);
+ }
+ } // namespace Detail
+
+ struct PageDirectory64 final
+ {
+ PageTable64 ALIGN(kPTEAlign) Pte[kPTEMax];
+ };
+
+ VoidPtr hal_alloc_page(Boolean rw, Boolean user, SizeT size);
+} // namespace NewOS::HAL
+
+namespace NewOS
+{
+ typedef HAL::PageTable64 PTE;
+ typedef HAL::PageDirectory64 PDE;
+} // namespace NewOS
diff --git a/Kernel/HALKit/ARM64/HalPageInternal.S b/Kernel/HALKit/ARM64/HalPageInternal.S
new file mode 100644
index 00000000..8fcf40ff
--- /dev/null
+++ b/Kernel/HALKit/ARM64/HalPageInternal.S
@@ -0,0 +1,5 @@
+.text
+
+hal_flush_tlb:
+ tlbi
+ ret
diff --git a/Kernel/HALKit/ARM64/Hart.hxx b/Kernel/HALKit/ARM64/Hart.hxx
index 1b16a072..5769b01e 100644
--- a/Kernel/HALKit/ARM64/Hart.hxx
+++ b/Kernel/HALKit/ARM64/Hart.hxx
@@ -16,8 +16,8 @@ typedef NewOS::Int32 Arm64HartType;
/// @brief Set PC to specific hart.
/// @param hart the hart
/// @param epc the pc.
-/// @return
-EXTERN_C NewOS::Void hal_switch_to_hart(Arm64HartType hart, NewOS::VoidPtr epc);
+/// @return
+EXTERN_C NewOS::Void hal_set_pc_to_hart(Arm64HartType hart, NewOS::VoidPtr epc);
/// @brief Hart IPI enum
enum {
diff --git a/Kernel/HALKit/ARM64/Processor.hxx b/Kernel/HALKit/ARM64/Processor.hxx
new file mode 100644
index 00000000..8b06794f
--- /dev/null
+++ b/Kernel/HALKit/ARM64/Processor.hxx
@@ -0,0 +1,55 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+#pragma once
+
+#include <NewKit/Array.hpp>
+#include <NewKit/Defines.hpp>
+#include <NewKit/Utils.hpp>
+#include <FirmwareKit/Handover.hxx>
+
+#ifdef kCPUBackendName
+#undef kCPUBackendName
+#endif // ifdef kCPUBackendName
+
+#define kPTESize 512 /* 64-bit PT */
+
+#define kCPUBackendName "ARM64"
+
+#ifdef __ZETA_MACHINE__
+#define kVirtualAddressStartOffset (0x80000000)
+#else
+#error !!! please provide that macro. !!!
+#endif
+
+namespace NewOS::HAL
+{
+ struct PACKED Register64 final
+ {
+ UShort Limit;
+ UIntPtr Base;
+ };
+
+ typedef UIntPtr Reg;
+ typedef Register64 Register;
+
+ struct PACKED StackFrame final
+ {
+ Reg IntNum, Exception;
+ Reg Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax;
+ Reg R8, R9, R10, R11, R12, R13, R14, R15;
+ Reg Gs, Fs;
+ };
+
+ typedef StackFrame* StackFramePtr;
+}
+
+inline NewOS::VoidPtr kKernelVirtualStart = (NewOS::VoidPtr)kVirtualAddressStartOffset;
+inline NewOS::UIntPtr kKernelVirtualSize = 0UL;
+
+inline NewOS::VoidPtr kKernelPhysicalStart = nullptr;
+
+#include <HALKit/ARM64/HalPageAlloc.hpp>
diff --git a/Kernel/HALKit/ARM64/Storage/Flash.cxx b/Kernel/HALKit/ARM64/Storage/Flash.cxx
new file mode 100644
index 00000000..8afd0f58
--- /dev/null
+++ b/Kernel/HALKit/ARM64/Storage/Flash.cxx
@@ -0,0 +1,27 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+#include <NewKit/Defines.hpp>
+#include <ArchKit/ArchKit.hpp>
+
+/// @brief MBCI flash drive.
+
+#ifdef __FLASH_MEM__
+
+namespace NewOS
+{
+ SizeT drv_std_get_sector_count(void)
+ {
+ return 0;
+ }
+
+ SizeT drv_std_get_drv_size(void)
+ {
+ return 0;
+ }
+} // namespace NewOS
+
+#endif // if __FLASH_MEM__ (MBCI)
diff --git a/Kernel/HALKit/POWER/Hart.hxx b/Kernel/HALKit/POWER/Hart.hxx
index 10066048..ab74be4a 100644
--- a/Kernel/HALKit/POWER/Hart.hxx
+++ b/Kernel/HALKit/POWER/Hart.hxx
@@ -30,5 +30,5 @@ typedef struct HalHardwareThread
/// @brief Set PC to specific hart.
/// @param hart the hart
/// @param epc the pc.
-/// @return
-EXTERN_C NewOS::Void hal_switch_to_hart(HalHardwareThread* hart, NewOS::VoidPtr epc); \ No newline at end of file
+/// @return
+EXTERN_C NewOS::Void hal_set_pc_to_hart(HalHardwareThread* hart, NewOS::VoidPtr epc);
diff --git a/Kernel/HALKit/RISCV/Hart.hxx b/Kernel/HALKit/RISCV/Hart.hxx
index ba56b7c9..38160322 100644
--- a/Kernel/HALKit/RISCV/Hart.hxx
+++ b/Kernel/HALKit/RISCV/Hart.hxx
@@ -20,5 +20,5 @@ typedef NewOS::Int32 Rv64HartType;
/// @brief Set PC to specific hart.
/// @param hart the hart
/// @param epc the pc.
-/// @return
-EXTERN_C NewOS::Void hal_switch_to_hart(Rv64HartType hart, NewOS::VoidPtr epc); \ No newline at end of file
+/// @return
+EXTERN_C NewOS::Void hal_set_pc_to_hart(Rv64HartType hart, NewOS::VoidPtr epc);