summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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
-rw-r--r--dev/ZKA/Sources/ExeMain.cxx8
-rw-r--r--dev/ZKA/Sources/HardwareThreadScheduler.cxx30
-rw-r--r--dev/ZKA/Sources/UserProcessScheduler.cxx7
7 files changed, 58 insertions, 72 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);
diff --git a/dev/ZKA/Sources/ExeMain.cxx b/dev/ZKA/Sources/ExeMain.cxx
index d8d1ea6e..036c5725 100644
--- a/dev/ZKA/Sources/ExeMain.cxx
+++ b/dev/ZKA/Sources/ExeMain.cxx
@@ -87,7 +87,7 @@ namespace Kernel::Detail
}
catalogDir = fNeFS->GetParser()->CreateCatalog(cDirStr[dirIndx], 0,
- kNeFSCatalogKindDir);
+ kNeFSCatalogKindDir);
CG::CGDrawStringToWnd(cKernelWnd, "Directory has been created: ", 10 + (10 * (dirIndx + 1)), 10, RGB(0, 0, 0));
CG::CGDrawStringToWnd(cKernelWnd, catalogDir->Name, 10 + (10 * (dirIndx + 1)), 10 + (FONT_SIZE_X * rt_string_len("Directory has been created: ")), RGB(0, 0, 0));
@@ -114,12 +114,14 @@ EXTERN_C ATTRIBUTE(naked) Kernel::Void HangCPU(Kernel::Void)
{
while (Yes)
{
+ Kernel::Char* p = nullptr;
+ *p = 4;
}
}
namespace Kernel
{
- EXTERN UserProcessScheduler* cProcessScheduler;
+ EXTERN UserProcessScheduler* cProcessScheduler;
}
/// @brief Application entrypoint.
@@ -127,7 +129,7 @@ namespace Kernel
/// @return Void
EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void)
{
- Kernel::cProcessScheduler = nullptr;
+ Kernel::cProcessScheduler = nullptr;
CG::CGDrawBackground();
diff --git a/dev/ZKA/Sources/HardwareThreadScheduler.cxx b/dev/ZKA/Sources/HardwareThreadScheduler.cxx
index c5d04bbc..134cbb0f 100644
--- a/dev/ZKA/Sources/HardwareThreadScheduler.cxx
+++ b/dev/ZKA/Sources/HardwareThreadScheduler.cxx
@@ -92,21 +92,23 @@ namespace Kernel
!stack_ptr)
return false;
- if (this->IsBusy())
- return false;
-
fStack = frame;
if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
{
+ if (this->IsBusy())
+ return false;
+
this->Busy(true);
Bool ret = mp_register_process(fStack);
- this->Busy(true);
+ this->Busy(false);
return ret;
}
else
{
+ kcout << "Switching...\r";
+
mp_do_context_switch_pre();
mp_do_context_switch(image, stack_ptr, fStack);
@@ -120,16 +122,10 @@ namespace Kernel
return fWakeup;
}
- ///! @brief Internal Hardware Thread list.
- STATIC HardwareThread cThreadList[cMaxHWThreads];
-
///! @brief Constructor and destructors.
///! @brief Default constructor.
- HardwareThreadScheduler::HardwareThreadScheduler()
- {
- kcout << "Initializing class done!" << endl;
- }
+ HardwareThreadScheduler::HardwareThreadScheduler() = default;
///! @brief Default destructor.
HardwareThreadScheduler::~HardwareThreadScheduler() = default;
@@ -163,15 +159,7 @@ namespace Kernel
}
else if (idx >= cMaxHWThreads)
{
- static HardwareThread* fakeThread = new HardwareThread();
-
- if (!fakeThread)
- {
- fakeThread = new HardwareThread();
- }
-
- fakeThread->fKind = kInvalidHart;
-
+ static HardwareThread* fakeThread = nullptr;
return {fakeThread};
}
@@ -200,6 +188,6 @@ namespace Kernel
/// @return the number of cores.
SizeT HardwareThreadScheduler::Count() noexcept
{
- return fThreadList.Count();
+ return fThreadList.Capacity();
}
} // namespace Kernel
diff --git a/dev/ZKA/Sources/UserProcessScheduler.cxx b/dev/ZKA/Sources/UserProcessScheduler.cxx
index c68104b9..2501afc2 100644
--- a/dev/ZKA/Sources/UserProcessScheduler.cxx
+++ b/dev/ZKA/Sources/UserProcessScheduler.cxx
@@ -12,7 +12,6 @@
/// @brief User Process scheduler.
/***********************************************************************************/
-#include "HALKit/AMD64/Processor.hxx"
#include <KernelKit/UserProcessScheduler.hxx>
#include <KernelKit/IPEFDLLObject.hxx>
#include <KernelKit/HardwareThreadScheduler.hxx>
@@ -424,17 +423,11 @@ namespace Kernel
if (!stack || !frame_ptr || !image_ptr || new_pid < 0)
return No;
- while (Yes)
- ;
-
for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Count(); ++index)
{
if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kInvalidHart)
continue;
- if (HardwareThreadScheduler::The()[index].Leak()->IsBusy())
- continue;
-
if (HardwareThreadScheduler::The()[index].Leak()->Kind() !=
ThreadKind::kHartBoot &&
HardwareThreadScheduler::The()[index].Leak()->Kind() !=