diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-06-20 11:00:20 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-06-20 11:00:20 +0200 |
| commit | 120580707d93bf15de4affb3c3af489a6f1fcc0d (patch) | |
| tree | f0da87e86b4fc30b32caaea800724fd31e31467c /Kernel/HALKit | |
| parent | f958113a684df8f34c1677fcc41783054bd301cf (diff) | |
ARM64: Adding virtual memory support.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Kernel/HALKit')
| -rw-r--r-- | Kernel/HALKit/AMD64/HalKernelMain.cxx | 2 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalTimer.cxx | 0 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/Processor.hpp | 4 | ||||
| -rw-r--r-- | Kernel/HALKit/ARM64/HalPageAlloc.hpp | 44 | ||||
| -rw-r--r-- | Kernel/HALKit/ARM64/HalTimer.cxx | 7 | ||||
| -rw-r--r-- | Kernel/HALKit/ARM64/Hart.hxx | 28 | ||||
| -rw-r--r-- | Kernel/HALKit/ARM64/Processor.hxx | 6 | ||||
| -rw-r--r-- | Kernel/HALKit/ARM64/Storage/Flash.cxx | 28 | ||||
| -rw-r--r-- | Kernel/HALKit/ARM64/Storage/HalFlash.cxx | 52 |
9 files changed, 94 insertions, 77 deletions
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) |
