summaryrefslogtreecommitdiffhomepage
path: root/Kernel
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-06-20 11:00:20 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-06-20 11:00:20 +0200
commit120580707d93bf15de4affb3c3af489a6f1fcc0d (patch)
treef0da87e86b4fc30b32caaea800724fd31e31467c /Kernel
parentf958113a684df8f34c1677fcc41783054bd301cf (diff)
ARM64: Adding virtual memory support.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/Builtins/Flash/Flash.hxx2
-rw-r--r--Kernel/HALKit/AMD64/HalKernelMain.cxx2
-rw-r--r--Kernel/HALKit/AMD64/HalTimer.cxx0
-rw-r--r--Kernel/HALKit/AMD64/Processor.hpp4
-rw-r--r--Kernel/HALKit/ARM64/HalPageAlloc.hpp44
-rw-r--r--Kernel/HALKit/ARM64/HalTimer.cxx7
-rw-r--r--Kernel/HALKit/ARM64/Hart.hxx28
-rw-r--r--Kernel/HALKit/ARM64/Processor.hxx6
-rw-r--r--Kernel/HALKit/ARM64/Storage/Flash.cxx28
-rw-r--r--Kernel/HALKit/ARM64/Storage/HalFlash.cxx52
10 files changed, 96 insertions, 77 deletions
diff --git a/Kernel/Builtins/Flash/Flash.hxx b/Kernel/Builtins/Flash/Flash.hxx
index c894089a..d75539b6 100644
--- a/Kernel/Builtins/Flash/Flash.hxx
+++ b/Kernel/Builtins/Flash/Flash.hxx
@@ -9,9 +9,11 @@
#ifdef __FLASH_MEM__
/// @brief get sector count.
+/// @return drive sector count.
NewOS::SizeT drv_std_get_sector_count();
/// @brief get device size.
+/// @return drive size
NewOS::SizeT drv_std_get_drv_size();
#endif // ifdef __FLASH_MEM__
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index 855b769e..88add1d1 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -73,7 +73,7 @@ EXTERN_C void hal_init_platform(
kKernelVirtualSize = HandoverHeader->f_VirtualSize;
kKernelVirtualStart = reinterpret_cast<NewOS::VoidPtr>(
- reinterpret_cast<NewOS::UIntPtr>(HandoverHeader->f_VirtualStart) + kVirtualAddressStartOffset);
+ reinterpret_cast<NewOS::UIntPtr>(HandoverHeader->f_VirtualStart) + cHeapStartOffset);
kKernelPhysicalStart = HandoverHeader->f_PhysicalStart;
diff --git a/Kernel/HALKit/AMD64/HalTimer.cxx b/Kernel/HALKit/AMD64/HalTimer.cxx
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/Kernel/HALKit/AMD64/HalTimer.cxx
diff --git a/Kernel/HALKit/AMD64/Processor.hpp b/Kernel/HALKit/AMD64/Processor.hpp
index 7c0a4415..98a5aee6 100644
--- a/Kernel/HALKit/AMD64/Processor.hpp
+++ b/Kernel/HALKit/AMD64/Processor.hpp
@@ -32,7 +32,7 @@
#define kTrapGate (0xEF)
#define kTaskGate (0b10001100)
#define kGdtCodeSelector (0x08)
-#define kVirtualAddressStartOffset (0x10000000)
+#define cHeapStartOffset (0x10000000)
namespace NewOS
{
@@ -273,7 +273,7 @@ EXTERN_C void hal_load_gdt(NewOS::HAL::RegisterGDT ptr);
#define kKernelIdtSize 0x100
#define kKernelInterruptId 0x32
-inline NewOS::VoidPtr kKernelVirtualStart = (NewOS::VoidPtr)kVirtualAddressStartOffset;
+inline NewOS::VoidPtr kKernelVirtualStart = (NewOS::VoidPtr)cHeapStartOffset;
inline NewOS::UIntPtr kKernelVirtualSize = 0UL;
inline NewOS::VoidPtr kKernelPhysicalStart = nullptr;
diff --git a/Kernel/HALKit/ARM64/HalPageAlloc.hpp b/Kernel/HALKit/ARM64/HalPageAlloc.hpp
index 57e1e193..2959f0fc 100644
--- a/Kernel/HALKit/ARM64/HalPageAlloc.hpp
+++ b/Kernel/HALKit/ARM64/HalPageAlloc.hpp
@@ -8,7 +8,7 @@
/** ---------------------------------------------------
- * THIS FILE CONTAINS CODE FOR ARM64 PAGING.
+ * THIS FILE CONTAINS CODE FOR ARMV8 PAGING.
------------------------------------------------------- */
@@ -26,22 +26,34 @@
#define kPTESize (0x1000)
#endif // !kPTESize
-EXTERN_C void hal_flush_tlb();
+//! short format address range
+
+#define c16KBPage 0b000
+#define c8KBPage 0b001
+#define c4KBPage 0b010
+#define c2KBPage 0b011
+#define c1KBPage 0b100
+#define c512BPage 0b101
+#define c256BPage 0b110
+#define c128BPage 0b111
+
+/// Long format address range
+
+#define cPageMAll { 0b000, 0b000 }
+#define cPageMToMax(M) { M, 0b000 }
+#define cPageMaxToM(M) { 0b000, M }
+#define cPageMToN(M, N) { M, N }
namespace NewOS::HAL
{
- struct PACKED PageTable64 final
+ struct PACKED LongDescLevel3 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;
+ Boolean Present : 1;
+ Boolean Rw : 1;
+ UInt16 Lpat : 9;
+ UInt32 Address : 27;
+ UInt32 Sbzp : 12;
+ UInt32 UPat : 11;
};
namespace Detail
@@ -69,7 +81,7 @@ namespace NewOS::HAL
struct PageDirectory64 final
{
- PageTable64 ALIGN(kPTEAlign) Pte[kPTEMax];
+ LongDescLevel3 ALIGN(kPTEAlign) Pte[kPTEMax];
};
VoidPtr hal_alloc_page(Boolean rw, Boolean user, SizeT size);
@@ -77,6 +89,8 @@ namespace NewOS::HAL
namespace NewOS
{
- typedef HAL::PageTable64 PTE;
+ typedef HAL::LongDescLevel3 PTE;
typedef HAL::PageDirectory64 PDE;
} // namespace NewOS
+
+EXTERN_C void hal_flush_tlb();
diff --git a/Kernel/HALKit/ARM64/HalTimer.cxx b/Kernel/HALKit/ARM64/HalTimer.cxx
new file mode 100644
index 00000000..aa39adef
--- /dev/null
+++ b/Kernel/HALKit/ARM64/HalTimer.cxx
@@ -0,0 +1,7 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+#include <NewKit/Defines.hpp>
diff --git a/Kernel/HALKit/ARM64/Hart.hxx b/Kernel/HALKit/ARM64/Hart.hxx
deleted file mode 100644
index 5769b01e..00000000
--- a/Kernel/HALKit/ARM64/Hart.hxx
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -------------------------------------------
-
- Copyright Zeta Electronics Corporation
-
-------------------------------------------- */
-
-#pragma once
-
-#include <NewKit/Defines.hpp>
-
-/// @file HALKit\ARM64\Hart.hxx
-/// @brief ARM64 hardware thread concept.
-
-typedef NewOS::Int32 Arm64HartType;
-
-/// @brief Set PC to specific hart.
-/// @param hart the hart
-/// @param epc the pc.
-/// @return
-EXTERN_C NewOS::Void hal_set_pc_to_hart(Arm64HartType hart, NewOS::VoidPtr epc);
-
-/// @brief Hart IPI enum
-enum {
- cHartIpiTurnOn,
- cHartIpiTurnOff,
- cHartIpiStop,
- cHartIpiResume,
-};
diff --git a/Kernel/HALKit/ARM64/Processor.hxx b/Kernel/HALKit/ARM64/Processor.hxx
index 8b06794f..ae0fc86d 100644
--- a/Kernel/HALKit/ARM64/Processor.hxx
+++ b/Kernel/HALKit/ARM64/Processor.hxx
@@ -17,10 +17,10 @@
#define kPTESize 512 /* 64-bit PT */
-#define kCPUBackendName "ARM64"
+#define kCPUBackendName "ARMv8"
#ifdef __ZETA_MACHINE__
-#define kVirtualAddressStartOffset (0x80000000)
+#define cHeapStartOffset (0x10000000)
#else
#error !!! please provide that macro. !!!
#endif
@@ -47,7 +47,7 @@ namespace NewOS::HAL
typedef StackFrame* StackFramePtr;
}
-inline NewOS::VoidPtr kKernelVirtualStart = (NewOS::VoidPtr)kVirtualAddressStartOffset;
+inline NewOS::VoidPtr kKernelVirtualStart = (NewOS::VoidPtr)cHeapStartOffset;
inline NewOS::UIntPtr kKernelVirtualSize = 0UL;
inline NewOS::VoidPtr kKernelPhysicalStart = nullptr;
diff --git a/Kernel/HALKit/ARM64/Storage/Flash.cxx b/Kernel/HALKit/ARM64/Storage/Flash.cxx
deleted file mode 100644
index 666dfc0b..00000000
--- a/Kernel/HALKit/ARM64/Storage/Flash.cxx
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -------------------------------------------
-
- Copyright Zeta Electronics Corporation
-
-------------------------------------------- */
-
-#include <NewKit/Defines.hpp>
-#include <ArchKit/ArchKit.hpp>
-
-/// @file Flash.cxx
-/// @brief Flash memory builtin.
-
-#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__ (Bridge)
diff --git a/Kernel/HALKit/ARM64/Storage/HalFlash.cxx b/Kernel/HALKit/ARM64/Storage/HalFlash.cxx
new file mode 100644
index 00000000..7bc9c8c0
--- /dev/null
+++ b/Kernel/HALKit/ARM64/Storage/HalFlash.cxx
@@ -0,0 +1,52 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+#include <NewKit/Defines.hpp>
+#include <ArchKit/ArchKit.hpp>
+
+/// @file Flash.cxx
+/// @brief Flash memory builtin.
+
+#ifdef __FLASH_MEM__
+
+namespace NewOS
+{
+ /// /:\\BRIDGE\\FLSH\\1
+ constexpr auto cFlashBridgeMagic = "FLSH";
+ constexpr auto cFlashBridgeRevision = 1;
+
+ STATIC const Boolean kFlashEnabled = No;
+ STATIC SizeT kFlashSize = 0UL;
+ STATIC SizeT kFlashSectorSz = 0UL;
+
+ /// @brief Enable flash memory builtin.
+ STATIC Void drv_enable_builtin(Void);
+
+ /// @brief Disable flash memory builtin.
+ STATIC Void drv_disable_builtin(Void);
+
+ /// @brief get sector count.
+ /// @return drive sector count.
+ SizeT drv_std_get_sector_count(void)
+ {
+ return kFlashSectorSz;
+ }
+
+ /// @brief get device size.
+ /// @return drive size
+ SizeT drv_std_get_drv_size(void)
+ {
+ return kFlashSize;
+ }
+
+ /// @brief Enable flash memory builtin.
+ STATIC Void drv_enable_builtin(Void) {}
+
+ /// @brief Disable flash memory builtin.
+ STATIC Void drv_disable_builtin(Void) {}
+} // namespace NewOS
+
+#endif // if __FLASH_MEM__ (Bridge)