diff options
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 |
