summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dev/ZKA/ArchKit/ArchKit.hxx2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx17
-rw-r--r--dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm1
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx8
-rw-r--r--dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm2
-rw-r--r--dev/ZKA/HALKit/AMD64/Processor.hxx5
-rw-r--r--dev/ZKA/Sources/HardwareThreadScheduler.cxx2
7 files changed, 17 insertions, 20 deletions
diff --git a/dev/ZKA/ArchKit/ArchKit.hxx b/dev/ZKA/ArchKit/ArchKit.hxx
index c31ee48d..6e93359b 100644
--- a/dev/ZKA/ArchKit/ArchKit.hxx
+++ b/dev/ZKA/ArchKit/ArchKit.hxx
@@ -109,4 +109,4 @@ inline Kernel::Array<HAL_SYSCALL_RECORD,
EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_context();
/// @note The context gives out the return address in return register.
-EXTERN_C Kernel::Void mp_do_context_switch(Kernel::VoidPtr image, Kernel::UInt8* stack_ptr, Kernel::HAL::StackFramePtr stackPtr);
+EXTERN_C Kernel::Void mp_do_context_switch(Kernel::VoidPtr image, Kernel::UInt8* stack_ptr, Kernel::HAL::StackFramePtr frame_ptr);
diff --git a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
index 90ee3291..2ab1050b 100644
--- a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
@@ -48,23 +48,26 @@ namespace Kernel::HAL
{
volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**)idt.Base;
- for (UInt16 idt_indx = 0; 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].Selector = kGdtCodeSelector;
Detail::kInterruptVectorTable[idt_indx].Ist = 0;
Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kInterruptGate;
- 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].OffsetLow = ((UIntPtr)ptr_ivt[idt_indx] & 0xFFFF);
+ Detail::kInterruptVectorTable[idt_indx].OffsetMid = (((UIntPtr)ptr_ivt[idt_indx] >> 16) & 0xFFFF);
Detail::kInterruptVectorTable[idt_indx].OffsetHigh =
- (((UIntPtr)ptr_ivt[idt_indx] >> 32) & __INT32_MAX__);
+ (((UIntPtr)ptr_ivt[idt_indx] >> 32) & 0xFFFFFFFF);
Detail::kInterruptVectorTable[idt_indx].Zero = 0x0;
}
+ idt.Base = (UIntPtr)&Detail::kInterruptVectorTable;
+ idt.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) *
+ (kKernelIdtSize) - 1;
+
hal_load_idt(idt);
- HAL::Out8(0xA1, 0xFF);
- HAL::Out8(0x21, 0xFF);
+ Detail::hal_remap_intel_pic_ctrl();
}
void GDTLoader::Load(Ref<RegisterGDT>& gdt)
diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
index 49e02ee1..28f86b34 100644
--- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
@@ -244,6 +244,7 @@ global hal_load_idt
global hal_user_code_start
hal_load_idt:
+ cli
lidt [rcx]
sti
ret
diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
index fb76ad20..df5317e5 100644
--- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
@@ -57,10 +57,7 @@ Kernel::Property cKernelVersion;
Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser};
EXTERN_C Kernel::VoidPtr kInterruptVectorTable[];
-
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);
EXTERN_C void hal_init_platform(
@@ -87,7 +84,7 @@ EXTERN_C void hal_init_platform(
kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>(
reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_PhysicalStart));
- STATIC CONST auto cEntriesCount = 5;
+ STATIC CONST auto cEntriesCount = 6;
/* GDT, mostly descriptors for user and kernel segments. */
STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY ALIGN(0x08) cGdt[cEntriesCount] = {
@@ -96,7 +93,6 @@ EXTERN_C void hal_init_platform(
{.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xCF, .fBaseHigh = 0}, // Kernel data
{.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fFlags = 0xCF, .fBaseHigh = 0}, // User data
{.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xFA, .fFlags = 0xAF, .fBaseHigh = 0}, // User code
-
};
// Load memory descriptors.
@@ -117,8 +113,6 @@ 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);
CONST Kernel::HAL::IDTLoader cIDT;
cIDT.Load(idtBase);
diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
index 07ddbefe..2a6be79a 100644
--- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
+++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
@@ -57,7 +57,7 @@ mp_pre_switch:
mov rdx, [mp_system_call_handler]
shr rdx, 32
mov rcx, 0xc0000082
- wrsmr
+ wrmsr
ret
diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx
index 0636c291..8c05d37c 100644
--- a/dev/ZKA/HALKit/AMD64/Processor.hxx
+++ b/dev/ZKA/HALKit/AMD64/Processor.hxx
@@ -30,8 +30,7 @@ EXTERN_C
#define kInterruptGate (0x8E)
#define kTrapGate (0xEF)
#define kTaskGate (0b10001100)
-#define kGdtKernelCodeSelector (0x08)
-#define kGdtUserCodeSelector (0x23)
+#define kGdtCodeSelector (0x08)
namespace Kernel
{
@@ -289,7 +288,7 @@ EXTERN_C Kernel::Void hal_load_idt(Kernel::HAL::Register64 ptr);
EXTERN_C Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr);
/// @brief Maximum size of the IDT.
-#define kKernelIdtSize 0x100
+#define kKernelIdtSize (0x100)
#define kKernelInterruptId 0x32
inline Kernel::VoidPtr kKernelVirtualStart = nullptr;
diff --git a/dev/ZKA/Sources/HardwareThreadScheduler.cxx b/dev/ZKA/Sources/HardwareThreadScheduler.cxx
index 47c71192..cbe0cc46 100644
--- a/dev/ZKA/Sources/HardwareThreadScheduler.cxx
+++ b/dev/ZKA/Sources/HardwareThreadScheduler.cxx
@@ -107,7 +107,7 @@ namespace Kernel
}
else
{
- kcout << "Switching to task...\r";
+ kcout << "Switching to the Process's thread...\r";
mp_do_context_switch(image, stack_ptr, fStack);