summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dev/Modules/FB/Accessibility.h6
-rw-r--r--dev/ZBAKit/amd64-efi.make2
-rw-r--r--dev/ZKAKit/ArchKit/ArchKit.h5
-rw-r--r--dev/ZKAKit/FSKit/NeFS.h12
-rw-r--r--dev/ZKAKit/FirmwareKit/EFI/EFI.h18
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalCPUAMD64.cc12
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalCommonAPI.asm45
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc28
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm3
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc2
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalRoutineWait.s2
-rw-r--r--dev/ZKAKit/HALKit/AMD64/Processor.h6
-rw-r--r--dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc2
-rw-r--r--dev/ZKAKit/HALKit/POWER/HalDebugOutput.cc (renamed from dev/ZKAKit/HALKit/POWER/HalSerialPort.cc)0
-rw-r--r--dev/ZKAKit/KernelKit/LoaderInterface.h6
-rw-r--r--dev/ZKAKit/KernelKit/UserProcessScheduler.h16
-rw-r--r--dev/ZKAKit/KernelKit/UserProcessScheduler.inl4
-rw-r--r--dev/ZKAKit/NewKit/Array.h3
-rw-r--r--dev/ZKAKit/amd64-efi.make1
-rw-r--r--dev/ZKAKit/src/BitMapMgr.cc6
-rw-r--r--dev/ZKAKit/src/CodeMgr.cc2
-rw-r--r--dev/ZKAKit/src/DriveMgr.cc2
-rw-r--r--dev/ZKAKit/src/FS/NeFS.cc10
-rw-r--r--dev/ZKAKit/src/Heap.cc3
-rw-r--r--dev/ZKAKit/src/KernelMain.cc2
-rw-r--r--dev/ZKAKit/src/PEFCodeMgr.cc13
-rw-r--r--dev/ZKAKit/src/Stop.cc5
-rw-r--r--dev/ZKAKit/src/UserProcessScheduler.cc39
-rw-r--r--dev/ZKAKit/src/UserProcessTeam.cc8
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.