summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA/HALKit
diff options
context:
space:
mode:
Diffstat (limited to 'dev/ZKA/HALKit')
-rw-r--r--dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx6
-rw-r--r--dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx17
-rw-r--r--dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm23
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx39
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);