summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/INSTALL/.keepme0
-rw-r--r--dev/ZBA/BootKit/BootKit.hxx20
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/BootMain.cxx1
-rw-r--r--dev/ZBA/amd64-efi.make4
-rw-r--r--dev/ZKA/ArchKit/ArchKit.hxx2
-rw-r--r--dev/ZKA/FirmwareKit/Handover.hxx1
-rw-r--r--dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx8
-rw-r--r--dev/ZKA/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx42
-rw-r--r--dev/ZKA/HALKit/AMD64/HalHart.cxx2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm18
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx32
-rw-r--r--dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm37
-rw-r--r--dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalTimer.cxx19
-rw-r--r--dev/ZKA/HALKit/AMD64/HalUtils.asm4
-rw-r--r--dev/ZKA/HALKit/AMD64/PCI/Iterator.cxx11
-rw-r--r--dev/ZKA/HALKit/AMD64/Processor.hxx24
-rw-r--r--dev/ZKA/HALKit/ARM64/HalHart.cxx2
-rw-r--r--dev/ZKA/HALKit/ARM64/HalKernelMain.cxx159
-rw-r--r--dev/ZKA/HALKit/ARM64/HalScheduler.cxx2
-rw-r--r--dev/ZKA/HALKit/ARM64/HalTimer.cxx2
-rw-r--r--dev/ZKA/HALKit/ARM64/Processor.hxx10
-rw-r--r--dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx8
-rw-r--r--dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s4
-rw-r--r--dev/ZKA/KernelKit/ProcessScheduler.hxx12
-rw-r--r--dev/ZKA/Modules/Flash/Flash.hxx4
-rw-r--r--dev/ZKA/NewKit/Array.hxx7
-rw-r--r--dev/ZKA/NewKit/Macros.hxx6
-rw-r--r--dev/ZKA/NewKit/Ref.hxx17
-rw-r--r--dev/ZKA/Sources/DLLMain.cxx12
-rw-r--r--dev/ZKA/Sources/KernelCheck.cxx8
-rw-r--r--dev/ZKA/Sources/MP.cxx46
-rw-r--r--dev/ZKA/Sources/ProcessScheduler.cxx79
-rw-r--r--dev/ZKA/Sources/ProcessTeam.cxx2
-rw-r--r--dev/ZKA/amd64-efi.make2
-rw-r--r--dev/ZKA/arm64-efi.make10
36 files changed, 316 insertions, 303 deletions
diff --git a/dev/INSTALL/.keepme b/dev/INSTALL/.keepme
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/dev/INSTALL/.keepme
diff --git a/dev/ZBA/BootKit/BootKit.hxx b/dev/ZBA/BootKit/BootKit.hxx
index 1d0dca94..6ac87b82 100644
--- a/dev/ZBA/BootKit/BootKit.hxx
+++ b/dev/ZBA/BootKit/BootKit.hxx
@@ -336,17 +336,20 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const Char* partName,
if (strncmp(kNewFSIdent, partBlock.Ident, kNewFSIdentLen) == 0 &&
partBlock.Version != kNewFSVersionInteger)
{
- BTextWriter writer;
- writer.Write(L"newosldr: Disk partition updated.\r");
+ if (partBlock.Version != 0)
+ {
+ BTextWriter writer;
+ writer.Write(L"newosldr: Disk partition updated.\r");
- partBlock.Version = kNewFSVersionInteger;
+ partBlock.Version = kNewFSVersionInteger;
- fDiskDev.Leak().mBase = kNewFSRootCatalogStartAddress;
- fDiskDev.Leak().mSize = sectorSz;
+ fDiskDev.Leak().mBase = kNewFSRootCatalogStartAddress;
+ fDiskDev.Leak().mSize = sectorSz;
- fDiskDev.Write((Char*)&partBlock, sectorSz);
+ fDiskDev.Write((Char*)&partBlock, sectorSz);
- return true;
+ return true;
+ }
}
else if (strncmp(kNewFSIdent, partBlock.Ident, kNewFSIdentLen))
{
@@ -354,7 +357,8 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const Char* partName,
writer.Write(L"newosldr: Disk partition error, not a valid one.\r");
// TODO: Find a way to use EFI::Stop.
- while (1);
+ while (1)
+ ;
}
CopyMem(partBlock.Ident, kNewFSIdent, kNewFSIdentLen - 1);
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
index c8cbe6a7..824cee06 100644
--- a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
+++ b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
@@ -134,6 +134,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
BS->LocateProtocol(&guid_mp, nullptr, reinterpret_cast<VoidPtr*>(&mp));
handoverHdrPtr->f_MultiProcessingEnabled = mp != nullptr;
+ handoverHdrPtr->f_HardwareTables.f_MpPtr = reinterpret_cast<VoidPtr>(mp);
kHandoverHeader = handoverHdrPtr;
diff --git a/dev/ZBA/amd64-efi.make b/dev/ZBA/amd64-efi.make
index f5c19801..3cf9e0f2 100644
--- a/dev/ZBA/amd64-efi.make
+++ b/dev/ZBA/amd64-efi.make
@@ -33,7 +33,7 @@ EMU_FLAGS=-net none -smp 4 -m 8G -M q35 \
-bios $(BIOS) -device piix3-ide,id=ide \
-drive id=disk,file=$(IMG),format=raw,if=none \
-device ide-hd,drive=disk,bus=ide.0 -drive \
- file=fat:rw:Sources/Root/,index=2,format=raw -d int \
+ file=fat:rw:Sources/Root/,index=2,format=raw \
-drive id=disk_2,file=$(IMG_2),if=none \
-device ahci,id=ahci \
-device ide-hd,drive=disk_2,bus=ahci.0
@@ -49,7 +49,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../Vendor -I../ZKA -I../ -c -nostdlib -fno-rtti -fno-exceptions \
- -std=c++20 -D__HAVE_MAHROUSS_APIS__ -D__ZKA_AMD64__ -D__MAHROUSS__
+ -std=c++20 -D__HAVE_ZKA_APIS__ -D__ZKA_AMD64__ -D__ZKA__
BOOT_LOADER=newosldr.exe
KERNEL=newoskrnl.dll
diff --git a/dev/ZKA/ArchKit/ArchKit.hxx b/dev/ZKA/ArchKit/ArchKit.hxx
index 51df2905..f0f3a2ae 100644
--- a/dev/ZKA/ArchKit/ArchKit.hxx
+++ b/dev/ZKA/ArchKit/ArchKit.hxx
@@ -102,4 +102,4 @@ inline Kernel::Array<HAL_SYSCALL_RECORD,
kKerncalls;
EXTERN_C Kernel::HAL::StackFramePtr rt_get_current_context();
-EXTERN_C Kernel::Void rt_do_context_switch(Kernel::HAL::StackFramePtr stack_frame);
+EXTERN_C Kernel::Void mp_do_context_switch(Kernel::HAL::StackFramePtr stack_frame);
diff --git a/dev/ZKA/FirmwareKit/Handover.hxx b/dev/ZKA/FirmwareKit/Handover.hxx
index 2873b954..4cada822 100644
--- a/dev/ZKA/FirmwareKit/Handover.hxx
+++ b/dev/ZKA/FirmwareKit/Handover.hxx
@@ -75,6 +75,7 @@ namespace Kernel::HEL
{
VoidPtr f_SmBios;
VoidPtr f_VendorPtr;
+ VoidPtr f_MpPtr;
} f_HardwareTables;
Bool f_MultiProcessingEnabled;
diff --git a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
index 88b5db36..df2df3b0 100644
--- a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
@@ -52,8 +52,8 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr
{
Kernel::kcout << "newoskrnl: syscall: enter.\r";
- if (kSyscalls[rcx].Leak().Leak()->fHooked)
- (kSyscalls[rcx].Leak().Leak()->fProc)((Kernel::VoidPtr)rdx);
+ if (kSyscalls[rcx].fHooked)
+ (kSyscalls[rcx].fProc)((Kernel::VoidPtr)rdx);
Kernel::kcout << "newoskrnl: syscall: exit.\r";
}
@@ -68,8 +68,8 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr
{
Kernel::kcout << "newoskrnl: kerncall: enter.\r";
- if (kKerncalls[rcx].Leak().Leak()->fHooked)
- (kKerncalls[rcx].Leak().Leak()->fProc)((Kernel::VoidPtr)rdx);
+ if (kKerncalls[rcx].fHooked)
+ (kKerncalls[rcx].fProc)((Kernel::VoidPtr)rdx);
Kernel::kcout << "newoskrnl: kerncall: exit.\r";
}
diff --git a/dev/ZKA/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx b/dev/ZKA/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
index 512ee483..ca38229d 100644
--- a/dev/ZKA/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
@@ -11,11 +11,10 @@
#include <KernelKit/Semaphore.hxx>
#include <KernelKit/ProcessScheduler.hxx>
#include <KernelKit/Timer.hxx>
-
#include <Modules/CoreCG/TextRenderer.hxx>
// Needed for SMP. //
-
+#include <FirmwareKit/EFI.hxx>
#include <KernelKit/MP.hxx>
#define kApicSignature "APIC"
@@ -45,14 +44,12 @@ namespace Kernel::HAL
EXTERN_C Void _hal_spin_core(Void);
- STATIC Void hal_switch_context(HAL::StackFramePtr stack_frame);
-
STATIC struct MADT_TABLE* kMADTBlock = nullptr;
STATIC Bool kSMPAware = false;
STATIC Int64 kSMPCount = 0;
STATIC Int32 cSMPInterrupt = 0;
- STATIC Int64 cSMPCores[cSMPMax] = {0};
+ STATIC UInt64 cSMPCores[cSMPMax] = {0};
STATIC VoidPtr kRawMADT = nullptr;
/// @brief Multiple APIC Descriptor Table.
@@ -136,17 +133,14 @@ namespace Kernel::HAL
Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector);
}
- /// @internal
- EXTERN_C Void hal_ap_startup(Void)
- {
- CGDrawString("100", 10, 50, RGB(0x00, 0x00, 0x00));
- ke_stop(RUNTIME_CHECK_BOOTSTRAP);
- }
+ EXTERN_C Void hal_switch_context(HAL::StackFramePtr stack_frame);
+ /// @brief Called when the AP is ready.
/// @internal
- EXTERN_C Void _hal_switch_context(HAL::StackFramePtr stack_frame)
+ EXTERN_C Void hal_on_ap_startup(HAL::StackFramePtr stack_frame)
{
hal_switch_context(stack_frame);
+ ke_stop(RUNTIME_CHECK_FAILED);
}
constexpr auto cMaxPCBBlocks = cMaxHWThreads;
@@ -162,7 +156,7 @@ namespace Kernel::HAL
return fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_Frame;
}
- STATIC Void hal_switch_context(HAL::StackFramePtr stack_frame)
+ EXTERN_C Void hal_switch_context(HAL::StackFramePtr stack_frame)
{
Semaphore semaphore_process;
@@ -174,7 +168,10 @@ namespace Kernel::HAL
fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_PHB = &ProcessScheduler::The().Leak().TheCurrent().Leak();
fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_Frame = stack_frame;
+ mp_do_context_switch(stack_frame);
+
semaphore_process.Unlock();
+ ke_stop(RUNTIME_CHECK_FAILED);
}
/***********************************************************************************/
@@ -207,19 +204,13 @@ namespace Kernel::HAL
while (Yes)
{
- if (kMADTBlock->List[index].Type == 0 ||
- index > cSMPMax)
+ if (kMADTBlock->List[index].Type > 9 ||
+ kSMPCount > cSMPMax)
break;
switch (kMADTBlock->List[index].Type)
{
- case 0x01: {
- cSMPCores[index] = kMADTBlock->List[index].IOAPIC.IoID;
- kcout << "newoskrnl: Core ID: " << number(cSMPCores[index]) << endl;
- ++kSMPCount;
- break;
- }
- case 0x02: {
+ case 0x00: {
cSMPCores[index] = kMADTBlock->List[index].LAPIC.ProcessorID;
kcout << "newoskrnl: Core ID: " << number(cSMPCores[index]) << endl;
++kSMPCount;
@@ -236,16 +227,15 @@ namespace Kernel::HAL
}
kcout << "newoskrnl: # of cores: " << number(kSMPCount) << endl;
- kcout << "newoskrnl: First core ID: " << number(cSMPCores[0]) << endl;
// Kernel is now SMP aware.
// That means that the scheduler is now available (on MP kernels)
kSMPAware = true;
- // This is used to start the
- hal_send_end_ipi(cSMPCores[0], 0x34, madt_address);
- hal_send_start_ipi(cSMPCores[0], 0x34, madt_address);
+ const auto cStartIPI = 0x34;
+
+ /// TODO: Notify AP core that it must start.
}
}
} // namespace Kernel::HAL
diff --git a/dev/ZKA/HALKit/AMD64/HalHart.cxx b/dev/ZKA/HALKit/AMD64/HalHart.cxx
index bc0a485e..b438f303 100644
--- a/dev/ZKA/HALKit/AMD64/HalHart.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalHart.cxx
@@ -16,7 +16,7 @@ namespace Kernel
{
HAL::rt_cli();
- rt_do_context_switch(stack);
+ mp_do_context_switch(stack);
HAL::rt_sti();
}
diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
index 9a637b8a..5ce9cabc 100644
--- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
@@ -180,13 +180,23 @@ __NEW_INT_51:
sti
iretq
-[extern hal_ap_startup]
+[extern hal_on_ap_startup]
-__NEW_INT_52:
- cli
+PRESENT equ 1 << 7
+NOT_SYS equ 1 << 4
+EXEC equ 1 << 3
+DC equ 1 << 2
+RW equ 1 << 1
+ACCESSED equ 1 << 0
- jmp hal_ap_startup
+; Flags bits
+GRAN_4K equ 1 << 7
+SZ_32 equ 1 << 6
+LONG_MODE equ 1 << 5
+__NEW_INT_52:
+ cli
+ jmp hal_on_ap_startup
sti
ret
diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
index 6be8eeaf..adfd6894 100644
--- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
@@ -141,14 +141,14 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
constexpr auto cLPCOpenMsg = 0x26;
constexpr auto cLPCCloseMsg = 0x27;
- kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ kSyscalls[cTlsInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
if (tls_check_syscall_impl(rdx) == false)
{
Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
};
- kSyscalls[cNewInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ kSyscalls[cNewInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
// get HAC struct.
HEAP_ALLOC_INFO* rdxInf = reinterpret_cast<HEAP_ALLOC_INFO*>(rdx);
@@ -159,7 +159,7 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
rdxInf->fThe = Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().New(rdxInf->fTheSz);
};
- kSyscalls[cDeleteInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ kSyscalls[cDeleteInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
// get HAC struct.
HEAP_ALLOC_INFO* rdxInf = reinterpret_cast<HEAP_ALLOC_INFO*>(rdx);
@@ -170,7 +170,7 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Delete(rdxInf->fThe, rdxInf->fTheSz);
};
- kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ kSyscalls[cTlsInstallInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
PROCESS_BLOCK_INFO* rdxPb = reinterpret_cast<PROCESS_BLOCK_INFO*>(rdx);
if (!rdxPb)
@@ -180,7 +180,7 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
rt_install_tib(rdxPb->fTIB, rdxPb->fGIB);
};
- kSyscalls[cExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ kSyscalls[cExitInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
PROCESS_EXIT_INFO* rdxEi = reinterpret_cast<PROCESS_EXIT_INFO*>(rdx);
if (!rdxEi)
@@ -190,7 +190,7 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Exit(rdxEi->fCode);
};
- kSyscalls[cLastExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ kSyscalls[cLastExitInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
PROCESS_EXIT_INFO* rdxEi = reinterpret_cast<PROCESS_EXIT_INFO*>(rdx);
if (!rdxEi)
@@ -199,24 +199,24 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
rdxEi->fCode = Kernel::sched_get_exit_code();
};
- kSyscalls[cRebootInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ kSyscalls[cRebootInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr);
pow.Reboot();
};
- kSyscalls[cShutdownInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ kSyscalls[cShutdownInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr);
pow.Shutdown();
};
- kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cDeleteInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cNewInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cExitInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cTlsInterrupt].fHooked = true;
+ kSyscalls[cTlsInstallInterrupt].fHooked = true;
+ kSyscalls[cDeleteInterrupt].fHooked = true;
+ kSyscalls[cNewInterrupt].fHooked = true;
+ kSyscalls[cExitInterrupt].fHooked = true;
+ kSyscalls[cLastExitInterrupt].fHooked = true;
+ kSyscalls[cShutdownInterrupt].fHooked = true;
+ kSyscalls[cRebootInterrupt].fHooked = true;
if (kHandoverHeader->f_MultiProcessingEnabled)
Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
index c5af31a0..965d7d07 100644
--- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
+++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
@@ -10,7 +10,7 @@
[bits 64]
[global rt_get_current_context]
-[global rt_do_context_switch]
+[global mp_do_context_switch]
[global _hal_spin_core]
[extern _hal_switch_context]
[extern _hal_leak_current_context]
@@ -20,20 +20,10 @@ section .text
;; writes to rdx the stackframe inside rcx.
;; rcx: Stack Pointer
;; rdx: SMP core address.
-rt_do_context_switch:
- push rcx
- call _hal_switch_context
- pop rcx
-
- ;; Now grab newly allocated process's stack frame.
- push rax
- call _hal_leak_current_context
- mov r9, rax
- pop rax
-
+mp_do_context_switch:
;; Take care of context switching within AP.
- mov r9, rax
+ mov r9, rcx
mov rbp, [r9 + (8 * 5)]
mov rsp, [r9 + (8 * 6)]
@@ -60,7 +50,26 @@ rt_do_context_switch:
mov r9, [r9 + (8 * 12)]
- retfq
+ ; User code selector is 0x20 btw (Amlal).
+
+ mov ax, 0x23
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+
+ push 0x23
+ push rsp
+
+ pushfq
+ pop rax
+ or rax, 0x200
+ push rax
+
+ push 0x20
+ push rbp
+
+ iretq
;; gets the current stack frame.
rt_get_current_context:
diff --git a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
index 51cbfe4b..072c09be 100644
--- a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
@@ -19,7 +19,7 @@ Void PROCESS_HEADER_BLOCK::SetEntrypoint(UIntPtr& imageStart) noexcept
namespace Kernel
{
- bool rt_check_stack(HAL::StackFramePtr stackPtr)
+ bool hal_check_stack(HAL::StackFramePtr stackPtr)
{
if (!stackPtr)
return false;
diff --git a/dev/ZKA/HALKit/AMD64/HalTimer.cxx b/dev/ZKA/HALKit/AMD64/HalTimer.cxx
index f88d1143..4bc19801 100644
--- a/dev/ZKA/HALKit/AMD64/HalTimer.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalTimer.cxx
@@ -17,9 +17,10 @@
// timer slot 0
-#define cHPETCounterValue (0x0f0 * 0x20)
-#define cHPETConfigValue (0x010 * 0x20)
-#define cHPETCompValue (0x108 * 0x20)
+#define cHPETCounterRegValue (0x00)
+#define cHPETConfigRegValue (0x20)
+#define cHPETCompRegValue (0x24)
+#define cHPETInterruptRegValue (0x2C)
///! BUGS: 0
///! @file HalTimer.cxx
@@ -67,19 +68,19 @@ Int32 HardwareTimer::Wait() noexcept
return -1;
// if not enabled yet.
- if (!(*(fDigitalTimer + cHPETConfigValue) & (1 << 0)))
+ if (!(*(fDigitalTimer + cHPETConfigRegValue) & (1 << 0)))
{
- *(fDigitalTimer + cHPETConfigValue) |= (1 << 0); // enable it
- *(fDigitalTimer + cHPETConfigValue) |= (1 << 3); // one shot conf
+ *(fDigitalTimer + cHPETConfigRegValue) |= (1 << 0); // enable it
+ *(fDigitalTimer + cHPETConfigRegValue) |= (1 << 3); // one shot conf
}
UInt64 ticks = fWaitFor / ((*(fDigitalTimer) >> 32) & __UINT32_MAX__);
- auto prev = *(fDigitalTimer + cHPETCounterValue);
+ auto prev = *(fDigitalTimer + cHPETCounterRegValue);
- *(fDigitalTimer + cHPETCompValue) = prev + ticks;
+ prev += ticks;
- while (*(fDigitalTimer + cHPETCounterValue) < (ticks));
+ while (*(fDigitalTimer + cHPETCounterRegValue) < (ticks));
return 0;
}
diff --git a/dev/ZKA/HALKit/AMD64/HalUtils.asm b/dev/ZKA/HALKit/AMD64/HalUtils.asm
index 1793db8f..0e4caf2b 100644
--- a/dev/ZKA/HALKit/AMD64/HalUtils.asm
+++ b/dev/ZKA/HALKit/AMD64/HalUtils.asm
@@ -25,9 +25,9 @@ rt_install_tib:
[extern cBspDone]
[extern kApicMadtAddressesCount]
-[extern hal_ap_startup]
+[extern hal_on_ap_startup]
[global hal_ap_trampoline]
hal_ap_trampoline:
hal_ap_trampoline_1:
- jmp hal_ap_startup
+ jmp hal_on_ap_startup
diff --git a/dev/ZKA/HALKit/AMD64/PCI/Iterator.cxx b/dev/ZKA/HALKit/AMD64/PCI/Iterator.cxx
index 20a94115..ea38e717 100644
--- a/dev/ZKA/HALKit/AMD64/PCI/Iterator.cxx
+++ b/dev/ZKA/HALKit/AMD64/PCI/Iterator.cxx
@@ -6,10 +6,6 @@
#include <KernelKit/PCI/Iterator.hxx>
-#define PCI_ITERATOR_FIND_AND_UNWRAP(DEV, SZ) \
- if (DEV.Leak().Leak()) \
- return *DEV.Leak().Leak();
-
namespace Kernel::PCI
{
Iterator::Iterator(const Types::PciDeviceKind& type)
@@ -25,7 +21,7 @@ namespace Kernel::PCI
if (dev.Class() == (UChar)type)
{
- *fDevices[bus].Leak().Leak() = dev;
+ fDevices[bus] = dev;
}
}
}
@@ -36,9 +32,8 @@ namespace Kernel::PCI
{
}
- Ref<PCI::Device> Iterator::operator[](const Size& sz)
+ Ref<PCI::Device> Iterator::operator[](const Size& at)
{
- PCI_ITERATOR_FIND_AND_UNWRAP(fDevices[sz], sz);
- return {};
+ return fDevices[at];
}
} // namespace Kernel::PCI
diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx
index 93540c34..2a42a105 100644
--- a/dev/ZKA/HALKit/AMD64/Processor.hxx
+++ b/dev/ZKA/HALKit/AMD64/Processor.hxx
@@ -262,22 +262,22 @@ namespace Kernel::HAL
struct PACKED NewOSGDTRecord final
{
- UInt16 Limit0;
- UInt16 Base0;
- UInt8 Base1;
- UInt8 AccessByte;
- UInt8 Limit1_Flags;
- UInt8 Base2;
+ UInt16 fLimit0;
+ UInt16 fBase0;
+ UInt8 fBase1;
+ UInt8 fAccessByte;
+ UInt8 fLimit1_Flags;
+ UInt8 fBase2;
};
struct PACKED ALIGN(0x1000) NewOSGDT final
{
- NewOSGDTRecord Null;
- NewOSGDTRecord KernCode;
- NewOSGDTRecord KernData;
- NewOSGDTRecord UserNull;
- NewOSGDTRecord UserCode;
- NewOSGDTRecord UserData;
+ NewOSGDTRecord fNull;
+ NewOSGDTRecord fKernCode;
+ NewOSGDTRecord fKernData;
+ NewOSGDTRecord fUserNull;
+ NewOSGDTRecord fUserCode;
+ NewOSGDTRecord fUserData;
};
} // namespace Detail
diff --git a/dev/ZKA/HALKit/ARM64/HalHart.cxx b/dev/ZKA/HALKit/ARM64/HalHart.cxx
index d2a91bf3..68672595 100644
--- a/dev/ZKA/HALKit/ARM64/HalHart.cxx
+++ b/dev/ZKA/HALKit/ARM64/HalHart.cxx
@@ -14,7 +14,7 @@ namespace Kernel
/// wakes up thread from hang.
void mp_wakeup_thread(HAL::StackFrame* stack)
{
- rt_do_context_switch(stack);
+ mp_do_context_switch(stack);
}
/// @brief makes the thread sleep on a loop.
diff --git a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
index 129170f7..c2886b31 100644
--- a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
@@ -18,22 +18,27 @@
#include <KernelKit/CodeManager.hxx>
#include <Modules/ACPI/ACPIFactoryInterface.hxx>
#include <NetworkKit/IPC.hxx>
+#include <CFKit/Property.hxx>
+#include <Modules/CoreCG/TextRenderer.hxx>
-EXTERN_C Kernel::VoidPtr kInterruptVectorTable[];
+Kernel::Property cKernelVersion;
+Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser};
-struct PACKED HeapAllocInfo final
+EXTERN Kernel::Boolean kAllocationInProgress;
+
+struct HEAP_ALLOC_INFO final
{
Kernel::VoidPtr fThe;
Kernel::Size fTheSz;
};
-struct PACKED ProcessBlockInfo final
+struct PROCESS_BLOCK_INFO final
{
THREAD_INFORMATION_BLOCK* fTIB;
- THREAD_INFORMATION_BLOCK* fPIB;
+ THREAD_INFORMATION_BLOCK* fGIB;
};
-struct PACKED ProcessExitInfo final
+struct PROCESS_EXIT_INFO final
{
STATIC constexpr auto cReasonLen = 512;
@@ -41,6 +46,16 @@ struct PACKED ProcessExitInfo final
Kernel::Char fReason[cReasonLen];
};
+namespace Kernel::HAL
+{
+ /// @brief Gets the system cores using the MADT.
+ /// @param rsdPtr The 'RSD PTR' data structure.
+ EXTERN void hal_system_get_cores(Kernel::voidPtr rsdPtr);
+} // namespace Kernel::HAL
+
+Kernel::Void hal_real_init(Kernel::Void) noexcept;
+EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void);
+
EXTERN_C void hal_init_platform(
Kernel::HEL::HandoverInformationHeader* HandoverHeader)
{
@@ -54,38 +69,46 @@ EXTERN_C void hal_init_platform(
return;
}
- kKernelVirtualSize = HandoverHeader->f_VirtualSize;
+ hal_real_init();
+}
+
+Kernel::Void hal_real_init(Kernel::Void) noexcept
+{
+ // reset kAllocationInProgress field to zero.
+ kAllocationInProgress = false;
+
+ kKernelVMHStart = kHandoverHeader->f_HeapStart;
+
+ // get page size.
+ kKernelVirtualSize = kHandoverHeader->f_VirtualSize;
+
+ // get virtual address start (for the heap)
kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>(
- reinterpret_cast<Kernel::UIntPtr>(HandoverHeader->f_VirtualStart) + cHeapStartOffset);
-
- kKernelPhysicalStart = HandoverHeader->f_PhysicalStart;
-
- // Register the basic SCI functions.
-
- constexpr auto cSerialAlertInterrupt = 0x10;
- constexpr auto cTlsInterrupt = 0x11;
- constexpr auto cTlsInstallInterrupt = 0x12;
- constexpr auto cNewInterrupt = 0x13;
- constexpr auto cDeleteInterrupt = 0x14;
- constexpr auto cExitInterrupt = 0x15;
- constexpr auto cLastExitInterrupt = 0x16;
- constexpr auto cCatalogOpen = 0x17;
- constexpr auto cForkRead = 0x18;
- constexpr auto cForkWrite = 0x19;
- constexpr auto cCatalogClose = 0x20;
- constexpr auto cCatalogRemove = 0x21;
- constexpr auto cCatalogCreate = 0x22;
- constexpr auto cRebootInterrupt = 0x23;
- constexpr auto cShutdownInterrupt = 0x24;
- constexpr auto cLPCSendMsg = 0x25;
- constexpr auto cLPCOpenMsg = 0x26;
- constexpr auto cLPCCloseMsg = 0x27;
- constexpr auto cLPCSanitizeMsg = 0x28;
-
- kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- const Kernel::Char* msg = (const Kernel::Char*)rdx;
- Kernel::kcout << "Kernel: " << msg << "\r";
- };
+ reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_VirtualStart));
+
+ // get physical address start.
+ kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>(
+ reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_PhysicalStart));
+
+ // Register the basic system calls.
+
+ constexpr auto cTlsInterrupt = 0x11;
+ constexpr auto cTlsInstallInterrupt = 0x12;
+ constexpr auto cNewInterrupt = 0x13;
+ constexpr auto cDeleteInterrupt = 0x14;
+ constexpr auto cExitInterrupt = 0x15;
+ constexpr auto cLastExitInterrupt = 0x16;
+ constexpr auto cCatalogOpen = 0x17;
+ constexpr auto cForkRead = 0x18;
+ constexpr auto cForkWrite = 0x19;
+ constexpr auto cCatalogClose = 0x20;
+ constexpr auto cCatalogRemove = 0x21;
+ constexpr auto cCatalogCreate = 0x22;
+ constexpr auto cRebootInterrupt = 0x23;
+ constexpr auto cShutdownInterrupt = 0x24;
+ constexpr auto cLPCSendMsg = 0x25;
+ constexpr auto cLPCOpenMsg = 0x26;
+ constexpr auto cLPCCloseMsg = 0x27;
kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
if (tls_check_syscall_impl(rdx) == false)
@@ -94,13 +117,9 @@ EXTERN_C void hal_init_platform(
}
};
- kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- Kernel::ipc_sanitize_packet(reinterpret_cast<Kernel::IPC_MESSAGE_STRUCT*>(rdx));
- };
-
kSyscalls[cNewInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
// get HAC struct.
- HeapAllocInfo* rdxInf = reinterpret_cast<HeapAllocInfo*>(rdx);
+ HEAP_ALLOC_INFO* rdxInf = reinterpret_cast<HEAP_ALLOC_INFO*>(rdx);
if (!rdxInf)
return;
@@ -111,7 +130,7 @@ EXTERN_C void hal_init_platform(
kSyscalls[cDeleteInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
// get HAC struct.
- HeapAllocInfo* rdxInf = reinterpret_cast<HeapAllocInfo*>(rdx);
+ HEAP_ALLOC_INFO* rdxInf = reinterpret_cast<HEAP_ALLOC_INFO*>(rdx);
if (!rdxInf)
return;
@@ -121,17 +140,17 @@ EXTERN_C void hal_init_platform(
};
kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- ProcessBlockInfo* rdxPb = reinterpret_cast<ProcessBlockInfo*>(rdx);
+ PROCESS_BLOCK_INFO* rdxPb = reinterpret_cast<PROCESS_BLOCK_INFO*>(rdx);
if (!rdxPb)
return;
- // install the fTIB and fPIB.
- rt_install_tib(rdxPb->fTIB, rdxPb->fPIB);
+ // install the fTIB and fGIB.
+ rt_install_tib(rdxPb->fTIB, rdxPb->fGIB);
};
kSyscalls[cExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- ProcessExitInfo* rdxEi = reinterpret_cast<ProcessExitInfo*>(rdx);
+ PROCESS_EXIT_INFO* rdxEi = reinterpret_cast<PROCESS_EXIT_INFO*>(rdx);
if (!rdxEi)
return;
@@ -141,7 +160,7 @@ EXTERN_C void hal_init_platform(
};
kSyscalls[cLastExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- ProcessExitInfo* rdxEi = reinterpret_cast<ProcessExitInfo*>(rdx);
+ PROCESS_EXIT_INFO* rdxEi = reinterpret_cast<PROCESS_EXIT_INFO*>(rdx);
if (!rdxEi)
return;
@@ -150,23 +169,41 @@ EXTERN_C void hal_init_platform(
};
kSyscalls[cRebootInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_VendorPtr);
- acpi.Reboot();
+ Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr);
+ pow.Reboot();
};
kSyscalls[cShutdownInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_VendorPtr);
- acpi.Shutdown();
+ Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr);
+ pow.Shutdown();
};
- kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cDeleteInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cNewInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cExitInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fHooked = true;
+ kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cDeleteInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cNewInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cExitInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true;
+
+ if (kHandoverHeader->f_MultiProcessingEnabled)
+ Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
+
+ Kernel::kcout << "newoskrnl: Creating filesystem and such.\r";
+
+ auto fs = new Kernel::NewFilesystemManager();
+
+ MUST_PASS(fs);
+ MUST_PASS(fs->GetParser());
+
+ Kernel::NewFilesystemManager::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/ARM64/HalScheduler.cxx b/dev/ZKA/HALKit/ARM64/HalScheduler.cxx
index 51cbfe4b..072c09be 100644
--- a/dev/ZKA/HALKit/ARM64/HalScheduler.cxx
+++ b/dev/ZKA/HALKit/ARM64/HalScheduler.cxx
@@ -19,7 +19,7 @@ Void PROCESS_HEADER_BLOCK::SetEntrypoint(UIntPtr& imageStart) noexcept
namespace Kernel
{
- bool rt_check_stack(HAL::StackFramePtr stackPtr)
+ bool hal_check_stack(HAL::StackFramePtr stackPtr)
{
if (!stackPtr)
return false;
diff --git a/dev/ZKA/HALKit/ARM64/HalTimer.cxx b/dev/ZKA/HALKit/ARM64/HalTimer.cxx
index ef907e4f..4ef87227 100644
--- a/dev/ZKA/HALKit/ARM64/HalTimer.cxx
+++ b/dev/ZKA/HALKit/ARM64/HalTimer.cxx
@@ -13,4 +13,4 @@
#include <ArchKit/ArchKit.hxx>
-struct TimerInfoStruct;
+struct TIMER_INFO;
diff --git a/dev/ZKA/HALKit/ARM64/Processor.hxx b/dev/ZKA/HALKit/ARM64/Processor.hxx
index 16e9ec8c..985dfe64 100644
--- a/dev/ZKA/HALKit/ARM64/Processor.hxx
+++ b/dev/ZKA/HALKit/ARM64/Processor.hxx
@@ -19,12 +19,6 @@
#define kCPUBackendName "ARMv8"
-#ifdef __ZETA_MACHINE__
-#define cHeapStartOffset (0x10000000)
-#else
-#error !!! please provide that macro. !!!
-#endif
-
namespace Kernel::HAL
{
struct PACKED Register64 final
@@ -48,7 +42,9 @@ namespace Kernel::HAL
typedef StackFrame* StackFramePtr;
} // namespace Kernel::HAL
-inline Kernel::VoidPtr kKernelVirtualStart = (Kernel::VoidPtr)cHeapStartOffset;
+
+inline Kernel::VoidPtr kKernelVMHStart = nullptr;
+inline Kernel::VoidPtr kKernelVirtualStart = nullptr;
inline Kernel::UIntPtr kKernelVirtualSize = 0UL;
inline Kernel::VoidPtr kKernelPhysicalStart = nullptr;
diff --git a/dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx b/dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx
index cc7802cb..ac17d658 100644
--- a/dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx
+++ b/dev/ZKA/HALKit/ARM64/Storage/HalFlash.cxx
@@ -10,7 +10,7 @@
/// @file Flash.cxx
/// @brief Flash memory builtin.
-#ifdef __FLASH_MEM__
+#ifdef __USE_MBCI_FLASH__
#define cMaxFlash (4U)
@@ -53,14 +53,14 @@ namespace Kernel
/// @brief Enable flash memory at slot.
STATIC Void drv_enable_flash(Int32 arg)
{
- kcout << "newoskrnl: enabled hardware.\r";
+ kcout << "newoskrnl: Enabled FLSH hardware.\r";
}
/// @brief Disable flash memory at slot.
STATIC Void drv_disable_flash(Int32 arg)
{
- kcout << "newoskrnl: disabled hardware.\r";
+ kcout << "newoskrnl: Disabled FLSH hardware.\r";
}
} // namespace Kernel
-#endif // if __FLASH_MEM__ (Bridge)
+#endif // if __USE_MBCI_FLASH__ (Bridge)
diff --git a/dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s b/dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s
index fc47ba49..9a9c3aa6 100644
--- a/dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s
+++ b/dev/ZKA/HALKit/POWER/HalContextSwitchPowerPC.s
@@ -7,10 +7,10 @@
.align 4
.type name, @function
.text
-.globl rt_do_context_switch
+.globl mp_do_context_switch
/* r3 (3) = assigner stack, r4 (4) = assignee stack */
-rt_do_context_switch:
+mp_do_context_switch:
lwz 0(%4), 0(%3)
lwz 4(%4), 4(%3)
lwz 8(%4), 8(%3)
diff --git a/dev/ZKA/KernelKit/ProcessScheduler.hxx b/dev/ZKA/KernelKit/ProcessScheduler.hxx
index b25e0efc..e0dc326b 100644
--- a/dev/ZKA/KernelKit/ProcessScheduler.hxx
+++ b/dev/ZKA/KernelKit/ProcessScheduler.hxx
@@ -233,12 +233,12 @@ namespace Kernel
ZKA_COPY_DEFAULT(ProcessTeam);
- MutableArray<Ref<PROCESS_HEADER_BLOCK>>& AsArray();
+ Array<PROCESS_HEADER_BLOCK, kSchedProcessLimitPerTeam>& AsArray();
Ref<PROCESS_HEADER_BLOCK>& AsRef();
UInt64& Id() noexcept;
public:
- MutableArray<Ref<PROCESS_HEADER_BLOCK>> mProcessList;
+ Array<PROCESS_HEADER_BLOCK, kSchedProcessLimitPerTeam> mProcessList;
Ref<PROCESS_HEADER_BLOCK> mCurrentProcess;
UInt64 mTeamId{0};
};
@@ -263,7 +263,7 @@ namespace Kernel
ProcessTeam& CurrentTeam();
public:
- SizeT Add(Ref<PROCESS_HEADER_BLOCK>& processRef);
+ SizeT Add(Ref<PROCESS_HEADER_BLOCK> processRef);
Bool Remove(SizeT processSlot);
public:
@@ -278,14 +278,14 @@ namespace Kernel
};
/*
- * Just a helper class, which contains some utilities for the scheduler.
+ * \brief Process helper class, which contains needed utilities for the scheduler.
*/
class ProcessHelper final
{
public:
- STATIC bool Switch(HAL::StackFrame* newStack, const PID& newPid);
- STATIC bool CanBeScheduled(Ref<PROCESS_HEADER_BLOCK>& process);
+ STATIC bool Switch(HAL::StackFramePtr new_stack, const PID& new_pid);
+ STATIC bool CanBeScheduled(PROCESS_HEADER_BLOCK& process);
STATIC PID& TheCurrentPID();
STATIC SizeT StartScheduling();
};
diff --git a/dev/ZKA/Modules/Flash/Flash.hxx b/dev/ZKA/Modules/Flash/Flash.hxx
index b5878d6d..a16f5a6d 100644
--- a/dev/ZKA/Modules/Flash/Flash.hxx
+++ b/dev/ZKA/Modules/Flash/Flash.hxx
@@ -6,7 +6,7 @@
#pragma once
-#ifdef __FLASH_MEM__
+#ifdef __USE_MBCI_FLASH__
#include <NewKit/Defines.hxx>
@@ -18,4 +18,4 @@ Kernel::SizeT drv_std_get_sector_count();
/// @return drive size
Kernel::SizeT drv_std_get_drv_size();
-#endif // ifdef __FLASH_MEM__
+#endif // ifdef __USE_MBCI_FLASH__
diff --git a/dev/ZKA/NewKit/Array.hxx b/dev/ZKA/NewKit/Array.hxx
index 1a2f6e86..dcb6aede 100644
--- a/dev/ZKA/NewKit/Array.hxx
+++ b/dev/ZKA/NewKit/Array.hxx
@@ -21,12 +21,9 @@ namespace Kernel
Array& operator=(const Array&) = default;
Array(const Array&) = default;
- ErrorOr<T*> operator[](Size At)
+ T& operator[](const SizeT& At)
{
- if (At > N)
- return {};
-
- return ErrorOr<T*>(&fArray[At]);
+ return (fArray[At]);
}
Boolean Empty() const
diff --git a/dev/ZKA/NewKit/Macros.hxx b/dev/ZKA/NewKit/Macros.hxx
index db9d6ad9..2ecf2319 100644
--- a/dev/ZKA/NewKit/Macros.hxx
+++ b/dev/ZKA/NewKit/Macros.hxx
@@ -52,9 +52,9 @@
#define ATTRIBUTE(X) __attribute__((X))
#endif // #ifndef ATTRIBUTE
-#ifndef __MAHROUSS_VER__
-#define __MAHROUSS_VER__ (2024)
-#endif // !__MAHROUSS_VER__
+#ifndef __ZKA_VER__
+#define __ZKA_VER__ (2024)
+#endif // !__ZKA_VER__
#ifndef EXTERN_C
#define EXTERN_C extern "C"
diff --git a/dev/ZKA/NewKit/Ref.hxx b/dev/ZKA/NewKit/Ref.hxx
index 14d66f0a..3764611c 100644
--- a/dev/ZKA/NewKit/Ref.hxx
+++ b/dev/ZKA/NewKit/Ref.hxx
@@ -10,6 +10,7 @@
#include <NewKit/Defines.hxx>
#include <NewKit/KernelCheck.hxx>
+#include <KernelKit/Heap.hxx>
namespace Kernel
{
@@ -18,14 +19,7 @@ namespace Kernel
{
public:
Ref() = default;
-
- ~Ref()
- {
- if (fStrong)
- {
- fClass = nullptr;
- }
- }
+ ~Ref() = default;
public:
Ref(T cls, const bool& strong = false)
@@ -35,12 +29,15 @@ namespace Kernel
Ref& operator=(T ref)
{
+ if (!fClass)
+ fClass = (T*)mm_new_ke_heap(sizeof(T), false, false);
+
*fClass = ref;
return *this;
}
public:
- T operator->() const
+ T& operator->() const
{
return *fClass;
}
@@ -72,7 +69,7 @@ namespace Kernel
}
private:
- T* fClass;
+ T* fClass{nullptr};
Bool fStrong{false};
};
diff --git a/dev/ZKA/Sources/DLLMain.cxx b/dev/ZKA/Sources/DLLMain.cxx
index 8562ba09..0cecc820 100644
--- a/dev/ZKA/Sources/DLLMain.cxx
+++ b/dev/ZKA/Sources/DLLMain.cxx
@@ -23,6 +23,7 @@
#include <NewKit/String.hxx>
#include <NewKit/Utils.hxx>
#include <KernelKit/PEFCodeManager.hxx>
+#include <KernelKit/CodeManager.hxx>
#include <CFKit/Property.hxx>
#include <Modules/CoreCG/WindowRenderer.hxx>
#include <KernelKit/Timer.hxx>
@@ -213,8 +214,11 @@ EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void)
CG::CGDrawStringToWnd(cKernelWnd, "newoskrnl.dll: Starting ZKA...", 30, 10, RGB(0, 0, 0));
- while (Yes)
- {
- Kernel::ProcessHelper::StartScheduling();
- }
+ Kernel::ProcessHelper::StartScheduling();
+
+ Kernel::execute_from_image([]() -> void {
+ },
+ "ZKA Logger");
+
+ Kernel::ProcessHelper::StartScheduling();
}
diff --git a/dev/ZKA/Sources/KernelCheck.cxx b/dev/ZKA/Sources/KernelCheck.cxx
index 3057fe65..85cfe215 100644
--- a/dev/ZKA/Sources/KernelCheck.cxx
+++ b/dev/ZKA/Sources/KernelCheck.cxx
@@ -114,8 +114,8 @@ namespace Kernel
}
};
- while (Yes)
- ;
+ PowerFactoryInterface power(nullptr);
+ power.Reboot();
}
Void RecoveryFactory::Recover() noexcept
@@ -125,8 +125,10 @@ namespace Kernel
HardwareTimer timer(cMaxSeconds);
timer.Wait();
+ kcout << "newoskrnl: Shutting down...\r";
+
PowerFactoryInterface power(nullptr);
- power.Reboot();
+ power.Shutdown();
}
void ke_runtime_check(bool expr, const Char* file, const Char* line)
diff --git a/dev/ZKA/Sources/MP.cxx b/dev/ZKA/Sources/MP.cxx
index da92a8c6..89b5f01d 100644
--- a/dev/ZKA/Sources/MP.cxx
+++ b/dev/ZKA/Sources/MP.cxx
@@ -76,7 +76,10 @@ namespace Kernel
mp_wakeup_thread(fStack);
}
- EXTERN Bool rt_check_stack(HAL::StackFramePtr stackPtr);
+ /// @note Those symbols are needed in order to switch and validate the stack.
+
+ EXTERN Bool hal_check_stack(HAL::StackFramePtr stackPtr);
+ EXTERN_C Void hal_switch_context(HAL::StackFramePtr stackPtr);
/// @brief Switch to hardware thread.
/// @param stack the new hardware thread.
@@ -93,7 +96,7 @@ namespace Kernel
return true;
}
- if (!rt_check_stack(stack))
+ if (!hal_check_stack(stack))
{
return false;
}
@@ -106,7 +109,7 @@ namespace Kernel
fStack = stack;
- rt_do_context_switch(fStack);
+ hal_switch_context(fStack);
return true;
}
@@ -144,12 +147,7 @@ namespace Kernel
/// @brief Get Stack Frame of Core
HAL::StackFramePtr HardwareThreadScheduler::Leak() noexcept
{
- if (fThreadList[fCurrentThread].Leak() &&
- ProcessHelper::TheCurrentPID() ==
- fThreadList[fCurrentThread].Leak().Leak()->fSourcePID)
- return fThreadList[fCurrentThread].Leak().Leak()->fStack;
-
- return nullptr;
+ return fThreadList[fCurrentThread].fStack;
}
/// @brief Finds and switch to a free core.
@@ -161,36 +159,36 @@ namespace Kernel
for (SizeT idx = 0; idx < cMaxHWThreads; ++idx)
{
// stack != nullptr -> if core is used, then continue.
- if (!fThreadList[idx].Leak() ||
- !fThreadList[idx].Leak().Leak()->IsWakeup() ||
- fThreadList[idx].Leak().Leak()->IsBusy())
+ if (!fThreadList[idx] ||
+ !fThreadList[idx].IsWakeup() ||
+ fThreadList[idx].IsBusy())
continue;
// to avoid any null deref.
- if (!fThreadList[idx].Leak().Leak()->fStack)
+ if (!fThreadList[idx].fStack)
continue;
- if (fThreadList[idx].Leak().Leak()->fStack->SP == 0)
+ if (fThreadList[idx].fStack->SP == 0)
continue;
- if (fThreadList[idx].Leak().Leak()->fStack->BP == 0)
+ if (fThreadList[idx].fStack->BP == 0)
continue;
- fThreadList[idx].Leak().Leak()->Busy(true);
+ fThreadList[idx].Busy(true);
- fThreadList[idx].Leak().Leak()->fID = idx;
+ fThreadList[idx].fID = idx;
/// I figured out this:
/// Allocate stack
/// Set APIC base to stack
/// Do stuff and relocate stack based on this code.
/// - Amlel
- rt_copy_memory(stack, fThreadList[idx].Leak().Leak()->fStack,
+ rt_copy_memory(stack, fThreadList[idx].fStack,
sizeof(HAL::StackFrame));
- fThreadList[idx].Leak().Leak()->Switch(fThreadList[idx].Leak().Leak()->fStack);
+ fThreadList[idx].Switch(fThreadList[idx].fStack);
- fThreadList[idx].Leak().Leak()->fSourcePID = ProcessHelper::TheCurrentPID();
+ fThreadList[idx].fSourcePID = ProcessHelper::TheCurrentPID();
- fThreadList[idx].Leak().Leak()->Busy(false);
+ fThreadList[idx].Busy(false);
return true;
}
@@ -207,9 +205,9 @@ namespace Kernel
{
if (idx == 0)
{
- if (fThreadList[idx].Leak().Leak()->Kind() != kHartSystemReserved)
+ if (fThreadList[idx].Kind() != kHartSystemReserved)
{
- fThreadList[idx].Leak().Leak()->fKind = kHartBoot;
+ fThreadList[idx].fKind = kHartBoot;
}
}
else if (idx >= cMaxHWThreads)
@@ -226,7 +224,7 @@ namespace Kernel
return {fakeThread};
}
- return fThreadList[idx].Leak();
+ return &fThreadList[idx];
}
/**
diff --git a/dev/ZKA/Sources/ProcessScheduler.cxx b/dev/ZKA/Sources/ProcessScheduler.cxx
index 2198cd42..bf2cdbd3 100644
--- a/dev/ZKA/Sources/ProcessScheduler.cxx
+++ b/dev/ZKA/Sources/ProcessScheduler.cxx
@@ -211,7 +211,7 @@ namespace Kernel
/// @brief Add process to list.
/// @param process the process *Ref* class.
/// @return the process index inside the team.
- SizeT ProcessScheduler::Add(Ref<PROCESS_HEADER_BLOCK>& process)
+ SizeT ProcessScheduler::Add(Ref<PROCESS_HEADER_BLOCK> process)
{
if (!process.Leak().Image)
{
@@ -224,24 +224,17 @@ namespace Kernel
if (mTeam.AsArray().Count() > kSchedProcessLimitPerTeam)
return -kErrorOutOfTeamSlot;
- kcout << "ProcessScheduler:: adding process to team...\r";
-
- if (process.Leak().GetOwner() == nullptr)
- {
- // Something went wrong, do not continue, process may be incorrect.
- process.Leak().Crash();
- return -kErrorProcessFault;
- }
+ kcout << "ProcessScheduler: Adding process to team...\r";
// Create heap according to type of process.
if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kAppKind)
{
- process.Leak().HeapPtr = sched_new_heap(kProcessHeapUser | kProcessHeapRw, process.Leak().SizeMemory);
+ process.Leak().HeapPtr = mm_new_ke_heap(process.Leak().SizeMemory, true, true);
}
else if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind)
{
- process.Leak().DLLPtr = rtl_init_shared_object(&process.Leak());
- process.Leak().HeapPtr = sched_new_heap(kProcessHeapUser | kProcessHeapRw | kProcessHeapShared, process.Leak().SizeMemory);
+ process.Leak().DLLPtr = rtl_init_shared_object(&process.Leak());
+ process.Leak().HeapPtr = mm_new_ke_heap(process.Leak().SizeMemory, true, true);
}
else
{
@@ -276,7 +269,9 @@ namespace Kernel
process.Leak().ProcessId = (mTeam.AsArray().Count() - 1);
process.Leak().HeapCursor = process.Leak().HeapPtr;
- MUST_PASS(mTeam.AsArray().Add(process));
+ mTeam.AsArray()[process.Leak().ProcessId] = process.Leak();
+
+ kcout << "ProcessScheduler: Adding process to team [ OK ]...\r";
return (mTeam.AsArray().Count() - 1);
}
@@ -302,12 +297,13 @@ namespace Kernel
return false;
// also check if the process isn't a dummy one.
- if (mTeam.AsArray()[processSlot].Leak().Leak().Image == nullptr)
+ if (mTeam.AsArray()[processSlot].Image == nullptr)
return false;
- kcout << "ProcessScheduler: removing process\r";
+ kcout << "ProcessScheduler: Removing process...\r";
- return mTeam.AsArray().Remove(processSlot);
+ mTeam.AsArray()[processSlot].Status = ProcessStatus::kDead;
+ return true;
}
/// @brief Run scheduler.
@@ -322,26 +318,18 @@ namespace Kernel
auto process = mTeam.AsArray()[process_index];
//! check if process needs to be scheduled.
- if (ProcessHelper::CanBeScheduled(process.Leak()))
+ if (ProcessHelper::CanBeScheduled(process))
{
- auto unwrapped_process = *process.Leak();
-
- if (unwrapped_process.Parent->Status == ProcessStatus::kKilled)
- {
- unwrapped_process.Exit();
- continue;
- }
-
// set the current process.
- mTeam.AsRef() = unwrapped_process;
+ mTeam.AsRef() = process;
- // tell helper to find a core to schedule on.
- ProcessHelper::Switch(unwrapped_process.StackFrame,
- unwrapped_process.ProcessId);
+ process.PTime = static_cast<Int32>(process.Affinity);
- unwrapped_process.PTime = static_cast<Int32>(unwrapped_process.Affinity);
+ kcout << process.Name << ": will be runned.\r";
- kcout << unwrapped_process.Name << ": has been switched to a CPU core.\r";
+ // tell helper to find a core to schedule on.
+ ProcessHelper::Switch(process.StackFrame,
+ process.ProcessId);
}
else
{
@@ -381,36 +369,23 @@ namespace Kernel
/// @param process the process reference.
/// @retval true can be schedulded.
/// @retval false cannot be schedulded.
- bool ProcessHelper::CanBeScheduled(Ref<PROCESS_HEADER_BLOCK>& process)
+ bool ProcessHelper::CanBeScheduled(PROCESS_HEADER_BLOCK& process)
{
- if (process.Leak().Status == ProcessStatus::kFrozen ||
- process.Leak().Status == ProcessStatus::kDead)
+ if (process.Status == ProcessStatus::kFrozen ||
+ process.Status == ProcessStatus::kDead)
return false;
- if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind)
+ if (process.Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind)
{
- if (auto start = process.Leak().DLLPtr->Load<VoidPtr>(kPefStart, rt_string_len(kPefStart), kPefCode);
+ if (auto start = process.DLLPtr->Load<VoidPtr>(kPefStart, rt_string_len(kPefStart), kPefCode);
start)
{
- process.Leak().Image = start;
- process.Leak().StackFrame->BP = reinterpret_cast<HAL::Reg>(start);
+ process.Image = start;
+ process.StackFrame->BP = reinterpret_cast<HAL::Reg>(start);
}
}
- if (process.Leak().GetStatus() == ProcessStatus::kStarting)
- {
- if (process.Leak().PTime <= 0)
- {
- process.Leak().Status = ProcessStatus::kRunning;
- process.Leak().Affinity = AffinityKind::kStandard;
-
- return true;
- }
-
- ++process.Leak().PTime;
- }
-
- return process.Leak().PTime > 0;
+ return process.PTime > 0;
}
/**
diff --git a/dev/ZKA/Sources/ProcessTeam.cxx b/dev/ZKA/Sources/ProcessTeam.cxx
index 81307d97..c6a26275 100644
--- a/dev/ZKA/Sources/ProcessTeam.cxx
+++ b/dev/ZKA/Sources/ProcessTeam.cxx
@@ -15,7 +15,7 @@ namespace Kernel
{
/// @brief Process list array getter.
/// @return The list of process to schedule.
- MutableArray<Ref<PROCESS_HEADER_BLOCK>>& ProcessTeam::AsArray()
+ Array<PROCESS_HEADER_BLOCK, kSchedProcessLimitPerTeam>& ProcessTeam::AsArray()
{
return mProcessList;
}
diff --git a/dev/ZKA/amd64-efi.make b/dev/ZKA/amd64-efi.make
index 9e95c601..75f01b38 100644
--- a/dev/ZKA/amd64-efi.make
+++ b/dev/ZKA/amd64-efi.make
@@ -7,7 +7,7 @@ CC = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
CCFLAGS = -fshort-wchar -c -shared -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \
-std=c++20 -D__ZKA_SUPPORT_NX__ -I../Vendor -D__FSKIT_USE_NEWFS__ \
- -D__NEWOSKRNL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -I./ -I../ -I../ZBA
+ -D__NEWOSKRNL__ -D__HAVE_ZKA_APIS__ -D__ZKA__ -I./ -I../ -I../ZBA
ASM = nasm
diff --git a/dev/ZKA/arm64-efi.make b/dev/ZKA/arm64-efi.make
index f168def3..4e6a3f84 100644
--- a/dev/ZKA/arm64-efi.make
+++ b/dev/ZKA/arm64-efi.make
@@ -7,15 +7,11 @@ CC = clang++
LD = lld-link
CCFLAGS = -fshort-wchar -c -ffreestanding -MMD -mno-red-zone -D__ZKA_ARM64__ -fno-rtti -fno-exceptions -I./ \
-target aarch64-unknown-windows \
- -std=c++20 -D__FSKIT_USE_NEWFS__ -D__ZETA_MACHINE__ -D__NEWOSKRNL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -I../
+ -std=c++20 -D__FSKIT_USE_NEWFS__ -D__ZETA_MACHINE__ -D__NEWOSKRNL__ -D__HAVE_ZKA_APIS__ -D__ZKA__ -I../
ASM = clang++
-DISKDRIVER = -D__FLASH_MEM__
-
-ifneq ($(SDCARD_SUPPORT), )
-DISKDRIVER = -D__SDCARD__
-endif
+DISKDRIVER = -D__USE_FLASH_MEM__ -D__USE_SAS__ -D__USE_SATA__
ifneq ($(DEBUG_SUPPORT), )
DEBUG = -D__DEBUG__
@@ -27,7 +23,7 @@ LDFLAGS = -subsystem:efi_application -entry:hal_init_platform /nodefaultlib
LDOBJ = Objects/*.obj
# This file is the kernel, responsible of task management and memory.
-KERNEL = newoskrnl.dll
+KERNEL = newoskrnl.so
.PHONY: error
error: