diff options
Diffstat (limited to 'dev')
25 files changed, 198 insertions, 159 deletions
diff --git a/dev/ZBAKit/amd64-efi.make b/dev/ZBAKit/amd64-efi.make index 23e88b55..ba32671a 100644 --- a/dev/ZBAKit/amd64-efi.make +++ b/dev/ZBAKit/amd64-efi.make @@ -21,7 +21,7 @@ EMU=qemu-system-x86_64 endif ifeq ($(NEWS_MODEL), ) -ZKA_MODEL=-DkMachineModel="\"ZKA SSD\"" +ZKA_MODEL=-DkMachineModel="\"ZKA\"" endif BIOS=OVMF.fd @@ -34,7 +34,7 @@ EMU_FLAGS=-net none -smp 4 -m 8G -M q35 \ file=fat:rw:src/Root/,index=2,format=raw \ -drive id=disk_2,file=$(IMG),if=none \ -device ahci,id=ahci \ - -device ide-hd,drive=disk_2,bus=ahci.0 -d int + -device ide-hd,drive=disk_2,bus=ahci.0 -serial stdio LD_FLAGS=-e Main --subsystem=10 @@ -47,7 +47,7 @@ REM_FLAG=-f FLAG_ASM=-f win64 FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -mno-red-zone -D__NEWOSKRNL__ -D__NEWOSLDR__ \ -DEFI_FUNCTION_WRAPPER -I./ -I../ZKAKit -I../ -c -nostdlib -fno-rtti -fno-exceptions \ - -std=c++20 -D__HAVE_ZKA_APIS__ -D__ZKA_USE_FB__ -D__ZKA_AMD64__ -D__ZKA__ + -std=c++20 -D__HAVE_ZKA_APIS__ -DZBA_USE_FB -D__ZKA_AMD64__ -D__ZKA__ BOOTLOADER=zbaosldr.exe KERNEL=minoskrnl.exe diff --git a/dev/ZBAKit/arm64-efi.make b/dev/ZBAKit/arm64-efi.make index fb2317c4..1dd58d80 100644 --- a/dev/ZBAKit/arm64-efi.make +++ b/dev/ZBAKit/arm64-efi.make @@ -19,7 +19,7 @@ EMU=qemu-system-aarch64 endif ifeq ($(NEWS_MODEL), ) -ZKA_MODEL=-DkMachineModel="\"ZKA SSD\"" +ZKA_MODEL=-DkMachineModel="\"ZKA\"" endif BIOS=OVMF.fd diff --git a/dev/ZBAKit/src/HEL/AMD64/BootATA.cc b/dev/ZBAKit/src/HEL/AMD64/BootATA.cc index ca883935..0d24f99b 100644 --- a/dev/ZBAKit/src/HEL/AMD64/BootATA.cc +++ b/dev/ZBAKit/src/HEL/AMD64/BootATA.cc @@ -83,7 +83,7 @@ ATAInit_Retry: if (statRdy & ATA_SR_ERR) { writer.Write( - L"ZBA: ATA: error, not an IDE based hard-drive.\r"); + L"ZBA: ATA: Not an IDE based drive.\r"); return false; } diff --git a/dev/ZBAKit/src/HEL/AMD64/BootMain.cc b/dev/ZBAKit/src/HEL/AMD64/BootMain.cc index 98db6587..39e3fd31 100644 --- a/dev/ZBAKit/src/HEL/AMD64/BootMain.cc +++ b/dev/ZBAKit/src/HEL/AMD64/BootMain.cc @@ -16,10 +16,11 @@ #include <NewKit/Macros.h> #include <NewKit/Ref.h> #include <BootKit/Thread.h> +#include <Modules/FB/FB.h> // Makes the compiler shut up. #ifndef kMachineModel -#define kMachineModel "ZKA SSD" +#define kMachineModel "ZKA" #endif // !kMachineModel #ifndef kExpectedWidth @@ -94,7 +95,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, UInt32 sz_desc = sizeof(EfiMemoryDescriptor); UInt32 rev_desc = 0; -#ifdef __ZKA_USE_FB__ +#ifdef ZBA_USE_FB if (!boot_init_fb()) return 1; ///! Init the GOP. @@ -125,7 +126,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, handover_hdr->f_GOP.f_PixelPerLine = kGop->Mode->Info->PixelsPerScanLine; handover_hdr->f_GOP.f_PixelFormat = kGop->Mode->Info->PixelFormat; handover_hdr->f_GOP.f_Size = kGop->Mode->FrameBufferSize; -#endif // __ZKA_USE_FB__ +#endif // ZBA_USE_FB // ------------------------------------------- // // Grab MP services, extended to runtime. // @@ -140,21 +141,23 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, kHandoverHeader = handover_hdr; -#ifdef __ZKA_USE_FB__ +#ifdef ZBA_USE_FB CGInit(); - CGDrawInRegion(CGColor(0xFF, 0x3A, 0x3A), handover_hdr->f_GOP.f_Height, handover_hdr->f_GOP.f_Width, 0, 0); + CGDrawInRegion(CGColor(0x00, 0x00, 0x00), handover_hdr->f_GOP.f_Height, handover_hdr->f_GOP.f_Width, 0, 0); + CGFini(); + CGFini(); -#endif // __ZKA_USE_FB__ +#endif // ZBA_USE_FB UInt32 cnt_enabled = 0; UInt32 cnt_disabled = 0; mp->GetNumberOfProcessors(mp, &cnt_disabled, &cnt_enabled); -#ifdef __ZKA_USE_FB__ +#ifdef ZBA_USE_FB CGDrawString("ZBA (C) EL MAHROUSS LOGIC", 10, 10, RGB(0xFF, 0xFF, 0xFF)); CGDrawString((cnt_enabled > 1) ? "MULTIPLE PROCESSORS DETECTED." : "SINGLE PROCESSOR DETECTED.", 20, 10, RGB(0xFF, 0xFF, 0xFF)); -#endif // __ZKA_USE_FB__ +#endif // ZBA_USE_FB handover_hdr->f_HardwareTables.f_MultiProcessingEnabled = cnt_enabled > 1; // Fill handover header now. @@ -167,9 +170,11 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, // format the disk. // ---------------------------------------------------- // -#ifdef __ZKA_AUTO_FORMAT__ +#ifdef ZKA_AUTO_FORMAT if (!partition_factory.IsPartitionValid()) { + CGDrawString("FORMATTING EPM DISK...", 20, 10, RGB(0xFF, 0xFF, 0xFF)); + Boot::BDiskFormatFactory<BootDeviceATA>::BFileDescriptor root; root.fFileName[0] = kNeFSRoot[0]; root.fFileName[1] = 0; @@ -180,7 +185,11 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, rt_reset_hardware(); } -#endif // __ZKA_AUTO_FORMAT__ + else + { + CGDrawString("BOOTING FROM EPM DISK...", 20, 10, RGB(0xFF, 0xFF, 0xFF)); + } +#endif // ZKA_AUTO_FORMAT BS->GetMemoryMap(&size_struct_ptr, struct_ptr, &map_key, &sz_desc, &rev_desc); @@ -234,7 +243,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, if (reader_syschk.Blob()) { syschk_thread = new Boot::BThread(reader_syschk.Blob()); - syschk_thread->SetName("System Check (Integrity check)"); + syschk_thread->SetName("System Check (ZBA Driver)"); } syschk_thread->Start(handover_hdr); @@ -271,15 +280,17 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, if (reader_kernel.Blob()) { kernel_thread = new Boot::BThread(reader_kernel.Blob()); - kernel_thread->SetName("OS Kernel (Microkernel)."); + kernel_thread->SetName("Minimal OS Kernel."); handover_hdr->f_KernelImage = reader_kernel.Blob(); } else { -#ifdef __ZKA_USE_FB__ +#ifdef ZBA_USE_FB CGDrawString("ZBA: PLEASE RECOVER YOUR KERNEL IMAGE.", 30, 10, RGB(0xFF, 0xFF, 0xFF)); -#endif // __ZKA_USE_FB__ +#endif // ZBA_USE_FB + + EFI::Stop(); } Boot::BFileReader chime_wav(L"zka\\startup.wav", ImageHandle); @@ -300,18 +311,15 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, } else { -#ifdef __ZKA_USE_FB__ +#ifdef ZBA_USE_FB CGDrawString("ZBA: ONE OR MORE SYSTEM COMPONENTS ARE MISSING, PLEASE REINSTALL THE OS.", 30, 10, RGB(0xFF, 0xFF, 0xFF)); -#endif // __ZKA_USE_FB__ +#endif // ZBA_USE_FB + + EFI::Stop(); } EFI::ExitBootServices(map_key, ImageHandle); -#ifdef __ZKA_USE_FB__ - CGDrawInRegion(CGColor(0xFF, 0x3A, 0x3A), handover_hdr->f_GOP.f_Height, handover_hdr->f_GOP.f_Width, 0, 0); - CGFini(); -#endif // __ZKA_USE_FB__ - // ---------------------------------------------------- // // Finally load the operating system kernel. // ---------------------------------------------------- // diff --git a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc index 05ace369..1b880784 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc @@ -57,10 +57,10 @@ EXTERN_C void hal_init_platform( /* INITIALIZE GDT AND SEGMENTS. */ /************************************** */ - STATIC CONST auto cEntriesCount = 6; + STATIC CONST auto kGDTEntriesCount = 6; /* GDT, mostly descriptors for user and kernel segments. */ - STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY ALIGN(0x08) cGdt[cEntriesCount] = { + STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY ALIGN(0x08) kGDTArray[kGDTEntriesCount] = { {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // Null entry {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xAF, .fBaseHigh = 0}, // Kernel code {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xCF, .fBaseHigh = 0}, // Kernel data @@ -71,8 +71,8 @@ EXTERN_C void hal_init_platform( // Load memory descriptors. Kernel::HAL::RegisterGDT gdt_reg; - gdt_reg.Base = reinterpret_cast<Kernel::UIntPtr>(cGdt); - gdt_reg.Limit = (sizeof(Kernel::HAL::Detail::ZKA_GDT_ENTRY) * cEntriesCount) - 1; + gdt_reg.Base = reinterpret_cast<Kernel::UIntPtr>(kGDTArray); + gdt_reg.Limit = (sizeof(Kernel::HAL::Detail::ZKA_GDT_ENTRY) * kGDTEntriesCount) - 1; //! GDT will load hal_read_init after it successfully loads the segments. Kernel::HAL::GDTLoader gdt_loader; @@ -88,11 +88,9 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept Kernel::rtl_create_process([]() -> void { while (Yes) - { - kcout << "Hello.\r"; - } + ; }, - "RtlProcess"); + "RtlProcess\0"); /* Start any cores. */ if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) diff --git a/dev/ZKAKit/HALKit/AMD64/PCI/Device.cc b/dev/ZKAKit/HALKit/AMD64/PCI/Device.cc index bd451d96..4d44d7d0 100644 --- a/dev/ZKAKit/HALKit/AMD64/PCI/Device.cc +++ b/dev/ZKAKit/HALKit/AMD64/PCI/Device.cc @@ -116,7 +116,7 @@ namespace Kernel::PCI Write(bar_in, enable, sizeof(UShort)); } - UInt32 Device::Bar(UInt32 bar_in) + UIntPtr Device::Bar(UInt32 bar_in) { UInt32 bar = ZKA_PCIReadRaw(bar_in, fBus, fDevice, fFunction); return bar; diff --git a/dev/ZKAKit/HALKit/AMD64/Storage/AHCI.cc b/dev/ZKAKit/HALKit/AMD64/Storage/AHCI.cc index 52603f51..91948324 100644 --- a/dev/ZKAKit/HALKit/AMD64/Storage/AHCI.cc +++ b/dev/ZKAKit/HALKit/AMD64/Storage/AHCI.cc @@ -110,7 +110,7 @@ Kernel::Void drv_std_read(Kernel::UInt64 Lba, Kernel::Char* Buf, Kernel::SizeT S Kernel::LockDelegate<kMaxAhciPoll> lock(&kSlotIsUsed); - if (lock.HasTimedOut()) + if (kSlotIsUsed) return; kSlotIsUsed = Yes; @@ -119,7 +119,7 @@ Kernel::Void drv_std_read(Kernel::UInt64 Lba, Kernel::Char* Buf, Kernel::SizeT S // Prepare command header. - HbaCmdHeader* cmd_header = (HbaCmdHeader*)kAhciPort->Clb; + HbaCmdHeader* cmd_header = (HbaCmdHeader*)(Kernel::UIntPtr)kAhciPort->Clb; cmd_header += free_slot; // Read operation/set entries count. @@ -129,7 +129,7 @@ Kernel::Void drv_std_read(Kernel::UInt64 Lba, Kernel::Char* Buf, Kernel::SizeT S // Prepare command table. - HbaCmdTbl* cmd_tbl = (HbaCmdTbl*)cmd_header->Ctba; + HbaCmdTbl* cmd_tbl = (HbaCmdTbl*)(Kernel::UIntPtr)cmd_header->Ctba; Kernel::rt_set_memory(cmd_tbl, 0, sizeof(HbaCmdTbl)); Kernel::UInt64 size = Size * kAHCISectorSize; @@ -193,9 +193,7 @@ Kernel::Void drv_std_write(Kernel::UInt64 Lba, Kernel::Char* Buf, Kernel::SizeT { STATIC Kernel::Boolean kSlotIsUsed = No; - Kernel::LockDelegate<kMaxAhciPoll> lock(&kSlotIsUsed); - - if (lock.HasTimedOut()) + if (kSlotIsUsed) return; kSlotIsUsed = Yes; @@ -204,7 +202,7 @@ Kernel::Void drv_std_write(Kernel::UInt64 Lba, Kernel::Char* Buf, Kernel::SizeT // Prepare command header. - HbaCmdHeader* cmd_header = (HbaCmdHeader*)kAhciPort->Clb; + HbaCmdHeader* cmd_header = (HbaCmdHeader*)(Kernel::UIntPtr)kAhciPort->Clb; cmd_header += free_slot; // Read operation/set entries count. @@ -214,7 +212,7 @@ Kernel::Void drv_std_write(Kernel::UInt64 Lba, Kernel::Char* Buf, Kernel::SizeT // Prepare command table. - HbaCmdTbl* cmd_tbl = (HbaCmdTbl*)cmd_header->Ctba; + HbaCmdTbl* cmd_tbl = (HbaCmdTbl*)(Kernel::UIntPtr)cmd_header->Ctba; Kernel::rt_set_memory(cmd_tbl, 0, sizeof(HbaCmdTbl)); Kernel::UInt64 size = Size * kAHCISectorSize; @@ -267,6 +265,8 @@ Kernel::Void drv_std_write(Kernel::UInt64 Lba, Kernel::Char* Buf, Kernel::SizeT } else if (kAhciPort->Is & (1 << 30)) { + kcout << "Error in task file. (AHCI Drv)\r"; + Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED); return; // Error in task file } } diff --git a/dev/ZKAKit/KernelKit/DebugOutput.h b/dev/ZKAKit/KernelKit/DebugOutput.h index ec098129..dce371dd 100644 --- a/dev/ZKAKit/KernelKit/DebugOutput.h +++ b/dev/ZKAKit/KernelKit/DebugOutput.h @@ -109,10 +109,10 @@ namespace Kernel if (y < 0) y = -y; - const Char cNumbers[11] = "0123456789"; + const Char kNumbers[11] = "0123456789"; Char buf[2]; - buf[0] = cNumbers[h]; + buf[0] = kNumbers[h]; buf[1] = 0; term.operator<<(buf); @@ -128,7 +128,7 @@ namespace Kernel _write_number_hex(y, term); /* fail if the hex number is not base-16 */ - if (h > 15) + if (h > 16) { _write_number_hex('?', term); return term; @@ -137,10 +137,10 @@ namespace Kernel if (y < 0) y = -y; - const Char cNumbers[17] = "0123456789ABCDEF"; + const Char kNumbers[17] = "0123456789ABCDEF"; Char buf[2]; - buf[0] = cNumbers[h]; + buf[0] = kNumbers[h]; buf[1] = 0; term.operator<<(buf); diff --git a/dev/ZKAKit/KernelKit/DriveMgr.h b/dev/ZKAKit/KernelKit/DriveMgr.h index 38b9624a..9407f060 100644 --- a/dev/ZKAKit/KernelKit/DriveMgr.h +++ b/dev/ZKAKit/KernelKit/DriveMgr.h @@ -17,9 +17,9 @@ #include <NewKit/Ref.h> #define kMaxDriveCountPerMountpoint (4U) - -#define kDriveInvalidID (-1) -#define kDriveNameLen (32) +#define kDriveSectorSz (512U) +#define kDriveInvalidID (-1) +#define kDriveNameLen (32) #define DrvSectorCnt(SIZE, SECTOR_SZ) (((SIZE) + (SECTOR_SZ)) / (SECTOR_SZ)) diff --git a/dev/ZKAKit/KernelKit/LoaderInterface.h b/dev/ZKAKit/KernelKit/LoaderInterface.h index a8b4625c..7f759ac3 100644 --- a/dev/ZKAKit/KernelKit/LoaderInterface.h +++ b/dev/ZKAKit/KernelKit/LoaderInterface.h @@ -24,6 +24,7 @@ namespace Kernel ZKA_COPY_DEFAULT(LoaderInterface); public: + virtual _Output ErrorOr<VoidPtr> GetBlob() = 0; virtual _Output const Char* AsString() = 0; virtual _Output const Char* MIME() = 0; virtual _Output const Char* Path() = 0; diff --git a/dev/ZKAKit/KernelKit/PCI/Device.h b/dev/ZKAKit/KernelKit/PCI/Device.h index a37837f1..1b51e175 100644 --- a/dev/ZKAKit/KernelKit/PCI/Device.h +++ b/dev/ZKAKit/KernelKit/PCI/Device.h @@ -53,14 +53,14 @@ namespace Kernel::PCI } public: - UShort DeviceId(); - UShort VendorId(); - UShort InterfaceId(); - UChar Class(); - UChar Subclass(); - UChar ProgIf(); - UChar HeaderType(); - UInt32 Bar(UInt32 bar_in); + UShort DeviceId(); + UShort VendorId(); + UShort InterfaceId(); + UChar Class(); + UChar Subclass(); + UChar ProgIf(); + UChar HeaderType(); + UIntPtr Bar(UInt32 bar_in); public: void EnableMmio(UInt32 bar_in); diff --git a/dev/ZKAKit/KernelKit/PEFCodeMgr.h b/dev/ZKAKit/KernelKit/PEFCodeMgr.h index 6887f521..89b4ea40 100644 --- a/dev/ZKAKit/KernelKit/PEFCodeMgr.h +++ b/dev/ZKAKit/KernelKit/PEFCodeMgr.h @@ -41,6 +41,7 @@ namespace Kernel public: ErrorOr<VoidPtr> FindStart() override; VoidPtr FindSymbol(const Char* name, Int32 kind) override; + ErrorOr<VoidPtr> GetBlob() override; public: bool IsLoaded() noexcept; diff --git a/dev/ZKAKit/KernelKit/UserProcessScheduler.h b/dev/ZKAKit/KernelKit/UserProcessScheduler.h index 9880b565..4f9b04e8 100644 --- a/dev/ZKAKit/KernelKit/UserProcessScheduler.h +++ b/dev/ZKAKit/KernelKit/UserProcessScheduler.h @@ -39,16 +39,18 @@ namespace Kernel typedef Int64 ProcessID; //! @brief Local Process name length. - inline constexpr SizeT kProcessLen = 4096U; + inline constexpr SizeT kProcessNameLen = 4096U; //! @brief Local Process status enum. enum class ProcessStatusKind : Int32 { + kInvalid, kStarting, kRunning, kKilled, kFrozen, - kDead + kDead, + kCount, }; //! @brief Affinity is the amount of nano-seconds this process is going @@ -134,17 +136,18 @@ namespace Kernel ~UserProcess(); public: - ZKA_COPY_DEFAULT(UserProcess) + ZKA_COPY_DEFAULT(UserProcess); public: - Char Name[kProcessLen] = {"Application Process (Unnamed)"}; + Char Name[kProcessNameLen] = {"Application Process (Unnamed)"}; ProcessSubsystem SubSystem{ProcessSubsystem::kProcessSubsystemInvalid}; User* Owner{nullptr}; HAL::StackFramePtr StackFrame{nullptr}; AffinityKind Affinity{AffinityKind::kStandard}; ProcessStatusKind Status{ProcessStatusKind::kDead}; UInt8* StackReserve{nullptr}; - ImagePtr Image{nullptr}; + ImagePtr Code{nullptr}; + ImagePtr ExecImg{nullptr}; SizeT StackSize{kSchedMaxStackSz}; IPEFDLLObject* PefDLLDelegate{nullptr}; SizeT MemoryCursor{0}; @@ -264,7 +267,7 @@ namespace Kernel UserProcessTeam& CurrentTeam(); public: - SizeT Add(UserProcess process); + ProcessID Add(UserProcess* process); const Bool Remove(ProcessID process_id); const Bool IsUser() override; @@ -289,10 +292,10 @@ namespace Kernel class UserProcessHelper final { public: - STATIC bool Switch(VoidPtr image_ptr, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr, const PID& new_pid); - STATIC bool CanBeScheduled(const UserProcess& process); - STATIC PID& TheCurrentPID(); - STATIC SizeT StartScheduling(); + STATIC Bool Switch(VoidPtr image_ptr, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr, const PID& new_pid); + STATIC Bool CanBeScheduled(const UserProcess& process); + STATIC ErrorOr<PID> TheCurrentPID(); + STATIC SizeT StartScheduling(); }; const UInt32& sched_get_exit_code(void) noexcept; diff --git a/dev/ZKAKit/NewKit/Array.h b/dev/ZKAKit/NewKit/Array.h index 28060857..994645c5 100644 --- a/dev/ZKAKit/NewKit/Array.h +++ b/dev/ZKAKit/NewKit/Array.h @@ -24,12 +24,19 @@ namespace Kernel T& operator[](const SizeT& At) { + MUST_PASS(At < N); return fArray[At]; } - Boolean Empty() const + T& Assign(const SizeT& At, T& NewVal) { - return No; + fArray[At] = NewVal; + return fArray[At]; + } + + Boolean Empty() + { + return this->Count() > 0; } const SizeT Capacity() diff --git a/dev/ZKAKit/NewKit/Macros.h b/dev/ZKAKit/NewKit/Macros.h index 7041741b..63ba28cd 100644 --- a/dev/ZKAKit/NewKit/Macros.h +++ b/dev/ZKAKit/NewKit/Macros.h @@ -118,6 +118,10 @@ #define RGB(R, G, B) (Kernel::UInt32)(R | G << 0x8 | B << 0x10) #endif // !RGB +#define BREAK_POINT() \ + while (Yes) \ + ; + /// @brief The system page file. #define kPageSys "/System/syspage.sys" diff --git a/dev/ZKAKit/NewKit/Stop.h b/dev/ZKAKit/NewKit/Stop.h index 4155ff88..e47d0ec7 100644 --- a/dev/ZKAKit/NewKit/Stop.h +++ b/dev/ZKAKit/NewKit/Stop.h @@ -57,7 +57,7 @@ namespace Kernel STATIC Void Recover() noexcept; }; - void ke_stop(const Int& id); + void ke_stop(const Int32& id); } // namespace Kernel #ifdef TRY diff --git a/dev/ZKAKit/src/CodeMgr.cc b/dev/ZKAKit/src/CodeMgr.cc index 4031736a..335d1d87 100644 --- a/dev/ZKAKit/src/CodeMgr.cc +++ b/dev/ZKAKit/src/CodeMgr.cc @@ -23,15 +23,15 @@ namespace Kernel UserProcess* proc = new UserProcess{reinterpret_cast<VoidPtr>(main)}; - kcout << "Setting-up process...\r"; + kcout << "Setting-up process data...\r"; proc->Kind = UserProcess::kExectuableKind; - proc->StackSize = kib_cast(8); - proc->PTime = 0UL; + proc->StackSize = kib_cast(4); + rt_set_memory(proc->Name, 0, kProcessNameLen); rt_copy_memory((VoidPtr)process_name, proc->Name, rt_string_len(process_name)); - ProcessID id = UserProcessScheduler::The().Add(*proc); + ProcessID id = UserProcessScheduler::The().Add(proc); delete proc; diff --git a/dev/ZKAKit/src/DriveMgr.cc b/dev/ZKAKit/src/DriveMgr.cc index 3d11600b..812bec36 100644 --- a/dev/ZKAKit/src/DriveMgr.cc +++ b/dev/ZKAKit/src/DriveMgr.cc @@ -158,10 +158,12 @@ namespace Kernel if (rt_string_cmp(block_struct.Magic, kEPMMagic, kEPMMagicLength) == 0) { trait.fKind |= kEPMDrive; + kcout << "Formatted drive is EPM.\r"; } else { trait.fKind |= kUnformattedDrive; + kcout << "Formatted drive is blank.\r"; } trait.fPacket.fLba = 0; @@ -178,14 +180,14 @@ namespace Kernel rt_copy_memory((VoidPtr) "/Mount/OS:", trait.fName, rt_string_len("/Mount/OS:")); - Detail::ioi_detect_drive(trait); - trait.fVerify = io_drv_unimplemented; trait.fOutput = io_drv_output; trait.fInput = io_drv_input; trait.fInit = io_drv_init; trait.fDriveKind = io_drv_kind; + Detail::ioi_detect_drive(trait); + kcout << "Construct: " << trait.fName << ".\r"; return trait; diff --git a/dev/ZKAKit/src/FS/NeFS.cc b/dev/ZKAKit/src/FS/NeFS.cc index bd93332a..53c88aa0 100644 --- a/dev/ZKAKit/src/FS/NeFS.cc +++ b/dev/ZKAKit/src/FS/NeFS.cc @@ -501,18 +501,18 @@ bool NeFSParser::Format(_Input _Output DriveTrait* drive, _Input const Lba endLb BOOT_BLOCK_STRUCT* epmBoot = (BOOT_BLOCK_STRUCT*)bufEpmHdr; - // EPM header. + // Write a new EPM entry. - constexpr auto cFsName = "NeFS"; - constexpr auto cBlockName = "ZKA:"; + constexpr auto kFsName = "NeFS"; + constexpr auto kBlockName = "ZKA:"; - rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(cFsName)), epmBoot->Fs, rt_string_len(cFsName)); + rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(kFsName)), epmBoot->Fs, rt_string_len(kFsName)); epmBoot->FsVersion = kNeFSVersionInteger; epmBoot->LbaStart = start; epmBoot->SectorSz = kNeFSSectorSz; - rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(cBlockName)), epmBoot->Name, rt_string_len(cBlockName)); + rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(kBlockName)), epmBoot->Name, rt_string_len(kBlockName)); rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(kEPMMagic)), epmBoot->Magic, rt_string_len(kEPMMagic)); Lba outEpmLba = kEPMBaseLba; diff --git a/dev/ZKAKit/src/Heap.cc b/dev/ZKAKit/src/Heap.cc index fc3f7051..9d36d04e 100644 --- a/dev/ZKAKit/src/Heap.cc +++ b/dev/ZKAKit/src/Heap.cc @@ -22,8 +22,9 @@ //! @file Heap.cc //! @brief The Kernel's heap manager serves as the main memory manager. -#define kKernelHeapMagic (0xD4D7D5) -#define kKernelAlignSz (__BIGGEST_ALIGNMENT__) +#define kKernelHeapMagic (0xD4D7D5) +#define kKernelHeapAlignSz (__BIGGEST_ALIGNMENT__) +#define kKernelHeapMaxSize (gib_cast(2)) namespace Kernel { @@ -65,7 +66,7 @@ namespace Kernel UIntPtr fHeapPtr; /// @brief Padding bytes for header. - UInt8 fPadding[kKernelAlignSz]; + UInt8 fPadding[kKernelHeapAlignSz]; }; /// @brief Check for heap address validity. @@ -121,7 +122,7 @@ namespace Kernel return nullptr; // We can't allocate that big now. - MUST_PASS(sz <= gib_cast(2)); + MUST_PASS(sz < kKernelHeapMaxSize); sz_fix += sizeof(Detail::HEAP_INFORMATION_BLOCK); @@ -141,7 +142,7 @@ namespace Kernel heap_info_ptr->fUser = user; heap_info_ptr->fPresent = Yes; - rt_set_memory(heap_info_ptr->fPadding, 0, kKernelAlignSz); + rt_set_memory(heap_info_ptr->fPadding, 0, kKernelHeapAlignSz); auto result = reinterpret_cast<VoidPtr>(heap_info_ptr->fHeapPtr); diff --git a/dev/ZKAKit/src/IPEFDLLObject.cc b/dev/ZKAKit/src/IPEFDLLObject.cc index c68f582d..620002d8 100644 --- a/dev/ZKAKit/src/IPEFDLLObject.cc +++ b/dev/ZKAKit/src/IPEFDLLObject.cc @@ -60,7 +60,7 @@ EXTERN_C IDLL rtl_init_dll(UserProcess* header) } dll_obj->Get()->fImageObject = - header->Image; + header->ExecImg; if (!dll_obj->Get()->fImageObject) { diff --git a/dev/ZKAKit/src/PEFCodeMgr.cc b/dev/ZKAKit/src/PEFCodeMgr.cc index a2b3482a..ba0d3a78 100644 --- a/dev/ZKAKit/src/PEFCodeMgr.cc +++ b/dev/ZKAKit/src/PEFCodeMgr.cc @@ -226,6 +226,11 @@ namespace Kernel return kPefApplicationMime; } + ErrorOr<VoidPtr> PEFLoader::GetBlob() + { + return ErrorOr<VoidPtr>{this->fCachedBlob}; + } + namespace Utils { ProcessID rtl_create_process(PEFLoader& exec, const Int32& procKind) noexcept @@ -238,11 +243,12 @@ namespace Kernel UserProcess* proc = new UserProcess{errOrStart.Leak().Leak()}; proc->Kind = procKind; + proc->ExecImg = exec.GetBlob().Leak().Leak(); proc->StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData); proc->MemoryLimit = *(UIntPtr*)exec.FindSymbol(kPefHeapSizeSymbol, kPefData); proc->PTime = 0UL; - rt_set_memory(proc->Name, 0, kProcessLen); + rt_set_memory(proc->Name, 0, kProcessNameLen); if (exec.FindSymbol(kPefNameSymbol, kPefData)) rt_copy_memory(exec.FindSymbol(kPefNameSymbol, kPefData), proc->Name, rt_string_len((Char*)exec.FindSymbol(kPefNameSymbol, kPefData))); @@ -253,7 +259,7 @@ namespace Kernel proc->StackSize = mib_cast(cDefaultStackSizeMib); } - return UserProcessScheduler::The().Add(*proc); + return UserProcessScheduler::The().Add(proc); } } // namespace Utils } // namespace Kernel diff --git a/dev/ZKAKit/src/Stop.cc b/dev/ZKAKit/src/Stop.cc index 122b4489..c244456a 100644 --- a/dev/ZKAKit/src/Stop.cc +++ b/dev/ZKAKit/src/Stop.cc @@ -21,7 +21,7 @@ namespace Kernel { - Void ke_stop(const Kernel::Int& id) + Void ke_stop(const Kernel::Int32& id) { CGInit(); @@ -30,7 +30,7 @@ namespace Kernel auto start_y = 10; auto x = 10; - CGDrawString("minoskrnl.exe stopped working properly so it had to stop.", start_y, x, panic_text); + CGDrawString("minoskrnl.exe, bug check error raised, stopping...", start_y, x, panic_text); start_y += 10; // simply offset from previous string and then write the website. diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc index 67eac095..96d2244f 100644 --- a/dev/ZKAKit/src/UserProcessScheduler.cc +++ b/dev/ZKAKit/src/UserProcessScheduler.cc @@ -35,13 +35,19 @@ namespace Kernel UInt32 kLastExitCode = 0U; /***********************************************************************************/ + /// @brief Process count global variable. + /***********************************************************************************/ + + ProcessID kProcessIDCounter = 0UL; + + /***********************************************************************************/ /// @brief User Process scheduler global and external reference of thread scheduler. /***********************************************************************************/ UserProcessScheduler kProcessScheduler; UserProcess::UserProcess(VoidPtr start_image) - : Image(start_image) + : Code(start_image) { } @@ -71,7 +77,7 @@ namespace Kernel UserProcess::operator bool() { - return this->Status == ProcessStatusKind::kRunning && this->Image != nullptr; + return this->Status == ProcessStatusKind::kRunning; } /***********************************************************************************/ @@ -239,7 +245,10 @@ namespace Kernel void UserProcess::Exit(const Int32& exit_code) { - this->Status = ProcessStatusKind::kDead; + if (exit_code > 0) + this->Status = ProcessStatusKind::kKilled; + else + this->Status = ProcessStatusKind::kDead; fLastExitCode = exit_code; kLastExitCode = exit_code; @@ -275,13 +284,13 @@ namespace Kernel HAL::mm_free_bitmap(reinterpret_cast<VoidPtr>(this->VMRegister)); //! Delete image if not done already. - if (this->Image && mm_is_valid_heap(this->Image)) - mm_delete_heap(this->Image); + if (this->Code && mm_is_valid_heap(this->Code)) + mm_delete_heap(this->Code); if (this->StackFrame && mm_is_valid_heap(this->StackFrame)) mm_delete_heap((VoidPtr)this->StackFrame); - this->Image = nullptr; + this->Code = nullptr; this->StackFrame = nullptr; if (this->Kind == kExectuableDLLKind) @@ -310,71 +319,61 @@ namespace Kernel /// @return the process index inside the team. /***********************************************************************************/ - SizeT UserProcessScheduler::Add(UserProcess process) + ProcessID UserProcessScheduler::Add(UserProcess* process) { - kcout << "Creating process: " << process.Name << ", prevous process count: " << number(mTeam.mProcessList.Count()) << endl; - - if (mTeam.mProcessList.Count() >= kSchedProcessLimitPerTeam) - return kErrorInvalidData; - - kcout << "Create vm_register of: " << process.Name << endl; + kcout << "Create VMRegister of: " << process->Name << endl; #ifdef __ZKA_AMD64__ - process.VMRegister = reinterpret_cast<UIntPtr>(mm_new_heap(sizeof(PDE), No, Yes)); + process->VMRegister = reinterpret_cast<UIntPtr>(mm_new_heap(sizeof(PDE), No, Yes)); - if (!process.VMRegister) + if (!process->VMRegister) { - process.Crash(); - return kErrorProcessFault; + process->Crash(); + return -kErrorProcessFault; } #endif // __ZKA_AMD64__ - kcout << "Create stack_frame of: " << process.Name << endl; + kcout << "Create StackFrame of: " << process->Name << endl; - process.StackFrame = reinterpret_cast<HAL::StackFramePtr>(mm_new_heap(sizeof(HAL::StackFrame), Yes, Yes)); + process->StackFrame = reinterpret_cast<HAL::StackFramePtr>(mm_new_heap(sizeof(HAL::StackFrame), Yes, Yes)); - if (!process.StackFrame) + if (!process->StackFrame) { - process.Crash(); - return kErrorProcessFault; + process->Crash(); + return -kErrorProcessFault; } - kcout << "Create delegate if DLL for: " << process.Name << endl; - - // Create heap according to type of process. - if (process.Kind == UserProcess::kExectuableDLLKind) + // Create heap according to type of process-> + if (process->Kind == UserProcess::kExectuableDLLKind) { - process.PefDLLDelegate = rtl_init_dll(&process); + kcout << "Create delegate dylib for: " << process->Name << endl; + process->PefDLLDelegate = rtl_init_dll(process); } - kcout << "Validate image of: " << process.Name << endl; + process->StackReserve = reinterpret_cast<UInt8*>(mm_new_heap(sizeof(UInt8) * process->StackSize, Yes, Yes)); + + kcout << "Validate stack reserve: " << number((UIntPtr)process->StackReserve) << endl; - if (!process.Image) + if (!process->StackReserve) { - process.Crash(); - return kErrorProcessFault; + process->Crash(); + return -kErrorProcessFault; } - kcout << "Validate stack reserve of: " << process.Name << endl; + auto pid = 0UL; - // Get preferred stack size by app. - const auto kMaxStackSize = process.StackSize; - process.StackReserve = reinterpret_cast<UInt8*>(mm_new_heap(sizeof(UInt8) * kMaxStackSize, Yes, Yes)); - - if (!process.StackReserve) - { - process.Crash(); - return kErrorProcessFault; - } + process->ProcessId = pid; + process->Status = ProcessStatusKind::kRunning; + process->PTime = (UIntPtr)AffinityKind::kStandard; - process.ProcessId = 0UL; - process.Status = ProcessStatusKind::kRunning; + mTeam.AsArray().Assign(pid, *process); - mTeam.AsArray()[process.ProcessId] = process; + kcout << "Process Name: " << mTeam.AsArray()[pid].Name << endl; + kcout << "PID: " << number(mTeam.AsArray()[pid].ProcessId) << endl; - kcout << "Create process: " << process.Name << endl; + BREAK_POINT(); - return process.ProcessId; + return pid; } /***********************************************************************************/ @@ -402,7 +401,7 @@ namespace Kernel if (process_id > mTeam.mProcessList.Count()) return No; - mTeam.AsArray()[process_id].Status = ProcessStatusKind::kDead; + --kProcessIDCounter; return Yes; } @@ -445,24 +444,23 @@ namespace Kernel for (; process_index < mTeam.AsArray().Capacity(); ++process_index) { - auto& process = mTeam.AsArray()[process_index]; + auto process = mTeam.AsArray()[process_index]; //! check if process needs to be scheduled. if (UserProcessHelper::CanBeScheduled(process)) { + // Set current process header. + this->GetCurrentProcess() = process; + process.PTime = static_cast<Int32>(process.Affinity); kcout << "Switch to '" << process.Name << "'.\r"; - // Set current process header. - this->GetCurrentProcess() = process; - // tell helper to find a core to schedule on. - if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize - 1], process.StackFrame, + if (!UserProcessHelper::Switch(process.Code, &process.StackReserve[process.StackSize - 1], process.StackFrame, process.ProcessId)) { process.Crash(); - continue; } } else @@ -492,10 +490,13 @@ namespace Kernel /// @brief Current proccess id getter. /// @return UserProcess ID integer. - PID& UserProcessHelper::TheCurrentPID() + ErrorOr<PID> UserProcessHelper::TheCurrentPID() { + if (!kProcessScheduler.GetCurrentProcess()) + return ErrorOr<PID>{kErrorProcessFault}; + kcout << "UserProcessHelper::TheCurrentPID: Leaking ProcessId...\r"; - return kProcessScheduler.GetCurrentProcess().Leak().ProcessId; + return ErrorOr<PID>{kProcessScheduler.GetCurrentProcess().Leak().ProcessId}; } /// @brief Check if process can be schedulded. @@ -505,13 +506,17 @@ namespace Kernel Bool UserProcessHelper::CanBeScheduled(const UserProcess& process) { if (process.Status == ProcessStatusKind::kKilled || - process.Status == ProcessStatusKind::kDead) + process.Status == ProcessStatusKind::kDead || + process.Status == ProcessStatusKind::kFrozen) + return No; + + if (process.Status == ProcessStatusKind::kInvalid) return No; - if (!process.Image) + if (!process.Code) return No; - return process.PTime < 1 && process.Status == ProcessStatusKind::kRunning; + return process.PTime < 1; } /***********************************************************************************/ @@ -537,6 +542,9 @@ namespace Kernel if (!stack || !frame_ptr || !image_ptr || new_pid < 0) return No; + if (!mm_is_valid_heap(image_ptr)) + return No; + for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Count(); ++index) { if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kInvalidHart) @@ -547,8 +555,8 @@ namespace Kernel HardwareThreadScheduler::The()[index].Leak()->Kind() != ThreadKind::kHartSystemReserved) { - PID prev_pid = UserProcessHelper::TheCurrentPID(); - UserProcessHelper::TheCurrentPID() = new_pid; + PID prev_pid = UserProcessHelper::TheCurrentPID(); + UserProcessHelper::TheCurrentPID().Leak().Leak() = new_pid; //////////////////////////////////////////////////////////// /// Prepare task switch. /// @@ -565,7 +573,7 @@ namespace Kernel if (!ret) { HardwareThreadScheduler::The()[index].Leak()->fPTime = prev_ptime; - UserProcessHelper::TheCurrentPID() = prev_pid; + UserProcessHelper::TheCurrentPID().Leak().Leak() = prev_pid; continue; } diff --git a/dev/ZKAKit/src/Utils.cc b/dev/ZKAKit/src/Utils.cc index f6564f38..9a2b5e78 100644 --- a/dev/ZKAKit/src/Utils.cc +++ b/dev/ZKAKit/src/Utils.cc @@ -34,7 +34,7 @@ namespace Kernel { SizeT len{0}; - while (str[len] != '\0') + do { if (len > _len) { @@ -42,7 +42,7 @@ namespace Kernel } ++len; - } + } while (str[len] != '\0'); return len; } @@ -51,10 +51,10 @@ namespace Kernel { SizeT cnt{0}; - while (ptr[cnt] != 0) + do { ++cnt; - } + } while (ptr[cnt] != 0); return cnt; } @@ -211,7 +211,7 @@ namespace Kernel } } // namespace Kernel -EXTERN_C void* memset(void* dst, char c, Kernel::Size len) +EXTERN_C Kernel::VoidPtr memset(Kernel::VoidPtr dst, Kernel::UInt32 c, Kernel::Size len) { return Kernel::rt_set_memory(dst, c, len); } |
