diff options
29 files changed, 175 insertions, 88 deletions
diff --git a/dev/Modules/FB/Accessibility.h b/dev/Modules/FB/Accessibility.h index 1564cc19..5b1ecbe3 100644 --- a/dev/Modules/FB/Accessibility.h +++ b/dev/Modules/FB/Accessibility.h @@ -15,13 +15,13 @@ namespace CG { - using namespace Kernel; + using namespace Kernel; /// @brief common User interface class. class UIAccessibilty final { explicit UIAccessibilty() = default; - ~UIAccessibilty() = default; + ~UIAccessibilty() = default; public: ZKA_COPY_DELETE(UIAccessibilty); @@ -42,6 +42,6 @@ namespace CG return kHandoverHeader->f_GOP.f_Height; } }; -} // namespace Kernel +} // namespace CG #endif // !FB_ACCESSIBILITY_H_ diff --git a/dev/ZBAKit/amd64-efi.make b/dev/ZBAKit/amd64-efi.make index c2bdd63c..b22a0046 100644 --- a/dev/ZBAKit/amd64-efi.make +++ b/dev/ZBAKit/amd64-efi.make @@ -32,7 +32,7 @@ IMG_3=epm-master-2.img EMU_FLAGS=-net none -smp 1 -m 8G -M q35 \ -bios $(BIOS) -drive \ file=fat:rw:src/Root/,index=2,format=raw \ - -serial stdio -no-shutdown -no-reboot + -monitor stdio LD_FLAGS=-e Main --subsystem=10 diff --git a/dev/ZKAKit/ArchKit/ArchKit.h b/dev/ZKAKit/ArchKit/ArchKit.h index b46d88c8..d0a37cfc 100644 --- a/dev/ZKAKit/ArchKit/ArchKit.h +++ b/dev/ZKAKit/ArchKit/ArchKit.h @@ -56,6 +56,11 @@ namespace Kernel { return *(volatile UInt32*)((UInt64)base + reg); } + + namespace HAL + { + auto mm_is_bitmap(VoidPtr ptr) -> Bool; + } } // namespace Kernel #define kKernelMaxSystemCalls (256) diff --git a/dev/ZKAKit/FSKit/NeFS.h b/dev/ZKAKit/FSKit/NeFS.h index fe5d9bdc..bb7d4877 100644 --- a/dev/ZKAKit/FSKit/NeFS.h +++ b/dev/ZKAKit/FSKit/NeFS.h @@ -239,15 +239,15 @@ namespace Kernel /// @param theFork the fork itself. /// @return the fork _Output NFS_FORK_STRUCT* CreateFork(_Input NFS_CATALOG_STRUCT* catalog, - _Input NFS_FORK_STRUCT& theFork); + _Input NFS_FORK_STRUCT& theFork); /// @brief Find fork inside New filesystem. /// @param catalog the catalog. /// @param name the fork name. /// @return the fork. _Output NFS_FORK_STRUCT* FindFork(_Input NFS_CATALOG_STRUCT* catalog, - _Input const Char* name, - Boolean dataOrRsrc); + _Input const Char* name, + Boolean dataOrRsrc); _Output Void RemoveFork(_Input NFS_FORK_STRUCT* fork); @@ -257,7 +257,7 @@ namespace Kernel _Output NFS_CATALOG_STRUCT* GetCatalog(_Input const Char* name); - _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const Char* name, + _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const Char* name, _Input const Int32& flags, _Input const Int32& kind); @@ -267,12 +267,12 @@ namespace Kernel _Input Bool isRsrcFork, _Input VoidPtr data, _Input SizeT sizeOfData, - _Input const Char* forkName); + _Input const Char* forkName); VoidPtr ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, _Input Bool isRsrcFork, _Input SizeT dataSz, - _Input const Char* forkName); + _Input const Char* forkName); bool Seek(_Input _Output NFS_CATALOG_STRUCT* catalog, SizeT off); diff --git a/dev/ZKAKit/FirmwareKit/EFI/EFI.h b/dev/ZKAKit/FirmwareKit/EFI/EFI.h index 0565b3eb..3ccdf775 100644 --- a/dev/ZKAKit/FirmwareKit/EFI/EFI.h +++ b/dev/ZKAKit/FirmwareKit/EFI/EFI.h @@ -823,11 +823,11 @@ typedef struct _EfiProcessorInformation typedef EfiStatusType EFI_API (*EfiMpServicesGetNumberOfProcessors)( IN struct _EfiMpServicesProtocol* Self, - OUT UInt32* NumberOfProcessors, - OUT UInt32* NumberOfEnabledProcessors); + OUT UInt32* NumberOfProcessors, + OUT UInt32* NumberOfEnabledProcessors); typedef EfiStatusType EFI_API (*EfiMpServicesGetProcessorInfo)( - IN struct _EfiMpServicesProtocol* Self, + IN struct _EfiMpServicesProtocol* Self, IN UInt32* ProcessorNumber, OUT struct _EfiProcessorInformation* NumberOfEnabledProcessors); @@ -840,8 +840,8 @@ typedef EfiStatusType EFI_API (*EfiMpServicesStartupAllAPS)( IN Boolean SingleThread, IN VoidPtr WaitEvent OPTIONAL, // EFI_EVENT first, but unused here. IN UInt32 TimeoutInMicroSeconds, - IN Void* ProcedureArgument OPTIONAL, - OUT UInt32** FailedCpuList OPTIONAL); + IN Void* ProcedureArgument OPTIONAL, + OUT UInt32** FailedCpuList OPTIONAL); typedef EfiStatusType EFI_API (*EfiMpServicesSwitchBSP)( IN struct _EfiMpServicesProtocol* Self, @@ -854,18 +854,18 @@ typedef EfiStatusType EFI_API (*EfiMpServicesStartupThisAP)( IN UInt32 ProcessorNumber, IN VoidPtr WaitEvent OPTIONAL, IN UInt32 TimeoutInMicroseconds, - IN Void* ProcedureArgument OPTIONAL, - OUT Boolean* Finished OPTIONAL); + IN Void* ProcedureArgument OPTIONAL, + OUT Boolean* Finished OPTIONAL); typedef EfiStatusType EFI_API (*EfiMpServicesDisableThisAP)( IN struct _EfiMpServicesProtocol* Self, IN UInt32 ProcessorNumber, IN Boolean EnableAP, - IN UInt32* HealthFlag OPTIONAL); + IN UInt32* HealthFlag OPTIONAL); typedef EfiStatusType EFI_API (*EfiMpServicesWhoAmI)( IN struct _EfiMpServicesProtocol* Self, - OUT UInt32* ProcessorNumber); + OUT UInt32* ProcessorNumber); typedef struct _EfiMpServicesProtocol { diff --git a/dev/ZKAKit/HALKit/AMD64/HalCPUAMD64.cc b/dev/ZKAKit/HALKit/AMD64/HalCPUAMD64.cc index 275f630d..52ba46aa 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalCPUAMD64.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalCPUAMD64.cc @@ -17,7 +17,7 @@ namespace Kernel::HAL { - Void rt_out8(UInt16 port, UInt8 value) + Void lrt_out8(UInt16 port, UInt8 value) { asm volatile("outb %%al, %1" : @@ -25,7 +25,7 @@ namespace Kernel::HAL : "memory"); } - Void rt_out16(UInt16 port, UInt16 value) + Void lrt_out16(UInt16 port, UInt16 value) { asm volatile("outw %%ax, %1" : @@ -33,7 +33,7 @@ namespace Kernel::HAL : "memory"); } - Void rt_out32(UInt16 port, UInt32 value) + Void lrt_out32(UInt16 port, UInt32 value) { asm volatile("outl %%eax, %1" : @@ -41,7 +41,7 @@ namespace Kernel::HAL : "memory"); } - UInt8 rt_in8(UInt16 port) + UInt8 lrt_in8(UInt16 port) { UInt8 value = 0UL; asm volatile("inb %1, %%al" @@ -52,7 +52,7 @@ namespace Kernel::HAL return value; } - UInt16 rt_in16(UInt16 port) + UInt16 lrt_in16(UInt16 port) { UInt16 value = 0UL; asm volatile("inw %1, %%ax" @@ -63,7 +63,7 @@ namespace Kernel::HAL return value; } - UInt32 rt_in32(UInt16 port) + UInt32 lrt_in32(UInt16 port) { UInt32 value = 0UL; asm volatile("inl %1, %%eax" diff --git a/dev/ZKAKit/HALKit/AMD64/HalCommonAPI.asm b/dev/ZKAKit/HALKit/AMD64/HalCommonAPI.asm index 77931d0e..6e463e98 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalCommonAPI.asm +++ b/dev/ZKAKit/HALKit/AMD64/HalCommonAPI.asm @@ -7,4 +7,47 @@ ;; * ======================================================== ;; */ -section .text
\ No newline at end of file +section .text + +extern rt_wait_400ns + +global rt_out8 +global rt_out16 +global rt_out32 + +global rt_in8 +global rt_in16 +global rt_in32 + +rt_out8: + mov al, dl + mov dx, cx + out dx, al + ret + +rt_out16: + mov ax, dx + mov dx, cx + out dx, ax + ret + +rt_out32: + mov eax, edx + mov edx, ecx + out dx, eax + ret + +rt_in8: + mov dx, cx + in al, dx + ret + +rt_in16: + mov edx, ecx + in ax, dx + ret + +rt_in32: + mov rdx, rcx + in eax, dx + ret diff --git a/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index e40ef071..aaf80c9a 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -17,6 +17,9 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); + if (!process) + Kernel::ke_stop(RUNTIME_CHECK_PAGE); + process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; @@ -35,11 +38,13 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { kcout << "Kernel: Page Fault.\r"; - kcout << "Kernel: SIGKILL set.\r"; auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); + if (!process) + Kernel::ke_stop(RUNTIME_CHECK_PAGE); + process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; @@ -68,7 +73,7 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) } try_count_before_brute = 100000UL; - is_scheduling = YES; + is_scheduling = YES; kcout << "Kernel: Timer IRQ (Scheduler Notification).\r"; Kernel::UserProcessHelper::StartScheduling(); @@ -84,6 +89,9 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); + if (!process) + Kernel::ke_stop(RUNTIME_CHECK_PAGE); + process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; @@ -105,6 +113,9 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); + if (!process) + Kernel::ke_stop(RUNTIME_CHECK_PAGE); + process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; @@ -122,13 +133,15 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); - kcout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << endl; - kcout << "Kernel: Process Name: " << process.Leak().Name << endl; + if (!process) + Kernel::ke_stop(RUNTIME_CHECK_PAGE); + kcout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << endl; kcout << "Kernel: SIGTRAP set.\r"; - process.Leak().ProcessSignal.SignalIP = rip; - process.Leak().ProcessSignal.SignalID = SIGTRAP; + process.Leak().ProcessSignal.SignalIP = rip; + process.Leak().ProcessSignal.SignalID = SIGTRAP; + process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; kcout << "Kernel: PRCFROZE status set..\r"; @@ -144,6 +157,9 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); + if (!process) + Kernel::ke_stop(RUNTIME_CHECK_PAGE); + process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; diff --git a/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm index 66dd34f0..7aafa079 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm @@ -202,8 +202,7 @@ __ZKA_INT_32: push rax mov rcx, rsp - mov rax, idt_handle_scheduler - call rax + call idt_handle_scheduler pop rax sti diff --git a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc index 3cff28d2..47a38ca1 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc @@ -83,7 +83,7 @@ EXTERN_C void hal_init_platform( EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { - Kernel::rtl_create_process(ke_dll_entrypoint, "Kernel System"); + Kernel::rtl_create_process(ke_dll_entrypoint, "Kernel System"); /* Initialize filesystem. */ Kernel::NeFileSystemMgr::Mount(new Kernel::NeFileSystemMgr()); diff --git a/dev/ZKAKit/HALKit/AMD64/HalRoutineWait.s b/dev/ZKAKit/HALKit/AMD64/HalRoutineWait.s index d794882d..89051ba4 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalRoutineWait.s +++ b/dev/ZKAKit/HALKit/AMD64/HalRoutineWait.s @@ -3,7 +3,9 @@ .section .text rt_wait_400ns: jmp .loop + pause .loop: jmp .loop2 + pause .loop2: ret diff --git a/dev/ZKAKit/HALKit/AMD64/Processor.h b/dev/ZKAKit/HALKit/AMD64/Processor.h index b0580f3c..02c621bc 100644 --- a/dev/ZKAKit/HALKit/AMD64/Processor.h +++ b/dev/ZKAKit/HALKit/AMD64/Processor.h @@ -303,9 +303,9 @@ namespace Kernel::HAL /// @return Status code of page manip. EXTERN_C Int32 mm_map_page(VoidPtr virt_addr, UInt32 flags); - EXTERN_C UChar rt_in8(UInt16 port); - EXTERN_C UShort rt_in16(UInt16 port); - EXTERN_C UInt rt_in32(UInt16 port); + EXTERN_C UInt8 rt_in8(UInt16 port); + EXTERN_C UInt16 rt_in16(UInt16 port); + EXTERN_C UInt32 rt_in32(UInt16 port); EXTERN_C void rt_out16(UShort port, UShort byte); EXTERN_C void rt_out8(UShort port, UChar byte); diff --git a/dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc b/dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc index 106a06b1..6b6d4ee5 100644 --- a/dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc +++ b/dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc @@ -52,7 +52,7 @@ enum }; STATIC Kernel::PCI::Device kAhciDevice; -STATIC HbaPort* kAhciPort = nullptr; +STATIC HbaPort* kAhciPort = nullptr; STATIC Kernel::Lba kCurrentDiskSectorCount = 0UL; Kernel::Void drv_calculate_disk_geometry() diff --git a/dev/ZKAKit/HALKit/POWER/HalSerialPort.cc b/dev/ZKAKit/HALKit/POWER/HalDebugOutput.cc index 91805d87..91805d87 100644 --- a/dev/ZKAKit/HALKit/POWER/HalSerialPort.cc +++ b/dev/ZKAKit/HALKit/POWER/HalDebugOutput.cc diff --git a/dev/ZKAKit/KernelKit/LoaderInterface.h b/dev/ZKAKit/KernelKit/LoaderInterface.h index 9323aec7..f5a34495 100644 --- a/dev/ZKAKit/KernelKit/LoaderInterface.h +++ b/dev/ZKAKit/KernelKit/LoaderInterface.h @@ -25,9 +25,9 @@ namespace Kernel 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; + virtual _Output const Char* AsString() = 0; + virtual _Output const Char* MIME() = 0; + virtual _Output const Char* Path() = 0; virtual _Output ErrorOr<VoidPtr> FindStart() = 0; virtual _Output VoidPtr FindSymbol(_Input const Char* name, _Input Int32 kind) = 0; }; diff --git a/dev/ZKAKit/KernelKit/UserProcessScheduler.h b/dev/ZKAKit/KernelKit/UserProcessScheduler.h index c1dd7711..d8e17995 100644 --- a/dev/ZKAKit/KernelKit/UserProcessScheduler.h +++ b/dev/ZKAKit/KernelKit/UserProcessScheduler.h @@ -185,7 +185,8 @@ namespace Kernel }; UserProcessSignal ProcessSignal; - UserProcessHeapList* MemoryHeap{nullptr}; + UserProcessHeapList* ProcessMemoryHeap{nullptr}; + UserProcessTeam* ProcessParentTeam; VoidPtr VMRegister{0UL}; @@ -254,19 +255,20 @@ namespace Kernel class UserProcessTeam final { public: - explicit UserProcessTeam() = default; - ~UserProcessTeam() = default; + explicit UserProcessTeam(); + ~UserProcessTeam() = default; ZKA_COPY_DEFAULT(UserProcessTeam); Array<UserProcess*, kSchedProcessLimitPerTeam>& AsArray(); - Ref<UserProcess>& AsRef(); - ProcessID& Id() noexcept; + Ref<UserProcess>& AsRef(); + ProcessID& Id() noexcept; public: Array<UserProcess*, kSchedProcessLimitPerTeam> mProcessList; - Ref<UserProcess> mCurrentProcess; - ProcessID mTeamId{0}; + Ref<UserProcess> mCurrentProcess; + ProcessID mTeamId{0}; + ProcessID mProcessCount{0}; }; using UserProcessPtr = UserProcess*; diff --git a/dev/ZKAKit/KernelKit/UserProcessScheduler.inl b/dev/ZKAKit/KernelKit/UserProcessScheduler.inl index 8da934ed..2973d6a4 100644 --- a/dev/ZKAKit/KernelKit/UserProcessScheduler.inl +++ b/dev/ZKAKit/KernelKit/UserProcessScheduler.inl @@ -11,7 +11,7 @@ namespace Kernel sz == 0) return No; - UserProcessHeapList* entry = this->MemoryHeap; + UserProcessHeapList* entry = this->ProcessMemoryHeap; while (entry != nullptr) { @@ -37,4 +37,4 @@ namespace Kernel return No; } -} // namespace Kernel
\ No newline at end of file +} // namespace Kernel diff --git a/dev/ZKAKit/NewKit/Array.h b/dev/ZKAKit/NewKit/Array.h index b91e5444..ebdd1016 100644 --- a/dev/ZKAKit/NewKit/Array.h +++ b/dev/ZKAKit/NewKit/Array.h @@ -24,11 +24,10 @@ namespace Kernel T& operator[](const SizeT& At) { - MUST_PASS(At < N); return fArray[At]; } - T& Assign(const SizeT& At, T& NewVal) + T Assign(const SizeT& At, T NewVal) { fArray[At] = NewVal; return fArray[At]; diff --git a/dev/ZKAKit/amd64-efi.make b/dev/ZKAKit/amd64-efi.make index dd9567d2..4b7ea261 100644 --- a/dev/ZKAKit/amd64-efi.make +++ b/dev/ZKAKit/amd64-efi.make @@ -58,6 +58,7 @@ newos-amd64-epm: clean $(wildcard HALKit/AMD64/*.cc) $(wildcard src/WS/*.cc) \ $(wildcard HALKit/AMD64/*.s) $(ASM) $(ASMFLAGS) HALKit/AMD64/HalInterruptAPI.asm + $(ASM) $(ASMFLAGS) HALKit/AMD64/HalCommonAPI.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalBoot.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalUtils.asm $(MOVEALL) diff --git a/dev/ZKAKit/src/BitMapMgr.cc b/dev/ZKAKit/src/BitMapMgr.cc index 7e2bed8b..ebe91e88 100644 --- a/dev/ZKAKit/src/BitMapMgr.cc +++ b/dev/ZKAKit/src/BitMapMgr.cc @@ -150,6 +150,12 @@ namespace Kernel }; } // namespace Detail + auto mm_is_bitmap(VoidPtr ptr) -> Bool + { + Detail::IBitMapAllocator traits; + return traits.IsBitMap(ptr); + } + /// @brief Allocate a new page to be used by the OS. /// @param wr read/write bit. /// @param user user bit. diff --git a/dev/ZKAKit/src/CodeMgr.cc b/dev/ZKAKit/src/CodeMgr.cc index f33ed3bf..0f2215d0 100644 --- a/dev/ZKAKit/src/CodeMgr.cc +++ b/dev/ZKAKit/src/CodeMgr.cc @@ -26,7 +26,7 @@ namespace Kernel process_hdr->StackSize = kib_cast(8); rt_set_memory(process_hdr->Name, 0, kProcessNameLen); - rt_copy_memory((VoidPtr)process_name, process_hdr->Name, rt_string_len(process_name) + 1); + rt_copy_memory((VoidPtr)process_name, process_hdr->Name, rt_string_len(process_name)); ProcessID id = UserProcessScheduler::The().Spawn(process_hdr); diff --git a/dev/ZKAKit/src/DriveMgr.cc b/dev/ZKAKit/src/DriveMgr.cc index 4a5754ed..0b527288 100644 --- a/dev/ZKAKit/src/DriveMgr.cc +++ b/dev/ZKAKit/src/DriveMgr.cc @@ -210,7 +210,7 @@ namespace Kernel trait.fInit = io_drv_init; trait.fDriveKind = io_drv_kind; - kcout << "Detect partiton scheme of: " << trait.fName << ".\r"; + kcout << "Detect partition scheme of: " << trait.fName << ".\r"; Detail::ioi_detect_drive(&trait); diff --git a/dev/ZKAKit/src/FS/NeFS.cc b/dev/ZKAKit/src/FS/NeFS.cc index 2f446b73..fd27b475 100644 --- a/dev/ZKAKit/src/FS/NeFS.cc +++ b/dev/ZKAKit/src/FS/NeFS.cc @@ -61,7 +61,7 @@ STATIC MountpointInterface kDiskMountpoint; /// @return the fork /***********************************************************************************/ _Output NFS_FORK_STRUCT* NeFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* catalog, - _Input NFS_FORK_STRUCT& the_fork) + _Input NFS_FORK_STRUCT& the_fork) { if (catalog && the_fork.ForkName[0] != 0 && the_fork.DataSize <= kNeFSForkDataSz) @@ -170,8 +170,8 @@ _Output NFS_FORK_STRUCT* NeFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* catal /// @return the fork. /***********************************************************************************/ _Output NFS_FORK_STRUCT* NeFSParser::FindFork(_Input NFS_CATALOG_STRUCT* catalog, - _Input const Char* name, - Boolean isDataFork) + _Input const Char* name, + Boolean isDataFork) { auto drv = kDiskMountpoint.A(); NFS_FORK_STRUCT* the_fork = nullptr; @@ -236,7 +236,7 @@ _Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name) /// @param kind the catalog kind. /// @return catalog pointer. /***********************************************************************************/ -_Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name, +_Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name, _Input const Int32& flags, _Input const Int32& kind) { @@ -936,7 +936,7 @@ Boolean NeFSParser::RemoveCatalog(_Input const Char* catalogName) VoidPtr NeFSParser::ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, _Input Bool is_rsrc_fork, _Input SizeT dataSz, - _Input const Char* forkName) + _Input const Char* forkName) { if (!catalog) { diff --git a/dev/ZKAKit/src/Heap.cc b/dev/ZKAKit/src/Heap.cc index 4a780521..c23b8725 100644 --- a/dev/ZKAKit/src/Heap.cc +++ b/dev/ZKAKit/src/Heap.cc @@ -10,6 +10,7 @@ #include <NewKit/Crc32.h> #include <NewKit/PageMgr.h> #include <NewKit/Utils.h> +#include <ArchKit/ArchKit.h> /* ------------------------------------------- @@ -266,7 +267,7 @@ namespace Kernel /// @return if it exists. _Output Boolean mm_is_valid_heap(VoidPtr heap_ptr) { - if (heap_ptr) + if (heap_ptr && HAL::mm_is_bitmap(heap_ptr)) { Detail::HEAP_INFORMATION_BLOCK_PTR heap_info_ptr = reinterpret_cast<Detail::HEAP_INFORMATION_BLOCK_PTR>( diff --git a/dev/ZKAKit/src/KernelMain.cc b/dev/ZKAKit/src/KernelMain.cc index d9525e5c..11147a82 100644 --- a/dev/ZKAKit/src/KernelMain.cc +++ b/dev/ZKAKit/src/KernelMain.cc @@ -89,7 +89,7 @@ namespace Kernel::Detail } catalogDir = fNeFS->GetParser()->CreateCatalog(cDirStr[dirIndx], 0, - kNeFSCatalogKindDir); + kNeFSCatalogKindDir); NFS_FORK_STRUCT theFork{0}; diff --git a/dev/ZKAKit/src/PEFCodeMgr.cc b/dev/ZKAKit/src/PEFCodeMgr.cc index 43efa00a..c601abc9 100644 --- a/dev/ZKAKit/src/PEFCodeMgr.cc +++ b/dev/ZKAKit/src/PEFCodeMgr.cc @@ -255,12 +255,12 @@ namespace Kernel UserProcess* proc = new UserProcess(); - proc->Kind = procKind; + proc->Kind = procKind; proc->Image.fCode = errOrStart.Leak().Leak(); proc->Image.fBlob = exec.GetBlob().Leak().Leak(); - proc->StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData); + proc->StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData); proc->MemoryLimit = *(UIntPtr*)exec.FindSymbol(kPefHeapSizeSymbol, kPefData); - proc->PTime = 0UL; + proc->PTime = 0UL; rt_set_memory(proc->Name, 0, kProcessNameLen); @@ -273,7 +273,12 @@ namespace Kernel proc->StackSize = mib_cast(kDefaultStackSizeMib); } - return UserProcessScheduler::The().Spawn(proc); + auto id = UserProcessScheduler::The().Spawn(proc); + + if (id == kProcessInvalidID) + delete proc; + + return id; } } // namespace Utils } // namespace Kernel diff --git a/dev/ZKAKit/src/Stop.cc b/dev/ZKAKit/src/Stop.cc index f2c542f8..43e95ae8 100644 --- a/dev/ZKAKit/src/Stop.cc +++ b/dev/ZKAKit/src/Stop.cc @@ -110,7 +110,10 @@ namespace Kernel Void RecoveryFactory::Recover() noexcept { - HAL::rt_halt(); + while (YES) + { + HAL::rt_halt(); + } } void ke_runtime_check(bool expr, const Char* file, const Char* line) diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc index 906e9a0a..64705f85 100644 --- a/dev/ZKAKit/src/UserProcessScheduler.cc +++ b/dev/ZKAKit/src/UserProcessScheduler.cc @@ -120,23 +120,23 @@ namespace Kernel auto ptr = mm_new_heap(sz + pad_amount, Yes, Yes); #endif - if (!this->MemoryHeap) + if (!this->ProcessMemoryHeap) { - this->MemoryHeap = new UserProcess::UserProcessHeapList(); + this->ProcessMemoryHeap = new UserProcess::UserProcessHeapList(); - this->MemoryHeap->MemoryEntryPad = pad_amount; - this->MemoryHeap->MemoryEntrySize = sz; + this->ProcessMemoryHeap->MemoryEntryPad = pad_amount; + this->ProcessMemoryHeap->MemoryEntrySize = sz; - this->MemoryHeap->MemoryEntry = ptr; + this->ProcessMemoryHeap->MemoryEntry = ptr; - this->MemoryHeap->MemoryPrev = nullptr; - this->MemoryHeap->MemoryNext = nullptr; + this->ProcessMemoryHeap->MemoryPrev = nullptr; + this->ProcessMemoryHeap->MemoryNext = nullptr; return ErrorOr<VoidPtr>(ptr); } else { - UserProcessHeapList* entry = this->MemoryHeap; + UserProcessHeapList* entry = this->ProcessMemoryHeap; UserProcessHeapList* prev_entry = nullptr; while (!entry) @@ -207,7 +207,7 @@ namespace Kernel kLastExitCode = exit_code; - auto memory_heap_list = this->MemoryHeap; + auto memory_heap_list = this->ProcessMemoryHeap; #ifdef __ZKA_AMD64__ auto pd = hal_read_cr3(); @@ -271,6 +271,8 @@ namespace Kernel this->ProcessId = 0; this->Status = ProcessStatusKind::kFinished; + --this->ProcessParentTeam->mProcessCount; + delete this; } @@ -334,22 +336,17 @@ namespace Kernel kcout << "Create stack reserve for: " << process->Name << endl; - ProcessID pid = kProcessInvalidID; + ProcessID pid = mTeam.mProcessCount; - for (SizeT free_pid = 0UL; free_pid < kSchedProcessLimitPerTeam; ++free_pid) - { - if (mTeam.mProcessList[free_pid] && mm_is_valid_heap(mTeam.mProcessList[free_pid]) && mTeam.mProcessList[free_pid]->Status == ProcessStatusKind::kFinished) - { - pid = free_pid; - break; - } - } + if (pid > kSchedProcessLimitPerTeam) + return kProcessInvalidID; + + ++mTeam.mProcessCount; - if (pid == kProcessInvalidID) - return pid; + process->ProcessParentTeam = &mTeam; process->ProcessId = pid; - process->Status = ProcessStatusKind::kRunning; + process->Status = ProcessStatusKind::kStarting; process->PTime = (UIntPtr)AffinityKind::kStandard; kcout << "Process Name: " << process->Name << endl; diff --git a/dev/ZKAKit/src/UserProcessTeam.cc b/dev/ZKAKit/src/UserProcessTeam.cc index 5899f198..5d381020 100644 --- a/dev/ZKAKit/src/UserProcessTeam.cc +++ b/dev/ZKAKit/src/UserProcessTeam.cc @@ -13,6 +13,14 @@ namespace Kernel { + UserProcessTeam::UserProcessTeam() + { + for (SizeT i = 0U; i < mProcessList.Count(); ++i) + { + mProcessList[i] = nullptr; + } + } + /***********************************************************************************/ /// @brief UserProcess list array getter. /// @return The list of process to schedule. |
