summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA/HALKit
diff options
context:
space:
mode:
authorAmlal <amlal@el-mahrouss-logic.com>2024-09-10 10:33:39 +0200
committerAmlal <amlal@el-mahrouss-logic.com>2024-09-10 10:34:53 +0200
commit5aef44da0ce752e7ac6bd9c95489942b1a0319ae (patch)
treef3c6f613048ab091def7afc726f0227f552df519 /dev/ZKA/HALKit
parentb11bf31c59d447e62e6ba9b3d8455f9b2828703f (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.cxx25
-rw-r--r--dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx7
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx16
-rw-r--r--dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalProcessor.cxx12
-rw-r--r--dev/ZKA/HALKit/AMD64/Processor.hxx9
-rw-r--r--dev/ZKA/HALKit/ARM64/HalKernelMain.cxx6
-rw-r--r--dev/ZKA/HALKit/ARM64/Processor.hxx2
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;