From 408f58b0ef54f49d894023d6753f8d27d0bfd46d Mon Sep 17 00:00:00 2001 From: Amlal Date: Tue, 10 Sep 2024 18:42:15 +0200 Subject: [ IMP ] Repository bump. Signed-off-by: Amlal --- dev/ZBA/Sources/HEL/AMD64/BootMain.cxx | 7 +- dev/ZBA/Sources/HEL/AMD64/BootTextWriter.cxx | 10 +- dev/ZKA/ArchKit/ArchKit.hxx | 2 +- dev/ZKA/FirmwareKit/Handover.hxx | 3 +- dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx | 42 ++-- dev/ZKA/HALKit/AMD64/HalControlRegister.s | 14 +- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx | 43 +++- dev/ZKA/HALKit/AMD64/HalHALComm.cxx | 239 +++++++++++++++++++++ dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm | 36 ++-- dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 13 +- dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx | 99 --------- dev/ZKA/HALKit/AMD64/HalProcessor.cxx | 232 -------------------- dev/ZKA/HALKit/AMD64/Paging.hxx | 116 ++++++++++ dev/ZKA/HALKit/AMD64/Processor.hxx | 28 +-- dev/ZKA/HALKit/AMD64/Storage/AHCI.cxx | 4 +- dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx | 6 +- dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx | 108 ---------- dev/ZKA/HALKit/ARM64/Paging.hxx | 108 ++++++++++ dev/ZKA/HALKit/ARM64/Processor.hxx | 2 +- dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx | 4 +- dev/ZKA/KernelKit/DebugOutput.hxx | 4 +- dev/ZKA/KernelKit/DriveMgr.hxx | 2 +- dev/ZKA/Modules/AHCI/AHCI.hxx | 8 +- dev/ZKA/Modules/ATA/ATA.hxx | 4 +- dev/ZKA/Modules/Flash/Flash.hxx | 4 +- dev/ZKA/Sources/ExeMain.cxx | 2 +- dev/ZKA/Sources/FS/NeFS.cxx | 8 +- dev/ZKA/Sources/Heap.cxx | 15 +- dev/ZKA/Sources/PageMgr.cxx | 4 +- dev/ZKA/amd64-efi.make | 2 +- 30 files changed, 598 insertions(+), 571 deletions(-) create mode 100644 dev/ZKA/HALKit/AMD64/HalHALComm.cxx delete mode 100644 dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx delete mode 100644 dev/ZKA/HALKit/AMD64/HalProcessor.cxx create mode 100644 dev/ZKA/HALKit/AMD64/Paging.hxx delete mode 100644 dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx create mode 100644 dev/ZKA/HALKit/ARM64/Paging.hxx (limited to 'dev') 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 #ifdef __ZKA_AMD64__ -#include +#include #include #include #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 +#include #elif defined(__ZKA_ARM64__) -#include +#include #endif #include @@ -35,6 +35,8 @@ namespace Kernel { UIntPtr* ptr_bit_set = reinterpret_cast(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(reinterpret_cast(base_ptr) + (ptr_bit_set[0] != cBitMpMagic ? size : ptr_bit_set[1])); if (reinterpret_cast(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 #include +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/HalHALComm.cxx b/dev/ZKA/HALKit/AMD64/HalHALComm.cxx new file mode 100644 index 00000000..d19441c8 --- /dev/null +++ b/dev/ZKA/HALKit/AMD64/HalHALComm.cxx @@ -0,0 +1,239 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + File: HalProcessor.cxx + Purpose: Platform processor routines. + +------------------------------------------- */ + +#include + +/** + * @file HalProcessorMgr.cxx + * @brief CPU Processor managers. + */ + +#define cPageSz kPageSize // 4KB pages +#define cTotalPgMem gib_cast(16) // 16MB total memory +#define cTotalPages (cTotalPgMem / cPageSz) // Total number of pages +#define cBmpPgSz (cTotalPages / 8) // 1 bit per page in the bitmap + +namespace Kernel::HAL +{ + namespace MM + { + UInt8 cPageBitMp[cBmpPgSz] = {0}; // Bitmap to track free/used pages + + Void pg_set_used(Int64 page_index) + { + cPageBitMp[page_index / 8] |= (1 << (page_index % 8)); + } + + Void pg_set_free(Int64 page_index) + { + cPageBitMp[page_index / 8] &= ~(1 << (page_index % 8)); + } + + Int32 pg_is_free(Int64 page_index) + { + return !(cPageBitMp[page_index / 8] & (1 << (page_index % 8))); + } + + VoidPtr pg_allocate() + { + for (SizeT i = 0; i < cTotalPages; i++) + { + if (pg_is_free(i)) + { + pg_set_used(i); + kcout << "Page has been allocated at index: " << number(i) << endl; + + return (VoidPtr)((UIntPtr)kKernelPageStart + (i * cPageSz)); // Return physical address of the page + } + } + + return nullptr; // No free page found + } + + Void pg_delete(void* addr) + { + Int64 page_index = (UIntPtr)addr / cPageSz; + kcout << "Page has been freed at: " << number(page_index) << endl; + + pg_set_free(page_index); + } + + } // namespace MM + + /// @brief Maps or allocates a page from virt_addr. + /// @param virt_addr a valid virtual address. + /// @param phys_addr point to physical address. + /// @param flags the flags to put on the page. + /// @return Status code of page manip. + EXTERN_C Int32 mm_map_page(VoidPtr p_virt_addr, UInt32 flags) + { + rt_cli(); + + const auto cPageMask = 0xFFFF; + + volatile UIntPtr* pml4_base = (volatile UIntPtr*)(hal_read_cr3()); + + UIntPtr virt_addr = (UIntPtr)p_virt_addr; + + UInt16 pml4_index = (virt_addr >> 39) & 0x1FF; + UInt16 pdpt_index = (virt_addr >> 30) & 0x1FF; + UInt16 pd_index = (virt_addr >> 21) & 0x1FF; + UInt16 pt_index = (virt_addr >> 12) & 0x1FF; + UInt16 offset = virt_addr & 0xFFF; + + const auto cIndexAlign = kPageAlign; + + // Now get pml4_entry + 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) & 0xFFF; + } + + 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) & 0xFFF; + } + + 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) & 0xFFF; + } + + volatile UIntPtr* pt_entry = (volatile UIntPtr*)(pd_entry[pd_index]); + + if (!(pt_entry[pt_index] & eFlagsPresent)) + { + PTE* page_frame = (PTE*)pt_entry[pt_index]; + + 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); + } + + 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: " << hex_number(page_frame->PhysicalAddress) << endl; + + hal_flush_tlb(); + } + else + { + PTE* page_frame = (PTE*)pt_entry[pt_index]; + + pt_entry[pt_index] = page_frame->PhysicalAddress | (flags & 0xFFF); + + 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: " << hex_number(page_frame->PhysicalAddress) << endl; + } + + rt_sti(); + return 0; + } + + Void Out8(UInt16 port, UInt8 value) + { + asm volatile("outb %%al, %1" + : + : "a"(value), "Nd"(port) + : "memory"); + } + + Void Out16(UInt16 port, UInt16 value) + { + asm volatile("outw %%ax, %1" + : + : "a"(value), "Nd"(port) + : "memory"); + } + + Void Out32(UInt16 port, UInt32 value) + { + asm volatile("outl %%eax, %1" + : + : "a"(value), "Nd"(port) + : "memory"); + } + + UInt8 In8(UInt16 port) + { + UInt8 value = 0UL; + asm volatile("inb %1, %%al" + : "=a"(value) + : "Nd"(port) + : "memory"); + + return value; + } + + UInt16 In16(UInt16 port) + { + UInt16 value = 0UL; + asm volatile("inw %1, %%ax" + : "=a"(value) + : "Nd"(port) + : "memory"); + + return value; + } + + UInt32 In32(UInt16 port) + { + UInt32 value = 0UL; + asm volatile("inl %1, %%eax" + : "=a"(value) + : "Nd"(port) + : "memory"); + + return value; + } + + Void rt_halt() + { + asm volatile("hlt"); + } + + Void rt_cli() + { + asm volatile("cli"); + } + + Void rt_sti() + { + asm volatile("sti"); + } + + Void rt_cld() + { + asm volatile("cld"); + } + + Void rt_std() + { + asm volatile("std"); + } +} // namespace Kernel::HAL 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(kHandoverHeader->f_BitMapStart)); // get physical address start. - kKernelBitMpStart = reinterpret_cast( + kKernelPageStart = reinterpret_cast( reinterpret_cast(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(); - 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/HalPageAlloc.hxx deleted file mode 100644 index ecf739a3..00000000 --- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx +++ /dev/null @@ -1,99 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies. - -------------------------------------------- */ - -#pragma once - -/** --------------------------------------------------- - - * THIS FILE CONTAINS CODE FOR X86_64 PAGING. - -------------------------------------------------------- */ - -#include - -#ifndef kPageMax -#define kPageMax (0x200) -#endif //! kPageMax - -#ifndef kPageAlign -#define kPageAlign (0x1000) -#endif //! kPageAlign - -#ifndef kPageSize -#define kPageSize (0x200) -#endif // !kPageSize - -#ifndef kAlign -#define kAlign __BIGGEST_ALIGNMENT__ -#endif // !kAlign - -EXTERN_C void hal_flush_tlb(); -EXTERN_C void hal_invl_tlb(Kernel::VoidPtr addr); -EXTERN_C void hal_write_cr3(Kernel::VoidPtr cr3); -EXTERN_C void hal_write_cr0(Kernel::VoidPtr bit); - -EXTERN_C Kernel::VoidPtr hal_read_cr0(); // @brief CPU control register. -EXTERN_C Kernel::VoidPtr hal_read_cr2(); // @brief Fault address. -EXTERN_C Kernel::VoidPtr hal_read_cr3(); // @brief Page table. - -namespace Kernel::HAL -{ - 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; - }; - - namespace Detail - { - enum class ControlRegisterBits - { - ProtectedModeEnable = 0, - MonitorCoProcessor = 1, - Emulation = 2, - TaskSwitched = 3, - ExtensionType = 4, - NumericError = 5, - WriteProtect = 16, - AlignementMask = 18, - NotWriteThrough = 29, - CacheDisable = 30, - PageEnable = 31, - }; - - inline UInt8 control_register_cast(ControlRegisterBits reg) - { - return static_cast(reg); - } - } // namespace Detail - - struct ALIGN(0x08) ZKA_PDE final - { - ZKA_PTE ALIGN(kPageAlign) Pte[kPageMax]; - }; - - auto mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size) -> VoidPtr; - auto mm_free_bitmap(VoidPtr page_ptr) -> Bool; -} // namespace Kernel::HAL - -namespace Kernel -{ - typedef HAL::ZKA_PTE PTE; - typedef HAL::ZKA_PDE PDE; -} // namespace Kernel diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx deleted file mode 100644 index 0d20d0b7..00000000 --- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx +++ /dev/null @@ -1,232 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies. - - File: HalProcessor.cxx - Purpose: Platform processor routines. - -------------------------------------------- */ - -#include - -/** - * @file HalProcessorMgr.cxx - * @brief CPU Processor managers. - */ - -#define cPageSz kPageSize // 4KB pages -#define cTotalPgMem gib_cast(16) // 16MB total memory -#define cTotalPages (cTotalPgMem / cPageSz) // Total number of pages -#define cBmpPgSz (cTotalPages / 8) // 1 bit per page in the bitmap - -namespace Kernel::HAL -{ - namespace MM - { - UInt8 cPageBitMp[cBmpPgSz] = {0}; // Bitmap to track free/used pages - - Void pg_set_used(Int64 page_index) - { - cPageBitMp[page_index / 8] |= (1 << (page_index % 8)); - } - - Void pg_set_free(Int64 page_index) - { - cPageBitMp[page_index / 8] &= ~(1 << (page_index % 8)); - } - - Int32 pg_is_free(Int64 page_index) - { - return !(cPageBitMp[page_index / 8] & (1 << (page_index % 8))); - } - - VoidPtr pg_allocate() - { - for (SizeT i = 0; i < cTotalPages; i++) - { - if (pg_is_free(i)) - { - 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 nullptr; // No free page found - } - - Void pg_delete(void* addr) - { - Int64 page_index = (UIntPtr)addr / cPageSz; - kcout << "Page has been freed at: " << number(page_index) << endl; - - pg_set_free(page_index); - } - - } // namespace MM - - /// @brief Maps or allocates a page from virt_addr. - /// @param virt_addr a valid virtual address. - /// @param phys_addr point to physical address. - /// @param flags the flags to put on the page. - /// @return Status code of page manip. - EXTERN_C Int32 mm_map_page(VoidPtr p_virt_addr, UInt32 flags) - { - rt_cli(); - - const auto cPageMask = 0xFFFF; - - volatile UIntPtr* pml4_base = (volatile UIntPtr*)(hal_read_cr3()); - - UIntPtr virt_addr = (UIntPtr)p_virt_addr; - - UInt16 pml4_index = (virt_addr >> 39) & 0x1FF; - UInt16 pdpt_index = (virt_addr >> 30) & 0x1FF; - UInt16 pd_index = (virt_addr >> 21) & 0x1FF; - UInt16 pt_index = (virt_addr >> 12) & 0x1FF; - UInt16 offset = virt_addr & 0xFFF; - - const auto cIndexAlign = kPageAlign; - - // Now get pml4_entry - volatile UIntPtr* pml4_entry = (volatile UInt64*)((pml4_base[pml4_index + cIndexAlign])); - - if (!(*pml4_entry & eFlagsPresent)) - { - auto pml_addr = MM::pg_allocate(); - *pml4_entry = (UIntPtr)pml_addr | eFlagsPresent | eFlagsRw; - } - - volatile UIntPtr* pdpt_entry = (volatile UIntPtr*)(pml4_entry[pdpt_index + cIndexAlign]); - - if (!(*pdpt_entry & eFlagsPresent)) - { - auto pdpt_addr = MM::pg_allocate(); - *pdpt_entry = (UIntPtr)pdpt_addr | eFlagsPresent | eFlagsRw; - } - - volatile UIntPtr* pd_entry = (volatile UIntPtr*)(pdpt_entry[pd_index + cIndexAlign]); - - if (!(*pd_entry & eFlagsPresent)) - { - auto pd_addr = MM::pg_allocate(); - *pd_entry = (UIntPtr)pd_addr | eFlagsPresent | eFlagsRw; - } - - volatile UIntPtr* pt_entry = (volatile UIntPtr*)(pd_entry[pt_index + cIndexAlign]); - - if (!(pt_entry[offset] & eFlagsPresent)) - { - PTE* frame = (PTE*)pt_entry[offset]; - - MM::pg_delete((VoidPtr)frame->PhysicalAddress); - - auto pt_addr = MM::pg_allocate(); - pt_entry[offset] = (UIntPtr)pt_addr | eFlagsPresent | flags; - - 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: " << number(frame->PhysicalAddress) << endl; - } - else - { - PTE* frame = (PTE*)pt_entry[offset]; - - pt_entry[offset] = (UIntPtr)(frame->PhysicalAddress / cPageSz) | flags; - - 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: " << number(frame->PhysicalAddress) << endl; - } - - rt_sti(); - return 0; - } - - Void Out8(UInt16 port, UInt8 value) - { - asm volatile("outb %%al, %1" - : - : "a"(value), "Nd"(port) - : "memory"); - } - - Void Out16(UInt16 port, UInt16 value) - { - asm volatile("outw %%ax, %1" - : - : "a"(value), "Nd"(port) - : "memory"); - } - - Void Out32(UInt16 port, UInt32 value) - { - asm volatile("outl %%eax, %1" - : - : "a"(value), "Nd"(port) - : "memory"); - } - - UInt8 In8(UInt16 port) - { - UInt8 value = 0UL; - asm volatile("inb %1, %%al" - : "=a"(value) - : "Nd"(port) - : "memory"); - - return value; - } - - UInt16 In16(UInt16 port) - { - UInt16 value = 0UL; - asm volatile("inw %1, %%ax" - : "=a"(value) - : "Nd"(port) - : "memory"); - - return value; - } - - UInt32 In32(UInt16 port) - { - UInt32 value = 0UL; - asm volatile("inl %1, %%eax" - : "=a"(value) - : "Nd"(port) - : "memory"); - - return value; - } - - Void rt_halt() - { - asm volatile("hlt"); - } - - Void rt_cli() - { - asm volatile("cli"); - } - - Void rt_sti() - { - asm volatile("sti"); - } - - Void rt_cld() - { - asm volatile("cld"); - } - - Void rt_std() - { - asm volatile("std"); - } -} // namespace Kernel::HAL diff --git a/dev/ZKA/HALKit/AMD64/Paging.hxx b/dev/ZKA/HALKit/AMD64/Paging.hxx new file mode 100644 index 00000000..23ac68e1 --- /dev/null +++ b/dev/ZKA/HALKit/AMD64/Paging.hxx @@ -0,0 +1,116 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + +------------------------------------------- */ + +#pragma once + +/** --------------------------------------------------- + + * THIS FILE CONTAINS CODE FOR X86_64 PAGING. + +------------------------------------------------------- */ + +#include + +#ifndef kPageMax +#define kPageMax (0x200) +#endif //! kPageMax + +#ifndef kPageAlign +#define kPageAlign (0x1000) +#endif //! kPageAlign + +#ifndef kPageSize +#define kPageSize (0x100) +#endif // !kPageSize + +#ifndef kAlign +#define kAlign __BIGGEST_ALIGNMENT__ +#endif // !kAlign + +EXTERN_C void hal_flush_tlb(); +EXTERN_C void hal_invl_tlb(Kernel::VoidPtr addr); +EXTERN_C void hal_write_cr3(Kernel::VoidPtr cr3); +EXTERN_C void hal_write_cr0(Kernel::VoidPtr bit); + +EXTERN_C Kernel::VoidPtr hal_read_cr0(); // @brief CPU control register. +EXTERN_C Kernel::VoidPtr hal_read_cr2(); // @brief Fault address. +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 + { + 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 + { + enum class ControlRegisterBits + { + ProtectedModeEnable = 0, + MonitorCoProcessor = 1, + Emulation = 2, + TaskSwitched = 3, + ExtensionType = 4, + NumericError = 5, + WriteProtect = 16, + AlignementMask = 18, + NotWriteThrough = 29, + CacheDisable = 30, + PageEnable = 31, + }; + + inline UInt8 control_register_cast(ControlRegisterBits reg) + { + return static_cast(reg); + } + } // namespace Detail + + struct ALIGN(0x08) ZKA_PDE final + { + ZKA_PTE ALIGN(kPageAlign) fEntries[kPageMax]; + }; + + auto mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size) -> VoidPtr; + auto mm_free_bitmap(VoidPtr page_ptr) -> Bool; +} // namespace Kernel::HAL + +namespace Kernel +{ + typedef HAL::ZKA_PTE PTE; + typedef HAL::ZKA_PDE PDE; +} // namespace Kernel 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 #include #include -#include +#include 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/HalPageAlloc.hxx deleted file mode 100644 index 6cfeacf3..00000000 --- a/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx +++ /dev/null @@ -1,108 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies. - -------------------------------------------- */ - -#pragma once - -/** --------------------------------------------------- - - * THIS FILE CONTAINS CODE FOR ARMV8 PAGING. - -------------------------------------------------------- */ - -#include - -#ifndef kPageMax -#define kPageMax (0x200) -#endif //! kPageMax - -#ifndef kPageAlign -#define kPageAlign (0x1000) -#endif //! kPageAlign - -#ifndef kPageSize -#define kPageSize (0x1000) -#endif // !kPageSize - -//! short format address range - -#define c16KBPage 0b000 -#define c8KBPage 0b001 -#define c4KBPage 0b010 -#define c2KBPage 0b011 -#define c1KBPage 0b100 -#define c512BPage 0b101 -#define c256BPage 0b110 -#define c128BPage 0b111 - -/// Long format address range - -#define cPageMAll \ - { \ - 0b000, 0b000 \ - } -#define cPageMToMax(M) \ - { \ - M, 0b000 \ - } -#define cPageMaxToM(M) \ - { \ - 0b000, M \ - } -#define cPageMToN(M, N) \ - { \ - M, N \ - } - -namespace Kernel::HAL -{ - struct PACKED LongDescLevel3 final - { - Boolean Present : 1; - Boolean Rw : 1; - UInt16 Lpat : 9; - UInt32 Address : 27; - UInt32 Sbzp : 12; - UInt32 UPat : 11; - }; - - namespace Detail - { - enum class ControlRegisterBits - { - ProtectedModeEnable = 0, - MonitorCoProcessor = 1, - Emulation = 2, - TaskSwitched = 3, - ExtensionType = 4, - NumericError = 5, - WriteProtect = 16, - AlignementMask = 18, - NotWriteThrough = 29, - CacheDisable = 30, - PageEnable = 31, - }; - - inline UInt8 control_register_cast(ControlRegisterBits reg) - { - return static_cast(reg); - } - } // namespace Detail - - struct PageDirectory64 final - { - LongDescLevel3 ALIGN(kPageAlign) Pte[kPageMax]; - }; - - VoidPtr mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size); -} // namespace Kernel::HAL - -namespace Kernel -{ - typedef HAL::LongDescLevel3 PTE; - typedef HAL::PageDirectory64 PDE; -} // namespace Kernel - -EXTERN_C void hal_flush_tlb(); diff --git a/dev/ZKA/HALKit/ARM64/Paging.hxx b/dev/ZKA/HALKit/ARM64/Paging.hxx new file mode 100644 index 00000000..6cfeacf3 --- /dev/null +++ b/dev/ZKA/HALKit/ARM64/Paging.hxx @@ -0,0 +1,108 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + +------------------------------------------- */ + +#pragma once + +/** --------------------------------------------------- + + * THIS FILE CONTAINS CODE FOR ARMV8 PAGING. + +------------------------------------------------------- */ + +#include + +#ifndef kPageMax +#define kPageMax (0x200) +#endif //! kPageMax + +#ifndef kPageAlign +#define kPageAlign (0x1000) +#endif //! kPageAlign + +#ifndef kPageSize +#define kPageSize (0x1000) +#endif // !kPageSize + +//! short format address range + +#define c16KBPage 0b000 +#define c8KBPage 0b001 +#define c4KBPage 0b010 +#define c2KBPage 0b011 +#define c1KBPage 0b100 +#define c512BPage 0b101 +#define c256BPage 0b110 +#define c128BPage 0b111 + +/// Long format address range + +#define cPageMAll \ + { \ + 0b000, 0b000 \ + } +#define cPageMToMax(M) \ + { \ + M, 0b000 \ + } +#define cPageMaxToM(M) \ + { \ + 0b000, M \ + } +#define cPageMToN(M, N) \ + { \ + M, N \ + } + +namespace Kernel::HAL +{ + struct PACKED LongDescLevel3 final + { + Boolean Present : 1; + Boolean Rw : 1; + UInt16 Lpat : 9; + UInt32 Address : 27; + UInt32 Sbzp : 12; + UInt32 UPat : 11; + }; + + namespace Detail + { + enum class ControlRegisterBits + { + ProtectedModeEnable = 0, + MonitorCoProcessor = 1, + Emulation = 2, + TaskSwitched = 3, + ExtensionType = 4, + NumericError = 5, + WriteProtect = 16, + AlignementMask = 18, + NotWriteThrough = 29, + CacheDisable = 30, + PageEnable = 31, + }; + + inline UInt8 control_register_cast(ControlRegisterBits reg) + { + return static_cast(reg); + } + } // namespace Detail + + struct PageDirectory64 final + { + LongDescLevel3 ALIGN(kPageAlign) Pte[kPageMax]; + }; + + VoidPtr mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size); +} // namespace Kernel::HAL + +namespace Kernel +{ + typedef HAL::LongDescLevel3 PTE; + typedef HAL::PageDirectory64 PDE; +} // namespace Kernel + +EXTERN_C void hal_flush_tlb(); 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 +#include 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::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(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 #ifdef __ZKA_AMD64__ -#include +#include #elif defined(__ZKA_ARM64__) -#include +#include #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 -- cgit v1.2.3