diff options
| author | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-10 10:33:39 +0200 |
|---|---|---|
| committer | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-10 10:34:53 +0200 |
| commit | 5aef44da0ce752e7ac6bd9c95489942b1a0319ae (patch) | |
| tree | f3c6f613048ab091def7afc726f0227f552df519 /dev/ZKA/HALKit | |
| parent | b11bf31c59d447e62e6ba9b3d8455f9b2828703f (diff) | |
Fix: See below.
- Fixing PML4 mapping and getting it to work.
- Don't update cr4, instead do lidt to triple fault.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev/ZKA/HALKit')
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalACPIFactoryInterface.cxx | 25 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx | 7 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 16 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx | 2 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalProcessor.cxx | 12 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/Processor.hxx | 9 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/ARM64/HalKernelMain.cxx | 6 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/ARM64/Processor.hxx | 2 |
8 files changed, 48 insertions, 31 deletions
diff --git a/dev/ZKA/HALKit/AMD64/HalACPIFactoryInterface.cxx b/dev/ZKA/HALKit/AMD64/HalACPIFactoryInterface.cxx index 37b1375f..1cb8ce07 100644 --- a/dev/ZKA/HALKit/AMD64/HalACPIFactoryInterface.cxx +++ b/dev/ZKA/HALKit/AMD64/HalACPIFactoryInterface.cxx @@ -102,11 +102,26 @@ namespace Kernel Void ACPIFactoryInterface::Reboot() { failed_to_reboot: - // in case no acpi mode, or it's not available. - while (Yes) - { - asm volatile("cli; hlt"); - } + asm volatile(".intel_syntax noprefix; " + "rt_reset_hardware:; " + "cli; " + "wait_gate1: ; " + "in al,0x64 ; " + "and al,2 ; " + "jnz wait_gate1 ; " + "mov al,0x0D1 ; " + "out 0x64,al ; " + "wait_gate2: ; " + "in al,0x64 ; " + "and al,2 ; " + "jnz wait_gate2 ; " + "mov al,0x0FE ; " + "out 0x60,al ; " + "xor rax,rax ; " + "lidt [rax] ; " + "reset_wait: ; " + "jmp reset_wait ; " + ".att_syntax; "); } /// @brief Finds a descriptor table inside ACPI XSDT. diff --git a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx index 3d9cc90f..7cb891b6 100644 --- a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx +++ b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx @@ -54,10 +54,13 @@ namespace Kernel kcout << "Address Of BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl; if (rw) - mm_map_page(base_ptr, eFlagsRw | eFlagsPresent); + mm_map_page(base_ptr, eFlagsRw); + + if (user && rw) + mm_map_page(base_ptr, eFlagsUser | eFlagsRw); if (user) - mm_map_page(base_ptr, eFlagsUser | eFlagsPresent); + mm_map_page(base_ptr, eFlagsUser); return (VoidPtr)ptr_bit_set; } diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index 7f77824e..bc2a94ce 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -64,11 +64,10 @@ EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept; EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void); +/// @brief Kernel init procedure. EXTERN_C void hal_init_platform( Kernel::HEL::HandoverInformationHeader* HandoverHeader) { - /* Setup globals. */ - kHandoverHeader = HandoverHeader; if (kHandoverHeader->f_Magic != kHandoverMagic && @@ -78,15 +77,15 @@ EXTERN_C void hal_init_platform( } // get page size. - kKernelVirtualSize = kHandoverHeader->f_BitMapSize; + kKernelBitMpSize = kHandoverHeader->f_BitMapSize; // get virtual address start (for the heap) kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>( reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart)); // get physical address start. - kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>( - reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_PhysicalStart)); + kKernelBitMpStart = reinterpret_cast<Kernel::VoidPtr>( + reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_PageStart)); STATIC CONST auto cEntriesCount = 6; @@ -126,14 +125,11 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept kcout << "Creating filesystem and such.\r"; - auto fs = Kernel::mm_new_class<Kernel::NewFilesystemMgr>(); + auto fs = Kernel::mm_new_class<Kernel::NeFileSystemMgr>(); MUST_PASS(fs); - Kernel::HAL::mm_map_page((Kernel::VoidPtr)mp_user_switch_proc, Kernel::HAL::eFlagsUser | Kernel::HAL::eFlagsRw | Kernel::HAL::eFlagsPresent); - Kernel::HAL::mm_map_page((Kernel::VoidPtr)mp_user_switch_proc_stack_end, Kernel::HAL::eFlagsUser | Kernel::HAL::eFlagsRw | Kernel::HAL::eFlagsPresent); - - Kernel::NewFilesystemMgr::Mount(fs); + Kernel::NeFileSystemMgr::Mount(fs); const auto cPassword = "ZKA_KERNEL_AUTHORITY"; diff --git a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx b/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx index c5bede49..ecf739a3 100644 --- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx +++ b/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx @@ -53,7 +53,7 @@ namespace Kernel::HAL UInt8 PageSize : 1; UInt8 Global : 1; UInt8 Available : 3; - UInt64 PhysicalAddress : 39; + UInt32 PhysicalAddress : 20; UInt8 Reserved : 6; UInt8 ProtectionKey : 1; UInt8 ExecDisable : 1; diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx index e2ef1902..0d20d0b7 100644 --- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx +++ b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx @@ -116,14 +116,14 @@ namespace Kernel::HAL volatile UIntPtr* pt_entry = (volatile UIntPtr*)(pd_entry[pt_index + cIndexAlign]); - if (!(*pt_entry & eFlagsPresent)) + if (!(pt_entry[offset] & eFlagsPresent)) { - PTE* frame = (PTE*)pt_entry; + PTE* frame = (PTE*)pt_entry[offset]; MM::pg_delete((VoidPtr)frame->PhysicalAddress); auto pt_addr = MM::pg_allocate(); - *pt_entry = (UIntPtr)pt_addr | eFlagsPresent | flags; + pt_entry[offset] = (UIntPtr)pt_addr | eFlagsPresent | flags; kcout << (frame->Present ? "Page Present." : "Page Not Present.") << endl; kcout << (frame->Rw ? "Page RW." : "Page Not RW.") << endl; @@ -133,9 +133,9 @@ namespace Kernel::HAL } else { - PTE* frame = (PTE*)pt_entry; + PTE* frame = (PTE*)pt_entry[offset]; - *pt_entry = (UIntPtr)(frame->PhysicalAddress / cPageSz) | flags; + pt_entry[offset] = (UIntPtr)(frame->PhysicalAddress / cPageSz) | flags; kcout << (frame->Present ? "Page Present." : "Page Not Present.") << endl; kcout << (frame->Rw ? "Page RW." : "Page Not RW.") << endl; @@ -144,8 +144,6 @@ namespace Kernel::HAL kcout << "Physical Address: " << number(frame->PhysicalAddress) << endl; } - hal_invl_tlb(p_virt_addr); - rt_sti(); return 0; } diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx index 8463550c..7da1adea 100644 --- a/dev/ZKA/HALKit/AMD64/Processor.hxx +++ b/dev/ZKA/HALKit/AMD64/Processor.hxx @@ -27,6 +27,11 @@ EXTERN_C #define IsActiveLow(FLG) (FLG & 2) #define IsLevelTriggered(FLG) (FLG & 8) +#define cPageSz kPageSize // 4KB pages +#define cTotalPgMem mib_cast(16) // 16MB total memory +#define cTotalPages (cTotalPgMem / cPageSz) // Total number of pages +#define cBmpPgSz (cTotalPages / 8) // 1 bit per page in the bitmap + #define kInterruptGate (0x8E) #define kTrapGate (0xEF) #define kTaskGate (0b10001100) @@ -294,6 +299,6 @@ EXTERN_C Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr); #define kKernelInterruptId 0x32 inline Kernel::VoidPtr kKernelVirtualStart = nullptr; -inline Kernel::UIntPtr kKernelVirtualSize = 0UL; +inline Kernel::UIntPtr kKernelBitMpSize = 0UL; -inline Kernel::VoidPtr kKernelPhysicalStart = nullptr; +inline Kernel::VoidPtr kKernelBitMpStart = nullptr; diff --git a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx index d6bed3ba..c617c45d 100644 --- a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx @@ -77,7 +77,7 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept kAllocationInProgress = false; // get page size. - kKernelVirtualSize = kHandoverHeader->f_BitMapSize; + kKernelBitMpSize = kHandoverHeader->f_BitMapSize; // get virtual address start (for the heap) kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>( @@ -94,12 +94,12 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept kcout << "Creating filesystem and such.\r"; - auto fs = new Kernel::NewFilesystemMgr(); + auto fs = new Kernel::NeFileSystemMgr(); MUST_PASS(fs); MUST_PASS(fs->GetParser()); - Kernel::NewFilesystemMgr::Mount(fs); + Kernel::NeFileSystemMgr::Mount(fs); const auto cPassword = "ZKA_KERNEL_AUTHORITY"; diff --git a/dev/ZKA/HALKit/ARM64/Processor.hxx b/dev/ZKA/HALKit/ARM64/Processor.hxx index ab864577..dfba0293 100644 --- a/dev/ZKA/HALKit/ARM64/Processor.hxx +++ b/dev/ZKA/HALKit/ARM64/Processor.hxx @@ -43,7 +43,7 @@ namespace Kernel::HAL } // namespace Kernel::HAL inline Kernel::VoidPtr kKernelVirtualStart = nullptr; -inline Kernel::UIntPtr kKernelVirtualSize = 0UL; +inline Kernel::UIntPtr kKernelBitMpSize = 0UL; inline Kernel::VoidPtr kKernelPhysicalStart = nullptr; |
