diff options
Diffstat (limited to 'dev/ZKA/HALKit')
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx | 6 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx | 17 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm | 23 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 39 |
4 files changed, 44 insertions, 41 deletions
diff --git a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx index 7a6e726a..ab160648 100644 --- a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx +++ b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx @@ -52,6 +52,12 @@ namespace Kernel kcout << "Size of pointer (TIB): " << number(TIB(ptr_bit_set[1])) << endl; kcout << "Address Of Header: " << hex_number((UIntPtr)ptr_bit_set) << endl; + if (rw) + mm_update_pte(base_ptr, eFlagsRw); + + if (user) + mm_update_pte(base_ptr, eFlagsUser); + return (VoidPtr)ptr_bit_set; } } diff --git a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx index 54b62b80..90ee3291 100644 --- a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx +++ b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx @@ -19,7 +19,7 @@ namespace Kernel::HAL auto a2 = HAL::In8(0xa2); HAL::Out8(0x20, 0x11); - + HAL::Out8(0xA0, 0x11); HAL::Out8(0x21, 32); @@ -48,20 +48,7 @@ namespace Kernel::HAL { volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**)idt.Base; - for (UInt16 idt_indx = 0; idt_indx < 12; ++idt_indx) - { - Detail::kInterruptVectorTable[idt_indx].Selector = kGdtKernelCodeSelector; - Detail::kInterruptVectorTable[idt_indx].Ist = 0; - Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kTrapGate; - Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr)ptr_ivt[idt_indx] & __INT16_MAX__); - Detail::kInterruptVectorTable[idt_indx].OffsetMid = (((UIntPtr)ptr_ivt[idt_indx] >> 16) & __INT16_MAX__); - Detail::kInterruptVectorTable[idt_indx].OffsetHigh = - (((UIntPtr)ptr_ivt[idt_indx] >> 32) & __INT32_MAX__); - - Detail::kInterruptVectorTable[idt_indx].Zero = 0x0; - } - - for (UInt16 idt_indx = 13; idt_indx < kKernelIdtSize; ++idt_indx) + for (UInt16 idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) { Detail::kInterruptVectorTable[idt_indx].Selector = kGdtKernelCodeSelector; Detail::kInterruptVectorTable[idt_indx].Ist = 0; diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm index 6abd28c9..49e02ee1 100644 --- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm @@ -155,7 +155,7 @@ IntNormal 49 [extern hal_kernel_call_enter] IntNormal 50 - + __ZKA_INT_51: cli @@ -216,19 +216,28 @@ section .text [global hal_load_gdt] hal_load_gdt: - lgdt [rcx] cli - push 8 - push hal_reload_segments - o64 retf -hal_reload_segments: - mov ax, 16 + + lgdt [rcx] + + mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax + + mov rax, 0x08 + push rax + push hal_reload_segments + + o64 retf + +extern hal_real_init + +hal_reload_segments: sti + jmp hal_real_init ret global hal_load_idt diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index c73eed5f..8d07e700 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -54,26 +54,15 @@ namespace Kernel::HAL } // namespace Kernel::HAL Kernel::Property cKernelVersion; -Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser}; +Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser}; EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; -Kernel::Void hal_real_init(Kernel::Void) noexcept; +EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept; EXTERN_C void hal_user_code_start(void); EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void); -/* GDT, mostly descriptors for user and kernel segments. */ -STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY ALIGN(0x1000) cGdt[6] = { - {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // Null entry - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xA0, .fBaseHigh = 0}, // Kernel code - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xA0, .fBaseHigh = 0}, // Kernel data - {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xA0, .fBaseHigh = 0}, // User code - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xA0, .fBaseHigh = 0}, // User data - // reserve them for later. -}; - EXTERN_C void hal_init_platform( Kernel::HEL::HandoverInformationHeader* HandoverHeader) { @@ -87,11 +76,6 @@ EXTERN_C void hal_init_platform( return; } - hal_real_init(); -} - -Kernel::Void hal_real_init(Kernel::Void) noexcept -{ // get page size. kKernelVirtualSize = kHandoverHeader->f_BitMapSize; @@ -103,6 +87,18 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>( reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_PhysicalStart)); + /* GDT, mostly descriptors for user and kernel segments. */ + STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY ALIGN(0x08) cGdt[6] = { + {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // Null entry + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xAF, .fBaseHigh = 0}, // Kernel code + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xAF, .fBaseHigh = 0}, // Kernel data + {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xAF, .fBaseHigh = 0}, // User code + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xAF, .fBaseHigh = 0}, // User data + // reserve them for later. + // + }; + // Load memory descriptors. Kernel::HAL::RegisterGDT gdtBase; @@ -114,10 +110,15 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept // Load IDT now. + Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); +} + +EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept +{ Kernel::HAL::Register64 idtBase; idtBase.Base = (Kernel::UIntPtr)kInterruptVectorTable; idtBase.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) * - (kKernelIdtSize - 1); + (kKernelIdtSize - 1); CONST Kernel::HAL::IDTLoader cIDT; cIDT.Load(idtBase); |
