summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal <amlal@el-mahrouss-logic.com>2024-09-10 18:42:15 +0200
committerAmlal <amlal@el-mahrouss-logic.com>2024-09-10 18:42:15 +0200
commit408f58b0ef54f49d894023d6753f8d27d0bfd46d (patch)
treee3a963519dc4e5f4d6966e5b0c597be622dca76e /dev
parent5aef44da0ce752e7ac6bd9c95489942b1a0319ae (diff)
[ IMP ] Repository bump.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev')
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/BootMain.cxx7
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/BootTextWriter.cxx10
-rw-r--r--dev/ZKA/ArchKit/ArchKit.hxx2
-rw-r--r--dev/ZKA/FirmwareKit/Handover.hxx3
-rw-r--r--dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx42
-rw-r--r--dev/ZKA/HALKit/AMD64/HalControlRegister.s14
-rw-r--r--dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx43
-rw-r--r--dev/ZKA/HALKit/AMD64/HalHALComm.cxx (renamed from dev/ZKA/HALKit/AMD64/HalProcessor.cxx)53
-rw-r--r--dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm36
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx13
-rw-r--r--dev/ZKA/HALKit/AMD64/Paging.hxx (renamed from dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx)51
-rw-r--r--dev/ZKA/HALKit/AMD64/Processor.hxx28
-rw-r--r--dev/ZKA/HALKit/AMD64/Storage/AHCI.cxx4
-rw-r--r--dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx6
-rw-r--r--dev/ZKA/HALKit/ARM64/Paging.hxx (renamed from dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx)0
-rw-r--r--dev/ZKA/HALKit/ARM64/Processor.hxx2
-rw-r--r--dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx4
-rw-r--r--dev/ZKA/KernelKit/DebugOutput.hxx4
-rw-r--r--dev/ZKA/KernelKit/DriveMgr.hxx2
-rw-r--r--dev/ZKA/Modules/AHCI/AHCI.hxx8
-rw-r--r--dev/ZKA/Modules/ATA/ATA.hxx4
-rw-r--r--dev/ZKA/Modules/Flash/Flash.hxx4
-rw-r--r--dev/ZKA/Sources/ExeMain.cxx2
-rw-r--r--dev/ZKA/Sources/FS/NeFS.cxx8
-rw-r--r--dev/ZKA/Sources/Heap.cxx15
-rw-r--r--dev/ZKA/Sources/PageMgr.cxx4
-rw-r--r--dev/ZKA/amd64-efi.make2
27 files changed, 199 insertions, 172 deletions
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
index 76a82a24..ad454ab4 100644
--- a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
+++ b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
@@ -204,7 +204,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
//-----------------------------------------------------------//
handoverHdrPtr->f_PageStart =
- (VoidPtr)Descriptor[cDefaultMemoryMap].VirtualStart;
+ (VoidPtr)Descriptor[cDefaultMemoryMap].PhysicalStart;
handoverHdrPtr->f_FirmwareSpecific[HEL::kHandoverSpecificAttrib] =
Descriptor[cDefaultMemoryMap].Attribute;
@@ -213,10 +213,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
handoverHdrPtr->f_FirmwareSpecific[HEL::kHandoverSpecificMemoryEfi] =
(UIntPtr)Descriptor;
- handoverHdrPtr->f_BitMapStart = 0;
-
- while (BS->AllocatePool(EfiRuntimeServicesData, kHandoverBitMapSz, &handoverHdrPtr->f_BitMapStart) != kEfiOk)
- ;
+ handoverHdrPtr->f_BitMapStart = (VoidPtr)Descriptor[cDefaultMemoryMap].VirtualStart;
handoverHdrPtr->f_BitMapSize = kHandoverBitMapSz; /* # of pages */
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootTextWriter.cxx b/dev/ZBA/Sources/HEL/AMD64/BootTextWriter.cxx
index d43be468..fdd9eba1 100644
--- a/dev/ZBA/Sources/HEL/AMD64/BootTextWriter.cxx
+++ b/dev/ZBA/Sources/HEL/AMD64/BootTextWriter.cxx
@@ -135,7 +135,7 @@ BTextWriter& BTextWriter::Write(const Long& x)
{
#ifdef __DEBUG__
this->_Write(x);
-
+ this->Write("h");
#endif // ifdef __DEBUG__
return *this;
@@ -144,14 +144,14 @@ BTextWriter& BTextWriter::Write(const Long& x)
BTextWriter& BTextWriter::_Write(const Long& x)
{
#ifdef __DEBUG__
- UInt64 y = (x > 0 ? x : -x) / 10;
- UInt64 h = (x > 0 ? x : -x) % 10;
+ UInt64 y = (x > 0 ? x : -x) / 16;
+ UInt64 h = (x > 0 ? x : -x) % 16;
if (y)
this->_Write(y);
/* fail if the hex number is not base-16 */
- if (h > 10)
+ if (h > 16)
{
this->WriteCharacter('?');
return *this;
@@ -160,7 +160,7 @@ BTextWriter& BTextWriter::_Write(const Long& x)
if (y < 0)
y = -y;
- const char cNumbers[] = "0123456789";
+ const char cNumbers[] = "0123456789ABCDEF";
this->WriteCharacter(cNumbers[h]);
#endif // ifdef __DEBUG__
diff --git a/dev/ZKA/ArchKit/ArchKit.hxx b/dev/ZKA/ArchKit/ArchKit.hxx
index 8ccb430c..3c617705 100644
--- a/dev/ZKA/ArchKit/ArchKit.hxx
+++ b/dev/ZKA/ArchKit/ArchKit.hxx
@@ -13,7 +13,7 @@
#include <FirmwareKit/Handover.hxx>
#ifdef __ZKA_AMD64__
-#include <HALKit/AMD64/HalPageAlloc.hxx>
+#include <HALKit/AMD64/Paging.hxx>
#include <HALKit/AMD64/Hypervisor.hxx>
#include <HALKit/AMD64/Processor.hxx>
#elif defined(__ZKA_POWER64__)
diff --git a/dev/ZKA/FirmwareKit/Handover.hxx b/dev/ZKA/FirmwareKit/Handover.hxx
index 457c0982..c398bd50 100644
--- a/dev/ZKA/FirmwareKit/Handover.hxx
+++ b/dev/ZKA/FirmwareKit/Handover.hxx
@@ -24,7 +24,8 @@
#define kHandoverMagic 0xBADCC
#define kHandoverVersion 0x0115
-#define kHandoverBitMapSz gib_cast(3)
+/* per page. */
+#define kHandoverBitMapSz gib_cast(32)
#define kHandoverStructSz sizeof(HEL::HandoverInformationHeader)
namespace Kernel::HEL
diff --git a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
index 7cb891b6..71c8cb61 100644
--- a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
@@ -9,9 +9,9 @@
#define cBitMpMagic ((Kernel::UIntPtr)0x10210)
#ifdef __ZKA_AMD64__
-#include <HALKit/AMD64/HalPageAlloc.hxx>
+#include <HALKit/AMD64/Paging.hxx>
#elif defined(__ZKA_ARM64__)
-#include <HALKit/ARM64/HalPageAlloc.hxx>
+#include <HALKit/ARM64/Paging.hxx>
#endif
#include <NewKit/Defines.hxx>
@@ -35,6 +35,8 @@ namespace Kernel
{
UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(base_ptr);
+ mm_map_page(ptr_bit_set, eFlagsPresent | eFlagsRw);
+
if (ptr_bit_set[0] == cBitMpMagic)
{
if (ptr_bit_set[1] != 0 &&
@@ -44,7 +46,7 @@ namespace Kernel
ptr_bit_set[1] = size;
ptr_bit_set[2] = Yes;
- kcout << "BMPMgr: Allocated pointer!\r";
+ kcout << "BMPMgr: Allocated Range!\r";
kcout << "Magic Number: " << hex_number(ptr_bit_set[0]) << endl;
kcout << "Size of pointer (B): " << number(ptr_bit_set[1]) << endl;
kcout << "Size of pointer (KIB): " << number(KIB(ptr_bit_set[1])) << endl;
@@ -54,13 +56,13 @@ namespace Kernel
kcout << "Address Of BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl;
if (rw)
- mm_map_page(base_ptr, eFlagsRw);
-
- if (user && rw)
- mm_map_page(base_ptr, eFlagsUser | eFlagsRw);
-
- if (user)
- mm_map_page(base_ptr, eFlagsUser);
+ mm_map_page(base_ptr, eFlagsRw | eFlagsPresent);
+ else if (user && rw)
+ mm_map_page(base_ptr, eFlagsUser | eFlagsRw | eFlagsPresent);
+ else if (user)
+ mm_map_page(base_ptr, eFlagsUser | eFlagsPresent);
+ else
+ mm_map_page(base_ptr, eFlagsPresent);
return (VoidPtr)ptr_bit_set;
}
@@ -73,7 +75,7 @@ namespace Kernel
ptr_bit_set[1] = size;
ptr_bit_set[2] = Yes;
- kcout << "BMPMgr: Allocated pointer!\r";
+ kcout << "BMPMgr: Allocated Range!\r";
kcout << "Magic Number: " << hex_number(ptr_bit_set[0]) << endl;
kcout << "Size of pointer (B): " << number(ptr_bit_set[1]) << endl;
kcout << "Size of pointer (KIB): " << number(KIB(ptr_bit_set[1])) << endl;
@@ -84,9 +86,12 @@ namespace Kernel
if (rw)
mm_map_page(base_ptr, eFlagsRw | eFlagsPresent);
-
- if (user)
+ else if (user && rw)
+ mm_map_page(base_ptr, eFlagsUser | eFlagsRw | eFlagsPresent);
+ else if (user)
mm_map_page(base_ptr, eFlagsUser | eFlagsPresent);
+ else
+ mm_map_page(base_ptr, eFlagsPresent);
return (VoidPtr)ptr_bit_set;
}
@@ -94,7 +99,7 @@ namespace Kernel
base_ptr = reinterpret_cast<VoidPtr>(reinterpret_cast<UIntPtr>(base_ptr) + (ptr_bit_set[0] != cBitMpMagic ? size : ptr_bit_set[1]));
if (reinterpret_cast<UIntPtr>(base_ptr) >= (kHandoverHeader->f_BitMapSize + base))
- break;
+ ke_stop(RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM);
}
return nullptr;
@@ -113,11 +118,6 @@ namespace Kernel
ptr_new = traits.FindBitMap(kKernelVirtualStart, size, rw, user);
- if (!ptr_new)
- {
- ke_stop(RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM);
- }
-
return ((UIntPtr*)ptr_new);
}
@@ -132,7 +132,7 @@ namespace Kernel
ptr_bit_set[0] != cBitMpMagic)
return false;
- kcout << "BMPMgr: Freed pointer!\r";
+ kcout << "BMPMgr: Freed Range!\r";
kcout << "Magic Number: " << hex_number(ptr_bit_set[0]) << endl;
kcout << "Size of pointer (B): " << number(ptr_bit_set[1]) << endl;
kcout << "Size of pointer (KIB): " << number(KIB(ptr_bit_set[1])) << endl;
@@ -144,7 +144,7 @@ namespace Kernel
ptr_bit_set[0] = cBitMpMagic;
ptr_bit_set[2] = No;
- mm_map_page(page_ptr, ~eFlagsPresent | ~eFlagsUser);
+ mm_map_page(page_ptr, ~eFlagsPresent);
return true;
}
diff --git a/dev/ZKA/HALKit/AMD64/HalControlRegister.s b/dev/ZKA/HALKit/AMD64/HalControlRegister.s
index 6fde8878..80b584ce 100644
--- a/dev/ZKA/HALKit/AMD64/HalControlRegister.s
+++ b/dev/ZKA/HALKit/AMD64/HalControlRegister.s
@@ -16,30 +16,30 @@
hal_invl_tlb:
invlpg (%rcx)
- ret
+ retq
hal_flush_tlb:
call hal_read_cr3
mov %rax, %rcx
call hal_write_cr3
- ret
+ retq
hal_read_cr3:
movq %cr3, %rax
- ret
+ retq
hal_read_cr0:
movq %cr0, %rax
- ret
+ retq
hal_read_cr2:
movq %cr2, %rax
- ret
+ retq
hal_write_cr3:
movq %rcx, %cr3
- ret
+ retq
hal_write_cr0:
movq %rcx, %cr0
- ret
+ retq
diff --git a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
index b49a688f..c6b8303d 100644
--- a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
@@ -8,10 +8,20 @@
#include <KernelKit/UserProcessScheduler.hxx>
#include <NewKit/String.hxx>
+namespace Kernel
+{
+ EXTERN UserProcessScheduler* cProcessScheduler;
+}
+
/// @brief Handle GPF fault.
/// @param rsp
EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp)
{
+ if (Kernel::cProcessScheduler == nullptr)
+ {
+ Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED);
+ }
+
Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash();
Kernel::UserProcessHelper::StartScheduling();
@@ -22,6 +32,11 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp)
{
+ if (Kernel::cProcessScheduler == nullptr)
+ {
+ Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED);
+ }
+
Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash();
Kernel::UserProcessHelper::StartScheduling();
@@ -30,6 +45,11 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp)
EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp)
{
+ if (Kernel::cProcessScheduler == nullptr)
+ {
+ Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED);
+ }
+
Kernel::UserProcessHelper::StartScheduling();
}
@@ -37,6 +57,11 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp)
{
+ if (Kernel::cProcessScheduler == nullptr)
+ {
+ Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED);
+ }
+
Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash();
Kernel::UserProcessHelper::StartScheduling();
@@ -47,6 +72,11 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp)
{
+ if (Kernel::cProcessScheduler == nullptr)
+ {
+ Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED);
+ }
+
Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash();
Kernel::ke_stop(RUNTIME_CHECK_PROCESS);
}
@@ -55,6 +85,11 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp)
{
+ if (Kernel::cProcessScheduler == nullptr)
+ {
+ Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED);
+ }
+
Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash();
Kernel::UserProcessHelper::StartScheduling();
@@ -68,12 +103,12 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr
{
if (rcx <= (kSyscalls.Count() - 1))
{
- kcout << "syscall: enter.\r";
+ kcout << "syscall: Enter Fn.\r";
if (kSyscalls[rcx].fHooked)
(kSyscalls[rcx].fProc)((Kernel::VoidPtr)rdx);
- kcout << "syscall: exit.\r";
+ kcout << "syscall: Exit Fn.\r";
}
}
@@ -84,11 +119,11 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr
{
if (rcx <= (kSyscalls.Count() - 1))
{
- kcout << "kerncall: enter.\r";
+ kcout << "kerncall: Enter Fn.\r";
if (kKerncalls[rcx].fHooked)
(kKerncalls[rcx].fProc)((Kernel::VoidPtr)rdx);
- kcout << "kerncall: exit.\r";
+ kcout << "kerncall: Exit Fn.\r";
}
}
diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalHALComm.cxx
index 0d20d0b7..d19441c8 100644
--- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalHALComm.cxx
@@ -49,7 +49,7 @@ namespace Kernel::HAL
pg_set_used(i);
kcout << "Page has been allocated at index: " << number(i) << endl;
- return (VoidPtr)(i * cPageSz); // Return physical address of the page
+ return (VoidPtr)((UIntPtr)kKernelPageStart + (i * cPageSz)); // Return physical address of the page
}
}
@@ -90,58 +90,65 @@ namespace Kernel::HAL
const auto cIndexAlign = kPageAlign;
// Now get pml4_entry
- volatile UIntPtr* pml4_entry = (volatile UInt64*)((pml4_base[pml4_index + cIndexAlign]));
+ volatile UIntPtr* pml4_entry = (volatile UInt64*)((pml4_base[pml4_index]));
if (!(*pml4_entry & eFlagsPresent))
{
auto pml_addr = MM::pg_allocate();
- *pml4_entry = (UIntPtr)pml_addr | eFlagsPresent | eFlagsRw;
+ *pml4_entry = (UIntPtr)pml_addr | (eFlagsPresent | eFlagsRw) & 0xFFF;
}
- volatile UIntPtr* pdpt_entry = (volatile UIntPtr*)(pml4_entry[pdpt_index + cIndexAlign]);
+ volatile UIntPtr* pdpt_entry = (volatile UIntPtr*)(pml4_entry[pdpt_index]);
if (!(*pdpt_entry & eFlagsPresent))
{
auto pdpt_addr = MM::pg_allocate();
- *pdpt_entry = (UIntPtr)pdpt_addr | eFlagsPresent | eFlagsRw;
+ *pdpt_entry = (UIntPtr)pdpt_addr | (eFlagsPresent | eFlagsRw) & 0xFFF;
}
- volatile UIntPtr* pd_entry = (volatile UIntPtr*)(pdpt_entry[pd_index + cIndexAlign]);
+ volatile UIntPtr* pd_entry = (volatile UIntPtr*)(pdpt_entry[pd_index]);
if (!(*pd_entry & eFlagsPresent))
{
auto pd_addr = MM::pg_allocate();
- *pd_entry = (UIntPtr)pd_addr | eFlagsPresent | eFlagsRw;
+ *pd_entry = (UIntPtr)pd_addr | (eFlagsPresent | eFlagsRw) & 0xFFF;
}
- volatile UIntPtr* pt_entry = (volatile UIntPtr*)(pd_entry[pt_index + cIndexAlign]);
+ volatile UIntPtr* pt_entry = (volatile UIntPtr*)(pd_entry[pd_index]);
- if (!(pt_entry[offset] & eFlagsPresent))
+ if (!(pt_entry[pt_index] & eFlagsPresent))
{
- PTE* frame = (PTE*)pt_entry[offset];
+ PTE* page_frame = (PTE*)pt_entry[pt_index];
- MM::pg_delete((VoidPtr)frame->PhysicalAddress);
+ if (page_frame->PhysicalAddress == 0)
+ {
+ auto pt_addr = MM::pg_allocate();
+ pt_entry[pt_index] = (UIntPtr)pt_addr | eFlagsPresent | (flags & 0xFFF);
+ }
+ else
+ {
+ pt_entry[pt_index] = page_frame->PhysicalAddress | eFlagsPresent | (flags & 0xFFF);
+ }
- auto pt_addr = MM::pg_allocate();
- pt_entry[offset] = (UIntPtr)pt_addr | eFlagsPresent | flags;
+ kcout << (page_frame->Present ? "Page Present." : "Page Not Present.") << endl;
+ kcout << (page_frame->Wr ? "Page W/R." : "Page Not W/R.") << endl;
+ kcout << (page_frame->User ? "Page User." : "Page Not User.") << endl;
- kcout << (frame->Present ? "Page Present." : "Page Not Present.") << endl;
- kcout << (frame->Rw ? "Page RW." : "Page Not RW.") << endl;
- kcout << (frame->User ? "Page User." : "Page Not User.") << endl;
+ kcout << "Physical Address: " << hex_number(page_frame->PhysicalAddress) << endl;
- kcout << "Physical Address: " << number(frame->PhysicalAddress) << endl;
+ hal_flush_tlb();
}
else
{
- PTE* frame = (PTE*)pt_entry[offset];
+ PTE* page_frame = (PTE*)pt_entry[pt_index];
- pt_entry[offset] = (UIntPtr)(frame->PhysicalAddress / cPageSz) | flags;
+ pt_entry[pt_index] = page_frame->PhysicalAddress | (flags & 0xFFF);
- kcout << (frame->Present ? "Page Present." : "Page Not Present.") << endl;
- kcout << (frame->Rw ? "Page RW." : "Page Not RW.") << endl;
- kcout << (frame->User ? "Page User." : "Page Not User.") << endl;
+ kcout << (page_frame->Present ? "Page Present." : "Page Not Present.") << endl;
+ kcout << (page_frame->Wr ? "Page W/R." : "Page Not W/R.") << endl;
+ kcout << (page_frame->User ? "Page User." : "Page Not User.") << endl;
- kcout << "Physical Address: " << number(frame->PhysicalAddress) << endl;
+ kcout << "Physical Address: " << hex_number(page_frame->PhysicalAddress) << endl;
}
rt_sti();
diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
index e2dec1f9..cdbb2d1f 100644
--- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
@@ -52,7 +52,7 @@ IntNormal 5
;; Invalid opcode interrupt
__ZKA_INT_6:
- cli
+ cld
push rax
@@ -61,14 +61,14 @@ __ZKA_INT_6:
pop rax
- sti
+ std
o64 iret
IntNormal 7
;; Invalid opcode interrupt
__ZKA_INT_8:
- cli
+ cld
push rax
@@ -77,7 +77,7 @@ __ZKA_INT_8:
pop rax
- sti
+ std
o64 iret
IntNormal 9
@@ -87,7 +87,7 @@ IntExp 11
IntExp 12
__ZKA_INT_13:
- cli
+ cld
push rax
@@ -96,11 +96,11 @@ __ZKA_INT_13:
pop rax
- sti
+ std
o64 iret
__ZKA_INT_14:
- cli
+ cld
push rax
@@ -109,7 +109,7 @@ __ZKA_INT_14:
pop rax
- sti
+ std
o64 iret
IntNormal 15
@@ -156,7 +156,7 @@ IntNormal 49
[extern hal_kernel_call_enter]
__ZKA_INT_50:
- cli
+ cld
push r8
push r9
@@ -171,11 +171,11 @@ __ZKA_INT_50:
pop r9
pop r8
- sti
+ std
o64 iret
__ZKA_INT_51:
- cli
+ cld
push rcx
push rdx
@@ -191,7 +191,7 @@ __ZKA_INT_51:
pop rdx
pop rcx
- sti
+ std
o64 iret
[extern hal_on_ap_startup]
@@ -209,9 +209,9 @@ SZ_32 equ 1 << 6
LONG_MODE equ 1 << 5
__ZKA_INT_52:
- cli
+ cld
jmp hal_on_ap_startup
- sti
+ std
ret
IntNormal 53
@@ -234,7 +234,7 @@ section .text
[global hal_load_gdt]
hal_load_gdt:
- cli
+ cld
lgdt [rcx]
@@ -254,7 +254,7 @@ hal_load_gdt:
extern hal_real_init
hal_reload_segments:
- sti
+ std
;; Write address of syscall handler.
mov rdx, [mp_system_call_handler]
@@ -308,9 +308,9 @@ mp_system_call_handler:
o64 sysret
hal_load_idt:
- cli
+ cld
lidt [rcx]
- sti
+ std
ret
section .data
diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
index bc2a94ce..4f9e8bac 100644
--- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
@@ -53,9 +53,6 @@ namespace Kernel::HAL
EXTERN void mp_get_cores(Kernel::voidPtr rsdPtr) noexcept;
} // namespace Kernel::HAL
-Kernel::Property cKernelVersion;
-Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser};
-
EXTERN_C Kernel::UInt8* mp_user_switch_proc;
EXTERN_C Kernel::UInt8* mp_user_switch_proc_stack_end;
EXTERN_C Kernel::VoidPtr mp_user_switch_proc_real;
@@ -84,7 +81,7 @@ EXTERN_C void hal_init_platform(
reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart));
// get physical address start.
- kKernelBitMpStart = reinterpret_cast<Kernel::VoidPtr>(
+ kKernelPageStart = reinterpret_cast<Kernel::VoidPtr>(
reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_PageStart));
STATIC CONST auto cEntriesCount = 6;
@@ -123,18 +120,10 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
- kcout << "Creating filesystem and such.\r";
-
auto fs = Kernel::mm_new_class<Kernel::NeFileSystemMgr>();
- MUST_PASS(fs);
-
Kernel::NeFileSystemMgr::Mount(fs);
- const auto cPassword = "ZKA_KERNEL_AUTHORITY";
-
- cUserSuper.TrySave(cPassword);
-
ke_dll_entrypoint();
Kernel::ke_stop(RUNTIME_CHECK_FAILED);
diff --git a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx b/dev/ZKA/HALKit/AMD64/Paging.hxx
index ecf739a3..23ac68e1 100644
--- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx
+++ b/dev/ZKA/HALKit/AMD64/Paging.hxx
@@ -23,7 +23,7 @@
#endif //! kPageAlign
#ifndef kPageSize
-#define kPageSize (0x200)
+#define kPageSize (0x100)
#endif // !kPageSize
#ifndef kAlign
@@ -41,23 +41,40 @@ EXTERN_C Kernel::VoidPtr hal_read_cr3(); // @brief Page table.
namespace Kernel::HAL
{
+
+ struct PACKED ZKA_PTE_GENERIC
+ {
+ Bool Present : 1;
+ Bool Wr : 1;
+ Bool User : 1;
+ Bool Wt : 1;
+ Int32 Dirty : 1;
+ Int32 MemoryType : 1;
+ Int32 Global : 1;
+ Int32 Resvered_0 : 3;
+ UInt64 PhysicalAddress : 36;
+ Int32 Reserved_1 : 10;
+ Bool ProtectionKey : 5;
+ Bool ExecDisable : 1;
+ };
+
+ /// @brief Final page entry (Not PML, PDPT)
struct PACKED ZKA_PTE final
{
- UInt8 Present : 1;
- UInt8 Rw : 1;
- UInt8 User : 1;
- UInt8 Wt : 1;
- UInt8 Cache : 1;
- UInt8 Accessed : 1;
- UInt8 Dirty : 1;
- UInt8 PageSize : 1;
- UInt8 Global : 1;
- UInt8 Available : 3;
- UInt32 PhysicalAddress : 20;
- UInt8 Reserved : 6;
- UInt8 ProtectionKey : 1;
- UInt8 ExecDisable : 1;
- UInt8 ReservedEx : 3;
+ Bool Present : 1;
+ Bool Wr : 1;
+ Bool User : 1;
+ Bool Wt : 1;
+ Bool Cache : 1;
+ Bool Accessed : 1;
+ Int32 Dirty : 1;
+ Int32 MemoryType : 1;
+ Int32 Global : 1;
+ Int32 Resvered_0 : 3;
+ UInt64 PhysicalAddress : 36;
+ Int32 Reserved_1 : 10;
+ Bool ProtectionKey : 5;
+ Bool ExecDisable : 1;
};
namespace Detail
@@ -85,7 +102,7 @@ namespace Kernel::HAL
struct ALIGN(0x08) ZKA_PDE final
{
- ZKA_PTE ALIGN(kPageAlign) Pte[kPageMax];
+ ZKA_PTE ALIGN(kPageAlign) fEntries[kPageMax];
};
auto mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size) -> VoidPtr;
diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx
index 7da1adea..42f4e287 100644
--- a/dev/ZKA/HALKit/AMD64/Processor.hxx
+++ b/dev/ZKA/HALKit/AMD64/Processor.hxx
@@ -17,7 +17,7 @@
#include <NewKit/Defines.hxx>
#include <NewKit/Utils.hxx>
#include <FirmwareKit/Handover.hxx>
-#include <HALKit/AMD64/HalPageAlloc.hxx>
+#include <HALKit/AMD64/Paging.hxx>
EXTERN_C
{
@@ -27,11 +27,6 @@ EXTERN_C
#define IsActiveLow(FLG) (FLG & 2)
#define IsLevelTriggered(FLG) (FLG & 8)
-#define cPageSz kPageSize // 4KB pages
-#define cTotalPgMem mib_cast(16) // 16MB total memory
-#define cTotalPages (cTotalPgMem / cPageSz) // Total number of pages
-#define cBmpPgSz (cTotalPages / 8) // 1 bit per page in the bitmap
-
#define kInterruptGate (0x8E)
#define kTrapGate (0xEF)
#define kTaskGate (0b10001100)
@@ -45,12 +40,11 @@ namespace Kernel
{
UInt16 OffsetLow; // offset bits 0..15
UInt16 Selector; // a code segment selector in GDT or LDT
- UInt8
- Ist; // bits 0..2 holds Interrupt Stack Table offset, rest of bits zero.
- UInt8 TypeAttributes; // gate type, dpl, and p fields
- UInt16 OffsetMid; // offset bits 16..31
- UInt32 OffsetHigh; // offset bits 32..63
- UInt32 Zero; // reserved
+ UInt8 Ist;
+ UInt8 TypeAttributes;
+ UInt16 OffsetMid;
+ UInt32 OffsetHigh;
+ UInt32 Zero; // reserved
};
} // namespace Detail::AMD64
} // namespace Kernel
@@ -60,9 +54,9 @@ namespace Kernel::HAL
/// @brief Virtual memory flags.
enum
{
- eFlagsPresent = 1,
- eFlagsRw = 2,
- eFlagsUser = 4,
+ eFlagsPresent = 0x1,
+ eFlagsRw = 0x2,
+ eFlagsUser = 0x4,
eFlagsCount = 3,
};
@@ -299,6 +293,6 @@ EXTERN_C Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr);
#define kKernelInterruptId 0x32
inline Kernel::VoidPtr kKernelVirtualStart = nullptr;
-inline Kernel::UIntPtr kKernelBitMpSize = 0UL;
+inline Kernel::UIntPtr kKernelBitMpSize = 0UL;
-inline Kernel::VoidPtr kKernelBitMpStart = nullptr;
+inline Kernel::VoidPtr kKernelPageStart = nullptr;
diff --git a/dev/ZKA/HALKit/AMD64/Storage/AHCI.cxx b/dev/ZKA/HALKit/AMD64/Storage/AHCI.cxx
index 7eaa5bbb..9fcab945 100644
--- a/dev/ZKA/HALKit/AMD64/Storage/AHCI.cxx
+++ b/dev/ZKA/HALKit/AMD64/Storage/AHCI.cxx
@@ -110,13 +110,13 @@ Kernel::Void drv_std_write(Kernel::UInt64 Lba, Kernel::Char* Buf, Kernel::SizeT
/***
@brief Getter, gets the number of sectors inside the drive.
*/
-Kernel::SizeT drv_std_get_sector_count()
+Kernel::SizeT drv_get_sector_count()
{
return 0;
}
/// @brief Get the drive size.
-Kernel::SizeT drv_std_get_drv_size()
+Kernel::SizeT drv_get_size()
{
return 0;
}
diff --git a/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx b/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx
index bc1a1f22..aa72ad56 100644
--- a/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx
+++ b/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx
@@ -185,15 +185,15 @@ Boolean drv_std_detected(Void)
/***
@brief Getter, gets the number of sectors inside the drive.
*/
-Kernel::SizeT drv_std_get_sector_count()
+Kernel::SizeT drv_get_sector_count()
{
return (kATAData[61] << 16) | kATAData[60];
}
/// @brief Get the drive size.
-Kernel::SizeT drv_std_get_drv_size()
+Kernel::SizeT drv_get_size()
{
- return drv_std_get_sector_count() * kATASectorSize;
+ return drv_get_sector_count() * kATASectorSize;
}
#endif /* ifdef __ATA_PIO__ */
diff --git a/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx b/dev/ZKA/HALKit/ARM64/Paging.hxx
index 6cfeacf3..6cfeacf3 100644
--- a/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx
+++ b/dev/ZKA/HALKit/ARM64/Paging.hxx
diff --git a/dev/ZKA/HALKit/ARM64/Processor.hxx b/dev/ZKA/HALKit/ARM64/Processor.hxx
index dfba0293..4c46f294 100644
--- a/dev/ZKA/HALKit/ARM64/Processor.hxx
+++ b/dev/ZKA/HALKit/ARM64/Processor.hxx
@@ -47,4 +47,4 @@ inline Kernel::UIntPtr kKernelBitMpSize = 0UL;
inline Kernel::VoidPtr kKernelPhysicalStart = nullptr;
-#include <HALKit/ARM64/HalPageAlloc.hxx>
+#include <HALKit/ARM64/Paging.hxx>
diff --git a/dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx b/dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx
index f1f6c718..a479da93 100644
--- a/dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx
+++ b/dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx
@@ -32,7 +32,7 @@ namespace Kernel
/// @brief get sector count.
/// @return drive sector count.
- SizeT drv_std_get_sector_count(Int32 slot)
+ SizeT drv_get_sector_count(Int32 slot)
{
if (slot > cMaxFlash)
return 0;
@@ -42,7 +42,7 @@ namespace Kernel
/// @brief get device size.
/// @return drive size
- SizeT drv_std_get_drv_size(Int32 slot)
+ SizeT drv_get_size(Int32 slot)
{
if (slot > cMaxFlash)
return 0;
diff --git a/dev/ZKA/KernelKit/DebugOutput.hxx b/dev/ZKA/KernelKit/DebugOutput.hxx
index 70f920d1..0ee04ae0 100644
--- a/dev/ZKA/KernelKit/DebugOutput.hxx
+++ b/dev/ZKA/KernelKit/DebugOutput.hxx
@@ -84,7 +84,7 @@ namespace Kernel
inline TerminalDevice bell()
{
TerminalDevice selfTerm = TerminalDevice::The();
-
+
selfTerm.operator<<("\a");
return selfTerm;
}
@@ -152,8 +152,8 @@ namespace Kernel
{
TerminalDevice selfTerm = TerminalDevice::The();
- selfTerm.operator<<("0x");
Detail::_write_number_hex(x, selfTerm);
+ selfTerm.operator<<("h");
return selfTerm;
}
diff --git a/dev/ZKA/KernelKit/DriveMgr.hxx b/dev/ZKA/KernelKit/DriveMgr.hxx
index 8cec098c..55c4912d 100644
--- a/dev/ZKA/KernelKit/DriveMgr.hxx
+++ b/dev/ZKA/KernelKit/DriveMgr.hxx
@@ -20,7 +20,7 @@
#define kDriveInvalidID (-1)
#define kDriveNameLen (32)
-#define drv_get_sector_count(SIZE, SECTOR_SZ) (((SIZE) + (SECTOR_SZ)) / (SECTOR_SZ))
+#define DrvSectorCnt(SIZE, SECTOR_SZ) (((SIZE) + (SECTOR_SZ)) / (SECTOR_SZ))
namespace Kernel
{
diff --git a/dev/ZKA/Modules/AHCI/AHCI.hxx b/dev/ZKA/Modules/AHCI/AHCI.hxx
index abf31187..e588ec25 100644
--- a/dev/ZKA/Modules/AHCI/AHCI.hxx
+++ b/dev/ZKA/Modules/AHCI/AHCI.hxx
@@ -356,15 +356,15 @@ Kernel::Void drv_std_read(Kernel::UInt64 Lba, Kernel::Char* Buf, Kernel::SizeT S
Kernel::Void drv_std_write(Kernel::UInt64 Lba, Kernel::Char* Buf, Kernel::SizeT SectorSz, Kernel::SizeT Size);
/// @brief get sector count.
-Kernel::SizeT drv_std_get_sector_count();
+Kernel::SizeT drv_get_sector_count();
/// @brief get device size.
-Kernel::SizeT drv_std_get_drv_size();
+Kernel::SizeT drv_get_size();
/// @brief get sector count.
-Kernel::SizeT drv_std_get_sector_count();
+Kernel::SizeT drv_get_sector_count();
/// @brief get device size.
-Kernel::SizeT drv_std_get_drv_size();
+Kernel::SizeT drv_get_size();
#endif // ifdef __NEWOSKRNL__
diff --git a/dev/ZKA/Modules/ATA/ATA.hxx b/dev/ZKA/Modules/ATA/ATA.hxx
index 81705712..f550ddc6 100644
--- a/dev/ZKA/Modules/ATA/ATA.hxx
+++ b/dev/ZKA/Modules/ATA/ATA.hxx
@@ -147,10 +147,10 @@ Kernel::Void drv_std_read(Kernel::UInt64 Lba, Kernel::UInt16 IO, Kernel::UInt8 M
Kernel::Void drv_std_write(Kernel::UInt64 Lba, Kernel::UInt16 IO, Kernel::UInt8 Master, Kernel::Char* Buf, Kernel::SizeT SectorSz, Kernel::SizeT Size);
/// @brief get sector count.
-Kernel::SizeT drv_std_get_sector_count();
+Kernel::SizeT drv_get_sector_count();
/// @brief get device size.
-Kernel::SizeT drv_std_get_drv_size();
+Kernel::SizeT drv_get_size();
#endif // ifdef __NEWOSKRNL__
#endif // ifndef __ATA_PIO__ || __AHCI__
diff --git a/dev/ZKA/Modules/Flash/Flash.hxx b/dev/ZKA/Modules/Flash/Flash.hxx
index a16f5a6d..ccea5a9a 100644
--- a/dev/ZKA/Modules/Flash/Flash.hxx
+++ b/dev/ZKA/Modules/Flash/Flash.hxx
@@ -12,10 +12,10 @@
/// @brief get sector count.
/// @return drive sector count.
-Kernel::SizeT drv_std_get_sector_count();
+Kernel::SizeT drv_get_sector_count();
/// @brief get device size.
/// @return drive size
-Kernel::SizeT drv_std_get_drv_size();
+Kernel::SizeT drv_get_size();
#endif // ifdef __USE_MBCI_FLASH__
diff --git a/dev/ZKA/Sources/ExeMain.cxx b/dev/ZKA/Sources/ExeMain.cxx
index 44dedfd7..a3fdfaa0 100644
--- a/dev/ZKA/Sources/ExeMain.cxx
+++ b/dev/ZKA/Sources/ExeMain.cxx
@@ -58,7 +58,7 @@ namespace Kernel::Detail
else
{
// Mounts a NeFS from main drive.
- fNeFS = new Kernel::NeFileSystemMgr();
+ fNeFS = Kernel::mm_new_class<Kernel::NeFileSystemMgr>();
Kernel::IFilesystemMgr::Mount(fNeFS);
diff --git a/dev/ZKA/Sources/FS/NeFS.cxx b/dev/ZKA/Sources/FS/NeFS.cxx
index ad4dd031..9c33b78c 100644
--- a/dev/ZKA/Sources/FS/NeFS.cxx
+++ b/dev/ZKA/Sources/FS/NeFS.cxx
@@ -31,12 +31,12 @@ using namespace Kernel;
/***********************************************************************************/
/// @brief get sector count.
/***********************************************************************************/
-Kernel::SizeT drv_std_get_sector_count();
+Kernel::SizeT drv_get_sector_count();
/***********************************************************************************/
/// @brief get device size.
/***********************************************************************************/
-Kernel::SizeT drv_std_get_drv_size();
+Kernel::SizeT drv_get_size();
#endif
@@ -583,8 +583,8 @@ bool NeFSParser::Format(_Input _Output DriveTrait* drive, _Input const Lba endLb
SizeT catalogCount = 0UL;
- SizeT sectorCount = drv_std_get_sector_count();
- SizeT diskSize = drv_std_get_drv_size();
+ SizeT sectorCount = drv_get_sector_count();
+ SizeT diskSize = drv_get_size();
partBlock->Kind = kNeFSPartitionTypeStandard;
partBlock->StartCatalog = kNeFSCatalogStartAddress;
diff --git a/dev/ZKA/Sources/Heap.cxx b/dev/ZKA/Sources/Heap.cxx
index cd46a80b..b415911d 100644
--- a/dev/ZKA/Sources/Heap.cxx
+++ b/dev/ZKA/Sources/Heap.cxx
@@ -14,11 +14,10 @@
//! @brief Kernel heap allocator.
#define kKernelHeapMagic (0xD4D7D5)
-#define kKernelHeapHeaderPaddingSz (16U)
+#define kKernelHeapHeaderPaddingSz (__BIGGEST_ALIGNMENT__)
namespace Kernel
{
- SizeT kHeapCount = 0UL;
PageMgr kHeapPageMgr;
Bool kHeapLock = No;
@@ -115,8 +114,6 @@ namespace Kernel
heap_info_ptr->fUser = user;
heap_info_ptr->fPresent = Yes;
- ++kHeapCount;
-
auto result = reinterpret_cast<VoidPtr>(heap_info_ptr->fHeapPtr);
kLatestAllocation = heap_info_ptr;
@@ -131,8 +128,6 @@ namespace Kernel
/// @return
Int32 mm_make_ke_page(VoidPtr heap_ptr)
{
- if (kHeapCount < 1)
- return -kErrorInternal;
if (((IntPtr)heap_ptr - sizeof(Detail::HEAP_INFORMATION_BLOCK)) <= 0)
return -kErrorInternal;
if (((IntPtr)heap_ptr - kInvalidAddress) < 0)
@@ -156,9 +151,6 @@ namespace Kernel
/// @return
Int32 mm_delete_ke_heap(VoidPtr heap_ptr)
{
- if (kHeapCount < 1)
- return -kErrorInternal;
-
if (!heap_ptr)
return -kErrorInvalidData;
@@ -203,8 +195,6 @@ namespace Kernel
kHeapPageMgr.Free(pteAddress);
- --kHeapCount;
-
Detail::mm_alloc_fini_timeout();
return 0;
@@ -218,9 +208,6 @@ namespace Kernel
/// @return if it exists.
Boolean mm_is_valid_heap(VoidPtr heap_ptr)
{
- if (kHeapCount < 1)
- return false;
-
if (heap_ptr)
{
Detail::HEAP_INFORMATION_BLOCK_PTR virtualAddress =
diff --git a/dev/ZKA/Sources/PageMgr.cxx b/dev/ZKA/Sources/PageMgr.cxx
index 78b279f3..3eefe491 100644
--- a/dev/ZKA/Sources/PageMgr.cxx
+++ b/dev/ZKA/Sources/PageMgr.cxx
@@ -8,9 +8,9 @@
#include <NewKit/PageMgr.hxx>
#ifdef __ZKA_AMD64__
-#include <HALKit/AMD64/HalPageAlloc.hxx>
+#include <HALKit/AMD64/Paging.hxx>
#elif defined(__ZKA_ARM64__)
-#include <HALKit/ARM64/HalPageAlloc.hxx>
+#include <HALKit/ARM64/Paging.hxx>
#endif // ifdef __ZKA_AMD64__ || defined(__ZKA_ARM64__)
//! null deref will throw (Page Zero detected, aborting app!)
diff --git a/dev/ZKA/amd64-efi.make b/dev/ZKA/amd64-efi.make
index ad6d799b..29ff4d32 100644
--- a/dev/ZKA/amd64-efi.make
+++ b/dev/ZKA/amd64-efi.make
@@ -5,7 +5,7 @@
CC = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -fshort-wchar -c -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \
+CCFLAGS = -fshort-wchar -c -D__ZKA_AMD64__ -O0 -mno-red-zone -fno-rtti -fno-exceptions \
-std=c++20 -D__ZKA_SUPPORT_NX__ -I../Vendor -D__FSKIT_USE_NEFS__ \
-D__NEWOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA__ -I./ -I../ -I../ZBA