summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-09-04 12:56:23 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-09-04 12:56:23 +0200
commita0a90c80e5dd17df8f609aebc253b4bf9147f90f (patch)
tree459f98ea125db490e887bd85b38fd9165a9491b4 /dev/ZKA
parentcc9ce57cac59bd443e2319e3b8f427172b93f7da (diff)
Created a new branch for the overhaul project.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKA')
-rw-r--r--dev/ZKA/FirmwareKit/Handover.hxx3
-rw-r--r--dev/ZKA/HALKit/AMD64/HalBitMapMgr.cxx99
-rw-r--r--dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx9
-rw-r--r--dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx4
-rw-r--r--dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx4
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx9
-rw-r--r--dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm9
-rw-r--r--dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx149
-rw-r--r--dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx4
-rw-r--r--dev/ZKA/HALKit/AMD64/HalProcessor.cxx31
-rw-r--r--dev/ZKA/HALKit/AMD64/Processor.hxx12
-rw-r--r--dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx2
-rw-r--r--dev/ZKA/HALKit/ARM64/HalKernelMain.cxx4
-rw-r--r--dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx2
-rw-r--r--dev/ZKA/HALKit/ARM64/Processor.hxx1
-rw-r--r--dev/ZKA/HALKit/POWER/HalHardware.cxx2
-rw-r--r--dev/ZKA/KernelKit/Heap.hxx8
-rw-r--r--dev/ZKA/NewKit/KernelCheck.hxx3
-rw-r--r--dev/ZKA/NewKit/Macros.hxx16
-rw-r--r--dev/ZKA/NewKit/PageAllocator.hxx1
-rw-r--r--dev/ZKA/NewKit/PageManager.hxx4
-rw-r--r--dev/ZKA/NewKit/Ref.hxx2
-rw-r--r--dev/ZKA/Sources/DLLMain.cxx16
-rw-r--r--dev/ZKA/Sources/FS/NewFS.cxx4
-rw-r--r--dev/ZKA/Sources/Framebuffer.cxx2
-rw-r--r--dev/ZKA/Sources/Heap.cxx43
-rw-r--r--dev/ZKA/Sources/KernelCheck.cxx13
-rw-r--r--dev/ZKA/Sources/MP.cxx4
-rw-r--r--dev/ZKA/Sources/NewFS+FileManager.cxx1
-rw-r--r--dev/ZKA/Sources/PageAllocator.cxx13
-rw-r--r--dev/ZKA/Sources/PageManager.cxx30
-rw-r--r--dev/ZKA/Sources/ThreadLocalStorage.cxx2
-rw-r--r--dev/ZKA/Sources/User.cxx1
-rw-r--r--dev/ZKA/Sources/UserProcessScheduler.cxx29
-rw-r--r--dev/ZKA/amd64-efi.make4
35 files changed, 223 insertions, 317 deletions
diff --git a/dev/ZKA/FirmwareKit/Handover.hxx b/dev/ZKA/FirmwareKit/Handover.hxx
index 46fca139..80d68afa 100644
--- a/dev/ZKA/FirmwareKit/Handover.hxx
+++ b/dev/ZKA/FirmwareKit/Handover.hxx
@@ -62,10 +62,9 @@ namespace Kernel::HEL
UInt64 f_Magic;
UInt64 f_Version;
- VoidPtr f_VirtualStart;
+ VoidPtr f_BitMapStart;
SizeT f_VirtualSize;
VoidPtr f_PhysicalStart;
- VoidPtr f_HeapStart;
VoidPtr f_KernelImage;
VoidPtr f_StartupChime;
diff --git a/dev/ZKA/HALKit/AMD64/HalBitMapMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBitMapMgr.cxx
new file mode 100644
index 00000000..677b1219
--- /dev/null
+++ b/dev/ZKA/HALKit/AMD64/HalBitMapMgr.cxx
@@ -0,0 +1,99 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+------------------------------------------- */
+
+#include <ArchKit/ArchKit.hxx>
+
+#define cVMHMagic ((Kernel::UIntPtr)0x10210)
+
+#ifdef __ZKA_AMD64__
+#include <HALKit/AMD64/HalPageAlloc.hxx>
+#elif defined(__ZKA_ARM64__)
+#include <HALKit/ARM64/HalPageAlloc.hxx>
+#endif
+
+#include <NewKit/Defines.hxx>
+#include <NewKit/KernelCheck.hxx>
+
+namespace Kernel
+{
+ namespace HAL
+ {
+ namespace Detail
+ {
+ struct AllocatorTraits final
+ {
+ /// @brief Iterate over availables pages for a free one.
+ /// @return The new address which was found.
+ VoidPtr FindBitMap(VoidPtr base_ptr, SizeT size, Bool rw, Bool user) noexcept
+ {
+ while (base_ptr && size)
+ {
+ UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(base_ptr);
+
+ if (ptr_bit_set[0] != cVMHMagic)
+ {
+ ptr_bit_set[0] = cVMHMagic;
+ ptr_bit_set[1] = size;
+
+ kcout << "BBP: STATUS\r";
+ kcout << "BBP: MAG: " << hex_number(ptr_bit_set[0]) << endl;
+ kcout << "BBP: ADDRESS: " << hex_number((UIntPtr)ptr_bit_set) << endl;
+ kcout << "BBP: SIZE: " << hex_number(ptr_bit_set[1]) << endl;
+
+ if (rw)
+ mm_update_pte(base_ptr, eFlagsRw);
+
+ if (user)
+ mm_update_pte(base_ptr, eFlagsUser);
+
+ return (VoidPtr)(ptr_bit_set + 2);
+ }
+
+ base_ptr = reinterpret_cast<VoidPtr>(reinterpret_cast<UIntPtr>(base_ptr) + size);
+ }
+
+ return nullptr;
+ }
+ };
+ } // namespace Detail
+
+ /// @brief Allocate a new page to be used by the OS.
+ /// @param rw read/write bit.
+ /// @param user user bit.
+ /// @return
+ auto mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size) -> VoidPtr
+ {
+ VoidPtr ptr_new = nullptr;
+ Detail::AllocatorTraits traits;
+
+ ptr_new = traits.FindBitMap(kKernelVirtualStart, size, rw, user);
+
+ return ptr_new;
+ }
+
+ auto mm_free_bitmap(VoidPtr page_ptr) -> Bool
+ {
+ if (!page_ptr)
+ return false;
+
+ UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(page_ptr) - 2;
+
+ if (!ptr_bit_set[0] ||
+ ptr_bit_set[0] != cVMHMagic)
+ return false;
+
+ kcout << "BBP: FREE STATUS\r";
+ kcout << "BBP: MAG: " << hex_number(ptr_bit_set[0]) << endl;
+ kcout << "BBP: ADDRESSS: " << hex_number((UIntPtr)ptr_bit_set) << endl;
+ kcout << "BBP: SIZE: " << hex_number(ptr_bit_set[1]) << endl;
+
+ ptr_bit_set[0] = 0UL;
+ ptr_bit_set[1] = 0UL;
+
+ return true;
+ }
+ } // namespace HAL
+} // namespace Kernel
diff --git a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
index 611ec596..1bb54588 100644
--- a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
@@ -13,6 +13,9 @@
EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp)
{
Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash();
+
+ Kernel::UserProcessHelper::StartScheduling();
+ Kernel::ke_stop(RUNTIME_CHECK_PROCESS);
}
/// @brief Handle page fault.
@@ -20,6 +23,8 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp)
EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp)
{
Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash();
+
+ Kernel::UserProcessHelper::StartScheduling();
Kernel::ke_stop(RUNTIME_CHECK_PROCESS);
}
@@ -28,6 +33,8 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp)
EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp)
{
Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash();
+
+ Kernel::UserProcessHelper::StartScheduling();
Kernel::ke_stop(RUNTIME_CHECK_PROCESS);
}
@@ -44,6 +51,8 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp)
EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp)
{
Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash();
+
+ Kernel::UserProcessHelper::StartScheduling();
Kernel::ke_stop(RUNTIME_CHECK_PROCESS);
}
diff --git a/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx b/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx
index 2e76d73a..b524b04c 100644
--- a/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx
@@ -160,10 +160,10 @@ namespace Kernel::HAL
{
fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Process = &UserProcessScheduler::The().CurrentProcess().Leak();
- return true;
+ return Yes;
}
- return false;
+ return No;
}
/***********************************************************************************/
diff --git a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
index 4474295f..19d62965 100644
--- a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
@@ -47,8 +47,6 @@ namespace Kernel::HAL
for (UInt16 idt_indx = 0; idt_indx < 12; ++idt_indx)
{
- MUST_PASS(ptr_ivt[idt_indx]);
-
Detail::kInterruptVectorTable[idt_indx].Selector = kGdtKernelCodeSelector;
Detail::kInterruptVectorTable[idt_indx].Ist = 0;
Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kTrapGate;
@@ -62,8 +60,6 @@ namespace Kernel::HAL
for (UInt16 idt_indx = 13; idt_indx < kKernelIdtSize; ++idt_indx)
{
- MUST_PASS(ptr_ivt[idt_indx]);
-
Detail::kInterruptVectorTable[idt_indx].Selector = kGdtKernelCodeSelector;
Detail::kInterruptVectorTable[idt_indx].Ist = 0;
Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kInterruptGate;
diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
index 34398871..33c3f689 100644
--- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
@@ -56,7 +56,6 @@ namespace Kernel::HAL
Kernel::Property cKernelVersion;
Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser};
-EXTERN Kernel::Boolean kAllocationInProgress;
EXTERN_C Kernel::VoidPtr kInterruptVectorTable[];
Kernel::Void hal_real_init(Kernel::Void) noexcept;
@@ -93,17 +92,12 @@ EXTERN_C void hal_init_platform(
Kernel::Void hal_real_init(Kernel::Void) noexcept
{
- // reset kAllocationInProgress field to zero.
- kAllocationInProgress = false;
-
- kKernelVMHStart = kHandoverHeader->f_HeapStart;
-
// get page size.
kKernelVirtualSize = kHandoverHeader->f_VirtualSize;
// get virtual address start (for the heap)
kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>(
- reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_VirtualStart));
+ reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart));
// get physical address start.
kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>(
@@ -136,7 +130,6 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
auto fs = new Kernel::NewFilesystemManager();
MUST_PASS(fs);
- MUST_PASS(fs->GetParser());
Kernel::NewFilesystemManager::Mount(fs);
diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
index dc534589..39a80922 100644
--- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
+++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
@@ -67,20 +67,15 @@ mp_system_call_handler:
o64 sysret
mp_do_context_switch_pre:
+ mov rcx, 0xc0000082
+ wrmsr
mov rcx, 0xc0000080
rdmsr
or eax, 1
wrmsr
-
mov rcx, 0xc0000081
rdmsr
- mov rax, 0x00000000
mov edx, 0x00180008
wrmsr
- mov rcx, 0xc0000082
- mov rax, mp_system_call_handler
- mov rdx, 0x0
- wrmsr
-
ret
diff --git a/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx b/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx
deleted file mode 100644
index 28b5f9be..00000000
--- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx
+++ /dev/null
@@ -1,149 +0,0 @@
-/* -------------------------------------------
-
- Copyright ZKA Technologies.
-
-------------------------------------------- */
-
-#include <ArchKit/ArchKit.hxx>
-
-#define cVMHMagic (0xDEEFD00D)
-#define cPaddingVMH (16)
-
-#ifdef __ZKA_AMD64__
-#include <HALKit/AMD64/HalPageAlloc.hxx>
-#elif defined(__ZKA_ARM64__)
-#include <HALKit/ARM64/HalPageAlloc.hxx>
-#endif
-
-#include <NewKit/Defines.hxx>
-#include <NewKit/KernelCheck.hxx>
-
-Kernel::Boolean kAllocationInProgress = false;
-
-namespace Kernel
-{
- namespace HAL
- {
- namespace Detail
- {
- struct VIRTUAL_MEMORY_HEADER
- {
- UInt32 Magic;
- Boolean Present : 1;
- Boolean ReadWrite : 1;
- Boolean User : 1;
- SizeT Size;
- };
-
- struct VirtualMemoryHeaderTraits final
- {
- /// @brief Get next header.
- /// @param current
- /// @return
- VIRTUAL_MEMORY_HEADER* Next(VIRTUAL_MEMORY_HEADER* current)
- {
- if (current->Magic != cVMHMagic)
- return current;
-
- return current + sizeof(VIRTUAL_MEMORY_HEADER) + current->Size;
- }
-
- /// @brief Get previous header.
- /// @param current
- /// @return
- VIRTUAL_MEMORY_HEADER* Prev(VIRTUAL_MEMORY_HEADER* current)
- {
- if (current->Magic != cVMHMagic)
- return current;
-
- return current - sizeof(VIRTUAL_MEMORY_HEADER) - current->Size;
- }
- };
- } // namespace Detail
-
- /// @brief Allocates a new page of memory.
- /// @param sz the size of it.
- /// @param rw read/write flag.
- /// @param user user flag.
- /// @return the page table of it.
- STATIC auto hal_try_alloc_new_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr
- {
- if (kAllocationInProgress)
- return nullptr;
-
- kAllocationInProgress = true;
-
- //! fetch from the start.
- Detail::VIRTUAL_MEMORY_HEADER* vmh_header = reinterpret_cast<Detail::VIRTUAL_MEMORY_HEADER*>(kKernelVMHStart);
- Detail::VirtualMemoryHeaderTraits traits;
-
- while (vmh_header->Present &&
- vmh_header->Magic == cVMHMagic)
- {
- vmh_header = traits.Next(vmh_header);
-
- if (vmh_header == reinterpret_cast<VoidPtr>(kBadPtr))
- {
- ke_stop(RUNTIME_CHECK_POINTER);
- return nullptr;
- }
- }
-
- vmh_header->Magic = cVMHMagic;
- vmh_header->Present = true;
- vmh_header->ReadWrite = rw;
- vmh_header->User = user;
- vmh_header->Size = size;
-
- kAllocationInProgress = false;
-
- VoidPtr result = reinterpret_cast<VoidPtr>(vmh_header + sizeof(Detail::VIRTUAL_MEMORY_HEADER));
-
- mm_update_pte(result, (rw ? eFlagsRw : 0));
- mm_update_pte(result, (user ? eFlagsUser : 0));
-
- return result;
- }
-
- /// @brief Allocate a new page to be used by the OS.
- /// @param rw read/write bit.
- /// @param user user bit.
- /// @return
- auto hal_alloc_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr
- {
- kcout << "PageAlloc: Waiting now...";
-
- // Wait for a ongoing allocation to complete.
- while (kAllocationInProgress)
- {
- (Void)0;
- }
-
- kcout << ", done waiting, allocating...\r";
-
- if (size == 0)
- ++size;
-
- // Now allocate the page.
- return hal_try_alloc_new_page(rw, user, size);
- }
-
- auto hal_free_page(VoidPtr page_ptr) -> Bool
- {
- if (!page_ptr)
- return false;
-
- Detail::VIRTUAL_MEMORY_HEADER* result = reinterpret_cast<Detail::VIRTUAL_MEMORY_HEADER*>((UIntPtr)page_ptr - sizeof(Detail::VIRTUAL_MEMORY_HEADER));
-
- if (result->Magic != cVMHMagic)
- return false;
-
- if (result->Present != true)
- return true;
-
- result->Present = false;
-
- return true;
- }
- } // namespace HAL
-} // namespace Kernel
diff --git a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx b/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx
index aadabd9c..8eb85e78 100644
--- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx
+++ b/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx
@@ -87,8 +87,8 @@ namespace Kernel::HAL
ZKA_PTE ALIGN(kPTEAlign) Pte[kPTEMax];
};
- auto hal_alloc_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr;
- auto hal_free_page(VoidPtr page_ptr) -> Bool;
+ auto mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size) -> VoidPtr;
+ auto mm_free_bitmap(VoidPtr page_ptr) -> Bool;
} // namespace Kernel::HAL
namespace Kernel
diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
index 407b7e51..3c34ab68 100644
--- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
@@ -27,32 +27,37 @@ namespace Kernel::HAL
// Access PML4 entry
volatile UInt64* pml4_entry = (volatile UInt64*)(((UInt64)pml4_base) + pml4_idx * sizeof(UIntPtr));
- UInt64 pdpt_base = *pml4_entry & ~0xFFF; // Remove flags (assuming 4KB pages)
+ UInt64 pdpt_base = *pml4_entry & ~0xFFF; // Remove flags (assuming 4KB pages)
// Access PDPT entry
volatile UInt64* pdpt_entry = (volatile UInt64*)(((UInt64)pdpt_base) + pdpt_idx * sizeof(UIntPtr));
- UInt64 pd_base = *pdpt_entry & ~0xFFF; // Remove flags
+ UInt64 pd_base = *pdpt_entry & ~0xFFF; // Remove flags
+ // Now PD
volatile UInt64* pd_entry = (volatile UInt64*)(((UInt64)pd_base) + pd_idx * sizeof(UIntPtr));
UInt64 pt_base = *pd_entry & ~0xFFF; // Remove flags
+ // And then PTE
volatile UInt64* page_addr = (volatile UInt64*)(((UInt64)pt_base) + (pte_idx * sizeof(UIntPtr)));
- if (page_addr)
- {
- if (flags & eFlagsPresent)
- *page_addr |= 0x01; // present bit
+ if (flags & eFlagsPresent)
+ *page_addr |= 0x01; // present bit
+ else if (flags & ~eFlagsPresent)
+ *page_addr &= 0x01; // present bit
- if (flags & eFlagsRw)
- *page_addr |= 0x02;
+ if (flags & eFlagsRw)
+ *page_addr |= 0x02;
+ else if (flags & ~eFlagsRw)
+ *page_addr &= 0x02; // present bit
- if (flags & eFlagsUser)
- *page_addr |= 0x02;
+ if (flags & eFlagsUser)
+ *page_addr |= 0x04;
+ else if (flags & ~eFlagsUser)
+ *page_addr &= 0x04; // present bit
- return Yes;
- }
+ hal_write_cr3((UIntPtr)pml4_base);
- return No;
+ return 0;
}
Void Out8(UInt16 port, UInt8 value)
diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx
index a80e13cb..b7fa080c 100644
--- a/dev/ZKA/HALKit/AMD64/Processor.hxx
+++ b/dev/ZKA/HALKit/AMD64/Processor.hxx
@@ -56,11 +56,10 @@ namespace Kernel::HAL
/// @brief Virtual memory flags.
enum
{
- eFlagsPresent,
- eFlagsUser,
- eFlagsRw,
- eFlagsExecDisable,
- eFlagsCount,
+ eFlagsPresent = 0x01,
+ eFlagsRw = 0x02,
+ eFlagsUser = 0x04,
+ eFlagsCount = 0x3,
};
/// @brief Updates a PTE from pd_base.
@@ -100,7 +99,7 @@ namespace Kernel::HAL
using InterruptId = UInt16; /* For each element in the IVT */
/// @brief Stack frame (as retrieved from assembly.)
- struct PACKED StackFrame final
+ struct StackFrame final
{
UIntPtr R8{0};
UIntPtr R9{0};
@@ -293,7 +292,6 @@ EXTERN_C Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr);
#define kKernelIdtSize 0x100
#define kKernelInterruptId 0x32
-inline Kernel::VoidPtr kKernelVMHStart = nullptr;
inline Kernel::VoidPtr kKernelVirtualStart = nullptr;
inline Kernel::UIntPtr kKernelVirtualSize = 0UL;
diff --git a/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx b/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx
index 996b93ee..052f8c64 100644
--- a/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx
+++ b/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx
@@ -107,7 +107,7 @@ ATAInit_Retry:
OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE;
- Kernel::kcout << "newoskrnl.exe: Create ATA module.\r";
+ Kernel::kcout << "newoskrnl.exe: Created IDE module.\r";
return true;
}
diff --git a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
index 52e4f1ee..d51f0421 100644
--- a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
@@ -76,14 +76,12 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
// reset kAllocationInProgress field to zero.
kAllocationInProgress = false;
- kKernelVMHStart = kHandoverHeader->f_HeapStart;
-
// get page size.
kKernelVirtualSize = kHandoverHeader->f_VirtualSize;
// get virtual address start (for the heap)
kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>(
- reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_VirtualStart));
+ reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart));
// get physical address start.
kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>(
diff --git a/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx b/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx
index ef3b6db1..ab77f1d0 100644
--- a/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx
+++ b/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx
@@ -96,7 +96,7 @@ namespace Kernel::HAL
LongDescLevel3 ALIGN(kPTEAlign) Pte[kPTEMax];
};
- VoidPtr hal_alloc_page(Boolean rw, Boolean user, SizeT size);
+ VoidPtr mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size);
} // namespace Kernel::HAL
namespace Kernel
diff --git a/dev/ZKA/HALKit/ARM64/Processor.hxx b/dev/ZKA/HALKit/ARM64/Processor.hxx
index 1880d36c..ad2bdc7b 100644
--- a/dev/ZKA/HALKit/ARM64/Processor.hxx
+++ b/dev/ZKA/HALKit/ARM64/Processor.hxx
@@ -42,7 +42,6 @@ namespace Kernel::HAL
typedef StackFrame* StackFramePtr;
} // namespace Kernel::HAL
-inline Kernel::VoidPtr kKernelVMHStart = nullptr;
inline Kernel::VoidPtr kKernelVirtualStart = nullptr;
inline Kernel::UIntPtr kKernelVirtualSize = 0UL;
diff --git a/dev/ZKA/HALKit/POWER/HalHardware.cxx b/dev/ZKA/HALKit/POWER/HalHardware.cxx
index 9fb841c8..eb335d70 100644
--- a/dev/ZKA/HALKit/POWER/HalHardware.cxx
+++ b/dev/ZKA/HALKit/POWER/HalHardware.cxx
@@ -11,7 +11,7 @@ namespace Kernel
{
namespace HAL
{
- UIntPtr hal_alloc_page(bool rw, bool user)
+ UIntPtr mm_alloc_bitmap(bool rw, bool user)
{
return 0;
}
diff --git a/dev/ZKA/KernelKit/Heap.hxx b/dev/ZKA/KernelKit/Heap.hxx
index 65b71774..27c79c83 100644
--- a/dev/ZKA/KernelKit/Heap.hxx
+++ b/dev/ZKA/KernelKit/Heap.hxx
@@ -30,10 +30,10 @@ namespace Kernel
/// @return if it exists.
Boolean mm_is_valid_heap(VoidPtr heap_ptr);
- /// @brief allocate chunk of memory.
- /// @param sz size of pointer
- /// @param rw read write (true to enable it)
- /// @param user is it accesible by user processes?
+ /// @brief Allocate chunk of memory.
+ /// @param sz Size of pointer
+ /// @param rw Read Write bit.
+ /// @param user User enable bit.
/// @return The newly allocated pointer.
VoidPtr mm_new_ke_heap(const SizeT sz, const Bool rw, const Bool user);
diff --git a/dev/ZKA/NewKit/KernelCheck.hxx b/dev/ZKA/NewKit/KernelCheck.hxx
index 58a76acb..8797ff86 100644
--- a/dev/ZKA/NewKit/KernelCheck.hxx
+++ b/dev/ZKA/NewKit/KernelCheck.hxx
@@ -20,7 +20,7 @@ namespace Kernel
Kernel::ke_runtime_check(EXPR, FILE, STRINGIFY(LINE))
#ifdef __DEBUG__
-#define MUST_PASS(EXPR) __MUST_PASS(EXPR, __FILE__, __LINE__)
+#define MUST_PASS(EXPR) __MUST_PASS((EXPR), __FILE__, __LINE__)
#define assert(EXPR) MUST_PASS(EXPR, RUNTIME_CHECK_EXPRESSION)
#else
#define MUST_PASS(EXPR) (Kernel::Void)(EXPR)
@@ -43,6 +43,7 @@ enum RUNTIME_CHECK
RUNTIME_CHECK_BOOTSTRAP,
RUNTIME_CHECK_UNEXCPECTED,
RUNTIME_CHECK_FILESYSTEM,
+ RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM,
RUNTIME_CHECK_COUNT,
};
diff --git a/dev/ZKA/NewKit/Macros.hxx b/dev/ZKA/NewKit/Macros.hxx
index 153b8c45..b9242e79 100644
--- a/dev/ZKA/NewKit/Macros.hxx
+++ b/dev/ZKA/NewKit/Macros.hxx
@@ -7,31 +7,31 @@
#pragma once
#ifndef KIB
-#define KIB(X) ((X) / 1024)
+#define KIB(X) (Kernel::UInt64)((X) / 1024)
#endif
#ifndef kib_cast
-#define kib_cast(X) ((X)*1024)
+#define kib_cast(X) (Kernel::UInt64)((X)*1024)
#endif
#ifndef MIB
-#define MIB(X) ((Kernel::UInt64)KIB(X) / 1024)
+#define MIB(X) (Kernel::UInt64)((Kernel::UInt64)KIB(X) / 1024)
#endif
#ifndef mib_cast
-#define mib_cast(X) ((Kernel::UInt64)kib_cast(X) * 1024)
+#define mib_cast(X) (Kernel::UInt64)((Kernel::UInt64)kib_cast(X) * 1024)
#endif
#ifndef GIB
-#define GIB(X) ((Kernel::UInt64)MIB(X) / 1024)
+#define GIB(X) (Kernel::UInt64)((Kernel::UInt64)MIB(X) / 1024)
#endif
#ifndef gib_cast
-#define gib_cast(X) ((Kernel::UInt64)mib_cast(X) * 1024)
+#define gib_cast(X) (Kernel::UInt64)((Kernel::UInt64)mib_cast(X) * 1024)
#endif
#ifndef TIB
-#define TIB(X) ((Kernel::UInt64)GIB(X) / 1024)
+#define TIB(X) (Kernel::UInt64)((Kernel::UInt64)GIB(X) / 1024)
#endif
#ifndef tib_cast
@@ -94,7 +94,7 @@
#define CANT_REACH() __builtin_unreachable()
#endif
-#define kBadPtr 0xFBFBFBFBFBFBFBFB
+#define kInvalidAddress 0xFBFBFBFBFBFBFBFB
#define kBadAddress 0x00000000000000
#define kMaxAddr 0xFFFFFFFFFFFFFFFF
#define kPathLen 255
diff --git a/dev/ZKA/NewKit/PageAllocator.hxx b/dev/ZKA/NewKit/PageAllocator.hxx
index b485e722..a6d84aa0 100644
--- a/dev/ZKA/NewKit/PageAllocator.hxx
+++ b/dev/ZKA/NewKit/PageAllocator.hxx
@@ -13,7 +13,6 @@ namespace Kernel
{
namespace Detail
{
- VoidPtr create_page_wrapper(Boolean rw, Boolean user, SizeT pageSz);
void exec_disable(UIntPtr addr);
bool page_disable(UIntPtr addr);
} // namespace Detail
diff --git a/dev/ZKA/NewKit/PageManager.hxx b/dev/ZKA/NewKit/PageManager.hxx
index 249c0cc9..0de37803 100644
--- a/dev/ZKA/NewKit/PageManager.hxx
+++ b/dev/ZKA/NewKit/PageManager.hxx
@@ -33,6 +33,8 @@ namespace Kernel
void NoExecute(const bool enable = false);
const bool& NoExecute();
+ operator bool() { return fVirtAddr; }
+
bool Reclaim();
bool Shareable();
bool Present();
@@ -68,7 +70,7 @@ namespace Kernel
bool Free(Ref<PTEWrapper*>& wrapper);
private:
- void FlushTLB(UIntPtr VirtAddr);
+ void FlushTLB();
private:
friend PTEWrapper;
diff --git a/dev/ZKA/NewKit/Ref.hxx b/dev/ZKA/NewKit/Ref.hxx
index 977c353a..7f5167c2 100644
--- a/dev/ZKA/NewKit/Ref.hxx
+++ b/dev/ZKA/NewKit/Ref.hxx
@@ -84,7 +84,7 @@ namespace Kernel
NonNullRef(T* ref)
: fRef(ref, true)
{
- MUST_PASS(ref != nullptr);
+ MUST_PASS(ref);
}
Ref<T>& operator->()
diff --git a/dev/ZKA/Sources/DLLMain.cxx b/dev/ZKA/Sources/DLLMain.cxx
index 934f418c..84c58b3a 100644
--- a/dev/ZKA/Sources/DLLMain.cxx
+++ b/dev/ZKA/Sources/DLLMain.cxx
@@ -150,14 +150,12 @@ namespace Kernel::Detail
};
} // namespace Kernel::Detail
-namespace Kernel
+EXTERN_C ATTRIBUTE(naked) Kernel::Void HangCPU(Kernel::Void)
{
- EXTERN UserProcessScheduler* cProcessScheduler;
-} // namespace Kernel
+ while (Yes)
+ {
-EXTERN_C Kernel::Void HangCPU(Kernel::Void)
-{
- while (1);
+ }
}
/// @brief Application entrypoint.
@@ -189,10 +187,6 @@ EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void)
CG::CGDrawStringToWnd(cKernelWnd, "newoskrnl.exe: Running System Component: ", 10, 10, RGB(0, 0, 0));
CG::CGDrawStringToWnd(cKernelWnd, kSysDrv, 10, 10 + (FONT_SIZE_X * Kernel::rt_string_len("newoskrnl.exe: Running System Component: ")), RGB(0, 0, 0));
- /// @note BThread doesn't parse the symbols so doesn't nullify them, .bss is though.
- Kernel::cProcessScheduler = nullptr;
- Kernel::UserProcessHelper::StartScheduling();
-
CG::CGDrawStringToWnd(cKernelWnd, "newoskrnl.exe: Starting ZKA System...", 20, 10, RGB(0, 0, 0));
Kernel::sched_execute_thread(HangCPU, "HANG TEST");
@@ -201,6 +195,4 @@ EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void)
{
Kernel::UserProcessHelper::StartScheduling();
}
-
- Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP);
}
diff --git a/dev/ZKA/Sources/FS/NewFS.cxx b/dev/ZKA/Sources/FS/NewFS.cxx
index bf55a56f..e3ec6184 100644
--- a/dev/ZKA/Sources/FS/NewFS.cxx
+++ b/dev/ZKA/Sources/FS/NewFS.cxx
@@ -1035,11 +1035,11 @@ namespace Kernel::Detail
sMountpointInterface.C() = io_construct_drive();
sMountpointInterface.D() = io_construct_drive();
- kcout << "newoskrnl.exe: Testing main drive...\r";
+ kcout << "newoskrnl.exe: Testing A:\r";
sMountpointInterface.A().fVerify(&sMountpointInterface.A().fPacket);
- kcout << "newoskrnl.exe: Testing main drive [ OK ]...\r";
+ kcout << "newoskrnl.exe: Testing A: [ OK ]\r";
return true;
}
diff --git a/dev/ZKA/Sources/Framebuffer.cxx b/dev/ZKA/Sources/Framebuffer.cxx
index 76fe7172..3794e458 100644
--- a/dev/ZKA/Sources/Framebuffer.cxx
+++ b/dev/ZKA/Sources/Framebuffer.cxx
@@ -44,7 +44,7 @@ namespace Kernel
{
return fFrameBufferAddr.Leak()->fBase != 0 &&
fColour != FramebufferColorKind::INVALID &&
- fFrameBufferAddr.Leak()->fBase != kBadPtr;
+ fFrameBufferAddr.Leak()->fBase != kInvalidAddress;
}
/// @brief Set color kind of framebuffer.
diff --git a/dev/ZKA/Sources/Heap.cxx b/dev/ZKA/Sources/Heap.cxx
index bd7e299b..e036badb 100644
--- a/dev/ZKA/Sources/Heap.cxx
+++ b/dev/ZKA/Sources/Heap.cxx
@@ -85,10 +85,10 @@ namespace Kernel
return allocatedPtr;
}
- /// @brief allocate chunk of memory.
- /// @param sz size of pointer
- /// @param rw read write (true to enable it)
- /// @param user is it accesible by user processes?
+ /// @brief Allocate chunk of memory.
+ /// @param sz Size of pointer
+ /// @param rw Read Write bit.
+ /// @param user User enable bit.
/// @return The newly allocated pointer.
VoidPtr mm_new_ke_heap(const SizeT sz, const bool rw, const bool user)
{
@@ -99,28 +99,29 @@ namespace Kernel
if (szFix == 0)
++szFix;
- auto wrapper = kHeapPageManager.Request(rw, user, false, szFix);
+ auto wrapper = kHeapPageManager.Request(rw, user, No, szFix);
Detail::HEAP_INFORMATION_BLOCK_PTR heap_info_ptr =
reinterpret_cast<Detail::HEAP_INFORMATION_BLOCK_PTR>(
- wrapper.VirtualAddress());
+ wrapper.VirtualAddress() + sizeof(Detail::HEAP_INFORMATION_BLOCK));
heap_info_ptr->fHeapSize = szFix;
- heap_info_ptr->fMagic = kKernelHeapMagic;
- heap_info_ptr->fCRC32 = 0U; // dont fill it for now.
- heap_info_ptr->fHeapPtr = wrapper.VirtualAddress() + sizeof(Detail::HEAP_INFORMATION_BLOCK);
- heap_info_ptr->fPage = 0UL;
- heap_info_ptr->fUser = user;
- heap_info_ptr->fPresent = true;
+ heap_info_ptr->fMagic = kKernelHeapMagic;
+ heap_info_ptr->fCRC32 = 0U; // dont fill it for now.
+ heap_info_ptr->fHeapPtr = wrapper.VirtualAddress() + sizeof(Detail::HEAP_INFORMATION_BLOCK);
+ heap_info_ptr->fPage = 0UL;
+ heap_info_ptr->fUser = user;
+ heap_info_ptr->fPresent = true;
++kHeapCount;
+ auto result = reinterpret_cast<VoidPtr>(heap_info_ptr->fHeapPtr);
+
kLatestAllocation = heap_info_ptr;
Detail::mm_alloc_fini_timeout();
- return reinterpret_cast<VoidPtr>(heap_info_ptr +
- sizeof(Detail::HEAP_INFORMATION_BLOCK));
+ return result;
}
/// @brief Makes a page heap.
@@ -132,7 +133,7 @@ namespace Kernel
return -kErrorInternal;
if (((IntPtr)heap_ptr - sizeof(Detail::HEAP_INFORMATION_BLOCK)) <= 0)
return -kErrorInternal;
- if (((IntPtr)heap_ptr - kBadPtr) < 0)
+ if (((IntPtr)heap_ptr - kInvalidAddress) < 0)
return -kErrorInternal;
Detail::mm_alloc_init_timeout();
@@ -157,7 +158,7 @@ namespace Kernel
return -kErrorInternal;
if (((IntPtr)heap_ptr - sizeof(Detail::HEAP_INFORMATION_BLOCK)) <= 0)
return -kErrorInternal;
- if (((IntPtr)heap_ptr - kBadPtr) < 0)
+ if (((IntPtr)heap_ptr - kInvalidAddress) < 0)
return -kErrorInternal;
Detail::mm_alloc_init_timeout();
@@ -188,12 +189,12 @@ namespace Kernel
}
heapInfoBlk->fHeapSize = 0UL;
- heapInfoBlk->fPresent = false;
- heapInfoBlk->fHeapPtr = 0;
- heapInfoBlk->fCRC32 = 0;
- heapInfoBlk->fMagic = 0;
+ heapInfoBlk->fPresent = false;
+ heapInfoBlk->fHeapPtr = 0;
+ heapInfoBlk->fCRC32 = 0;
+ heapInfoBlk->fMagic = 0;
- PTEWrapper pageWrapper(false, false, false, reinterpret_cast<UIntPtr>(heapInfoBlk));
+ PTEWrapper pageWrapper(false, false, false, reinterpret_cast<UIntPtr>(heapInfoBlk) - sizeof(Detail::HEAP_INFORMATION_BLOCK));
Ref<PTEWrapper*> pteAddress{&pageWrapper};
kHeapPageManager.Free(pteAddress);
diff --git a/dev/ZKA/Sources/KernelCheck.cxx b/dev/ZKA/Sources/KernelCheck.cxx
index a05c265a..0ed96593 100644
--- a/dev/ZKA/Sources/KernelCheck.cxx
+++ b/dev/ZKA/Sources/KernelCheck.cxx
@@ -56,6 +56,7 @@ namespace Kernel
{
case RUNTIME_CHECK_PROCESS: {
CGDrawString("0x00000008 No more processes to run, this is because that ZKA ran out of processes.", start_y, x, panicTxt);
+ RecoveryFactory::Recover();
break;
}
case RUNTIME_CHECK_ACPI: {
@@ -102,7 +103,7 @@ namespace Kernel
break;
}
case RUNTIME_CHECK_FAILED: {
- CGDrawString("0x10000001 Assertion failed.", start_y, x, panicTxt);
+ CGDrawString("0x10000001 Kernel bug-check failure.", start_y, x, panicTxt);
RecoveryFactory::Recover();
break;
}
@@ -120,13 +121,6 @@ namespace Kernel
Void RecoveryFactory::Recover() noexcept
{
- const auto cMaxSeconds = Seconds(4);
-
- HardwareTimer timer(cMaxSeconds);
- timer.Wait();
-
- kcout << "newoskrnl.exe: Shutting down computer...\r";
-
PowerFactoryInterface power(nullptr);
power.Shutdown();
}
@@ -135,6 +129,9 @@ namespace Kernel
{
if (!expr)
{
+ kcout << "ASSERTION FAILED: FILE: " << file << endl;
+ kcout << "ASSERTION FAILED: LINE: " << line << endl;
+
ke_stop(RUNTIME_CHECK_FAILED); // Runtime Check failed
}
}
diff --git a/dev/ZKA/Sources/MP.cxx b/dev/ZKA/Sources/MP.cxx
index b3b62609..7429751f 100644
--- a/dev/ZKA/Sources/MP.cxx
+++ b/dev/ZKA/Sources/MP.cxx
@@ -125,12 +125,12 @@ namespace Kernel
///! @brief Default constructor.
HardwareThreadScheduler::HardwareThreadScheduler()
{
- kcout << "newoskrnl.exe: initializing HardwareThreadScheduler." << endl;
+ kcout << "newoskrnl.exe: Initializing HardwareThreadScheduler." << endl;
cSMPCoreName.GetKey() += "Property\\MPClass";
cSMPCoreName.GetValue() = (PropertyId)this;
- kcout << "newoskrnl.exe: initialized HardwareThreadScheduler." << endl;
+ kcout << "newoskrnl.exe: Initialized HardwareThreadScheduler." << endl;
}
///! @brief Default destructor.
diff --git a/dev/ZKA/Sources/NewFS+FileManager.cxx b/dev/ZKA/Sources/NewFS+FileManager.cxx
index 98e0e3af..20fb623d 100644
--- a/dev/ZKA/Sources/NewFS+FileManager.cxx
+++ b/dev/ZKA/Sources/NewFS+FileManager.cxx
@@ -19,6 +19,7 @@ namespace Kernel
{
MUST_PASS(Detail::fs_init_newfs());
fImpl = new NewFSParser();
+ MUST_PASS(fImpl);
kcout << "newoskrnl.exe: We are done here... (NewFilesystemManager).\r";
}
diff --git a/dev/ZKA/Sources/PageAllocator.cxx b/dev/ZKA/Sources/PageAllocator.cxx
index dec6c470..e68d0659 100644
--- a/dev/ZKA/Sources/PageAllocator.cxx
+++ b/dev/ZKA/Sources/PageAllocator.cxx
@@ -11,19 +11,6 @@
/// @brief Internal namespace, used internally by Kernel.
namespace Kernel::Detail
{
- VoidPtr create_page_wrapper(Boolean rw, Boolean user, SizeT pageSz)
- {
- auto addr = HAL::hal_alloc_page(rw, user, pageSz);
-
- if (addr == kBadAddress)
- {
- kcout << "[create_page_wrapper] kBadAddress returned\n";
- ke_stop(RUNTIME_CHECK_POINTER);
- }
-
- return addr;
- }
-
void exec_disable(UIntPtr VirtualAddr)
{
#ifdef __ZKA_SUPPORT_NX__
diff --git a/dev/ZKA/Sources/PageManager.cxx b/dev/ZKA/Sources/PageManager.cxx
index d14130ff..dd18709f 100644
--- a/dev/ZKA/Sources/PageManager.cxx
+++ b/dev/ZKA/Sources/PageManager.cxx
@@ -35,11 +35,8 @@ namespace Kernel
/// @brief Flush virtual address.
/// @param VirtAddr
- Void PageManager::FlushTLB(UIntPtr VirtAddr)
+ Void PageManager::FlushTLB()
{
- if (VirtAddr == kBadAddress)
- return;
-
hal_flush_tlb();
}
@@ -64,31 +61,20 @@ namespace Kernel
PTEWrapper PageManager::Request(Boolean Rw, Boolean User, Boolean ExecDisable, SizeT Sz)
{
// Store PTE wrapper right after PTE.
- VoidPtr ptr = Kernel::HAL::hal_alloc_page(Rw, User, Sz);
-
- if (ptr == kBadAddress)
- {
- kcout << "[create_page_wrapper] kBadAddress returned\n";
- ke_stop(RUNTIME_CHECK_POINTER);
- }
+ VoidPtr ptr = Kernel::HAL::mm_alloc_bitmap(Rw, User, Sz);
return PTEWrapper{Rw, User, ExecDisable, reinterpret_cast<UIntPtr>(ptr)};
}
- /// @brief Disable PTE.
+ /// @brief Disable BitMap.
/// @param wrapper the wrapper.
- /// @return
- bool PageManager::Free(Ref<PTEWrapper*>& wrapper)
+ /// @return If the page bitmap was cleared or not.
+ Bool PageManager::Free(Ref<PTEWrapper*>& wrapper)
{
- if (wrapper)
- {
- if (!Kernel::HAL::hal_free_page((VoidPtr)wrapper->VirtualAddress()))
- return false;
+ if (!Kernel::HAL::mm_free_bitmap((VoidPtr)wrapper->VirtualAddress()))
+ return false;
- return true;
- }
-
- return false;
+ return true;
}
/// @brief Virtual PTE address.
diff --git a/dev/ZKA/Sources/ThreadLocalStorage.cxx b/dev/ZKA/Sources/ThreadLocalStorage.cxx
index f4794bdd..e68593f6 100644
--- a/dev/ZKA/Sources/ThreadLocalStorage.cxx
+++ b/dev/ZKA/Sources/ThreadLocalStorage.cxx
@@ -21,7 +21,7 @@
using namespace Kernel;
-namespace Detail
+namespace Kernel::Detail
{
/// \brief UserProcess thread information header.
struct THREAD_HEADER_BLOCK final
diff --git a/dev/ZKA/Sources/User.cxx b/dev/ZKA/Sources/User.cxx
index 5a4c2335..871d011f 100644
--- a/dev/ZKA/Sources/User.cxx
+++ b/dev/ZKA/Sources/User.cxx
@@ -77,7 +77,6 @@ namespace Kernel
SizeT len = rt_string_len(password_to_fill);
Char* password = new Char[len];
-
MUST_PASS(password);
// fill data first, generate hash.
diff --git a/dev/ZKA/Sources/UserProcessScheduler.cxx b/dev/ZKA/Sources/UserProcessScheduler.cxx
index dc142b18..26d8be79 100644
--- a/dev/ZKA/Sources/UserProcessScheduler.cxx
+++ b/dev/ZKA/Sources/UserProcessScheduler.cxx
@@ -28,13 +28,13 @@ namespace Kernel
/// @brief Exit Code global variable.
/***********************************************************************************/
- UInt32 cLastExitCode = 0U;
+ STATIC UInt32 cLastExitCode = 0U;
/***********************************************************************************/
/// @brief UserProcess scheduler instance.
/***********************************************************************************/
- UserProcessScheduler* cProcessScheduler = nullptr;
+ STATIC UserProcessScheduler* cProcessScheduler;
/// @brief Gets the last exit code.
/// @note Not thread-safe.
@@ -53,11 +53,9 @@ namespace Kernel
if (this->Name == 0)
return;
- kcout << this->Name << ": crashed. (id = " << number(kErrorProcessFault) << endl;
+ kcout << this->Name << ": crashed, ID = " << number(kErrorProcessFault) << endl;
this->Exit(kErrorProcessFault);
-
- UserProcessHelper::StartScheduling();
}
/// @brief Gets the local last exit code.
@@ -246,8 +244,12 @@ namespace Kernel
}
process.StackFrame = new HAL::StackFrame();
-
- MUST_PASS(process.StackFrame);
+
+ if (!process.StackFrame)
+ {
+ process.Crash();
+ return -kErrorProcessFault;
+ }
if (process.Image)
{
@@ -291,6 +293,11 @@ namespace Kernel
UserProcessScheduler& UserProcessScheduler::The()
{
+ if (!cProcessScheduler)
+ {
+ cProcessScheduler = new UserProcessScheduler();
+ }
+
MUST_PASS(cProcessScheduler);
return *cProcessScheduler;
}
@@ -414,14 +421,6 @@ namespace Kernel
SizeT UserProcessHelper::StartScheduling()
{
- if (!cProcessScheduler)
- {
- cProcessScheduler = new UserProcessScheduler();
- MUST_PASS(cProcessScheduler);
-
- kcout << "newoskrnl.exe: Team capacity: " << number(cProcessScheduler->CurrentTeam().AsArray().Capacity()) << endl;
- }
-
SizeT ret = cProcessScheduler->Run();
return ret;
}
diff --git a/dev/ZKA/amd64-efi.make b/dev/ZKA/amd64-efi.make
index 02224e93..0e8cbad4 100644
--- a/dev/ZKA/amd64-efi.make
+++ b/dev/ZKA/amd64-efi.make
@@ -35,10 +35,10 @@ COPY = cp
ASMFLAGS = -f win64
# Kernel subsystem is 17 and entrypoint is __ImageStart
-LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x10000000
+LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x1000000
LDOBJ = Objects/*.obj
-# This file is the Kernel, responsible of task management and memory.
+# This file is the Kernel, responsible of task, memory, driver, sci, disk and device management.
KERNEL = newoskrnl.exe
.PHONY: error