summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <zka-holder@mahrouss-logic.com>2024-10-14 05:58:38 +0000
committerAmlal El Mahrouss <zka-holder@mahrouss-logic.com>2024-10-14 05:58:38 +0000
commit7ad3739afdfaa2466723467f5ef2526f171c87c3 (patch)
tree37775f4299281598b0f5121df4c188392daebd04 /dev
parent7477a0f942c374b652da4f80cdb36d4661aac3c8 (diff)
parentd9d82713326069478e6dd212763d1fac15e65370 (diff)
Merge branch 'port-stage1-hello-world' into 'unstable'
IMP: Basic ARM64 port. See merge request mahrouss/zka-dev!20
Diffstat (limited to 'dev')
-rw-r--r--dev/modules/ACPI/ACPIFactoryInterface.hxx2
-rw-r--r--dev/modules/APM/APM.hxx17
-rw-r--r--dev/modules/FB/FB.hxx36
-rw-r--r--dev/zba/amd64-efi.make2
-rw-r--r--dev/zba/arm64-efi.make10
-rw-r--r--dev/zba/src/BootFileReader.cxx2
-rw-r--r--dev/zba/src/HEL/AMD64/BootMain.cxx6
-rw-r--r--dev/zba/src/HEL/ARM64/BootMain.cxx62
-rw-r--r--dev/zba/src/Thread.cxx72
-rw-r--r--dev/zka/ArchKit/ArchKit.hxx1
-rw-r--r--dev/zka/CFKit/GUIDWizard.hxx4
-rw-r--r--dev/zka/CFKit/URL.hxx33
-rw-r--r--dev/zka/FirmwareKit/Handover.hxx2
-rw-r--r--dev/zka/HALKit/AMD64/HalACPIFactoryInterface.cxx86
-rw-r--r--dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx13
-rw-r--r--dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx24
-rw-r--r--dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx38
-rw-r--r--dev/zka/HALKit/AMD64/HalInterruptAPI.asm38
-rw-r--r--dev/zka/HALKit/AMD64/HalKernelMain.cxx41
-rw-r--r--dev/zka/HALKit/AMD64/HalMPContextSwitch.asm17
-rw-r--r--dev/zka/HALKit/AMD64/HalPagingMgr.cxx4
-rw-r--r--dev/zka/HALKit/AMD64/HalSchedulerCore.cxx2
-rw-r--r--dev/zka/HALKit/AMD64/HalUtils.asm6
-rw-r--r--dev/zka/HALKit/AMD64/Processor.hxx15
-rw-r--r--dev/zka/HALKit/ARM64/APM/APM.cxx37
-rw-r--r--dev/zka/HALKit/ARM64/HalACPIFactoryInterface.cxx31
-rw-r--r--dev/zka/HALKit/ARM64/HalCoreMPScheduler.cxx19
-rw-r--r--dev/zka/HALKit/ARM64/HalDebugOutput.cxx81
-rw-r--r--dev/zka/HALKit/ARM64/HalKernelMain.cxx28
-rw-r--r--dev/zka/HALKit/ARM64/HalPagingMgr.cxx87
-rw-r--r--dev/zka/HALKit/ARM64/HalSchedulerCore.cxx5
-rw-r--r--dev/zka/HALKit/ARM64/Processor.hxx30
-rw-r--r--dev/zka/HALKit/POWER/HalContextSwitchPowerPC.s4
-rw-r--r--dev/zka/KernelKit/DriveMgr.hxx10
-rw-r--r--dev/zka/KernelKit/Heap.hxx2
-rw-r--r--dev/zka/KernelKit/IDLLObject.hxx1
-rw-r--r--dev/zka/KernelKit/IPEFDLLObject.hxx1
-rw-r--r--dev/zka/KernelKit/UserProcessScheduler.hxx34
-rw-r--r--dev/zka/NewKit/ErrorOr.hxx2
-rw-r--r--dev/zka/NewKit/Ref.hxx23
-rw-r--r--dev/zka/NewKit/String.hxx1
-rw-r--r--dev/zka/arm64-efi.make6
-rw-r--r--dev/zka/src/ACPIFactoryInterface.cxx95
-rw-r--r--dev/zka/src/BitMapMgr.cxx2
-rw-r--r--dev/zka/src/CRuntime.cxx69
-rw-r--r--dev/zka/src/CodeMgr.cxx2
-rw-r--r--dev/zka/src/CxxAbi-AMD64.cxx9
-rw-r--r--dev/zka/src/CxxAbi-ARM64.cxx94
-rw-r--r--dev/zka/src/DriveMgr.cxx12
-rw-r--r--dev/zka/src/FS/NeFS.cxx130
-rw-r--r--dev/zka/src/GUIDWizard.cxx40
-rw-r--r--dev/zka/src/HardwareThreadScheduler.cxx2
-rw-r--r--dev/zka/src/NeFS+FileMgr.cxx4
-rw-r--r--dev/zka/src/PageMgr.cxx2
-rw-r--r--dev/zka/src/Stop.cxx75
-rw-r--r--dev/zka/src/String.cxx48
-rw-r--r--dev/zka/src/URL.cxx98
-rw-r--r--dev/zka/src/UserProcessScheduler.cxx60
58 files changed, 960 insertions, 717 deletions
diff --git a/dev/modules/ACPI/ACPIFactoryInterface.hxx b/dev/modules/ACPI/ACPIFactoryInterface.hxx
index 3d16d5a1..57db9551 100644
--- a/dev/modules/ACPI/ACPIFactoryInterface.hxx
+++ b/dev/modules/ACPI/ACPIFactoryInterface.hxx
@@ -22,7 +22,7 @@ namespace Kernel
class ACPIFactoryInterface final
{
public:
- explicit ACPIFactoryInterface(voidPtr rsdPtr);
+ explicit ACPIFactoryInterface(voidPtr rsp_ptr);
~ACPIFactoryInterface() = default;
ACPIFactoryInterface& operator=(const ACPIFactoryInterface&) = default;
diff --git a/dev/modules/APM/APM.hxx b/dev/modules/APM/APM.hxx
index abcfb468..ed9f6f45 100644
--- a/dev/modules/APM/APM.hxx
+++ b/dev/modules/APM/APM.hxx
@@ -14,21 +14,24 @@ namespace Kernel
enum
{
- kAPMPowerCommandStop = 0x01,
- kAPMPowerCommandStart = 0x02,
- kAPMPowerCommandSleep = 0x04,
- kAPMPowerCommandSWakeup = 0x06
+ kAPMPowerCommandInvalid = 0x00,
+ kAPMPowerCommandStop = 0x01,
+ kAPMPowerCommandStart = 0x02,
+ kAPMPowerCommandSleep = 0x04,
+ kAPMPowerCommandWakeup = 0x06,
+ kAPMPowerCommandShutdown = 0x07,
+ kAPMPowerCommandReboot = 0x08,
};
/// @brief Send a APM command into it's own DMA space.
/// @param base_dma the DMA base address.
/// @param cmd the command.
/// @return status code.
- EXTERN_C Int32 apm_send_dma_command(Ptr64 base_dma, APMPowerCmd cmd);
+ EXTERN_C Int32 apm_send_dma_command(Ptr64 register_addr, APMPowerCmd value);
/// @brief Send a APM command into it's own IO space.
/// @param base_dma the IO base port.
/// @param cmd the command.
/// @return status code.
- EXTERN_C Int32 apm_send_io_command(UInt16 base_port, APMPowerCmd cmd);
-} // namespace Kernel \ No newline at end of file
+ EXTERN_C Int32 apm_send_io_command(UInt16 cmd, APMPowerCmd value);
+} // namespace Kernel
diff --git a/dev/modules/FB/FB.hxx b/dev/modules/FB/FB.hxx
index a98eeafe..7f5b93bb 100644
--- a/dev/modules/FB/FB.hxx
+++ b/dev/modules/FB/FB.hxx
@@ -8,17 +8,17 @@
#include <NewKit/Defines.hxx>
-#define CGInit() Kernel::SizeT __CG_CURSOR = 0
+#define CGInit() Kernel::SizeT kCGCursor = 0
#define CGColor(R, G, B) RGB(R, G, B)
#define cCGClearClr CGColor(0x0, 0x0, 0x0)
-#define CGFini() __CG_CURSOR = 0
+#define CGFini() kCGCursor = 0
/// @brief Performs OR drawing on the framebuffer.
#define CGDrawBitMapInRegionA(_BitMp, _Height, _Width, _BaseX, _BaseY) \
- __CG_CURSOR = 0; \
+ kCGCursor = 0; \
\
for (Kernel::SizeT i = _BaseX; i < (_Height + _BaseX); ++i) \
{ \
@@ -27,15 +27,15 @@
*(((Kernel::UInt32*)(kHandoverHeader->f_GOP.f_The + \
4 * kHandoverHeader->f_GOP.f_PixelPerLine * \
i + \
- 4 * u))) |= (_BitMp)[__CG_CURSOR]; \
+ 4 * u))) |= (_BitMp)[kCGCursor]; \
\
- ++__CG_CURSOR; \
+ ++kCGCursor; \
} \
}
/// @brief Draws a resource.
#define CGDrawBitMapInRegion(_BitMp, _Height, _Width, _BaseX, _BaseY) \
- __CG_CURSOR = 0; \
+ kCGCursor = 0; \
\
for (Kernel::SizeT i = _BaseX; i < (_Height + _BaseX); ++i) \
{ \
@@ -44,14 +44,14 @@
*(((Kernel::UInt32*)(kHandoverHeader->f_GOP.f_The + \
4 * kHandoverHeader->f_GOP.f_PixelPerLine * \
i + \
- 4 * u))) = (_BitMp)[__CG_CURSOR]; \
+ 4 * u))) = (_BitMp)[kCGCursor]; \
\
- ++__CG_CURSOR; \
+ ++kCGCursor; \
} \
}
#define CGDrawBitMapInRegionToRgn(_Rgn, _BitMp, _Height, _Width, _BaseX, _BaseY) \
- __CG_CURSOR = 0; \
+ kCGCursor = 0; \
\
for (Kernel::SizeT i = _BaseX; i < (_Height + _BaseX); ++i) \
{ \
@@ -60,9 +60,9 @@
*(((Kernel::UInt32*)(_Rgn + \
4 * kHandoverHeader->f_GOP.f_PixelPerLine * \
i + \
- 4 * u))) = (_BitMp)[__CG_CURSOR]; \
+ 4 * u))) = (_BitMp)[kCGCursor]; \
\
- ++__CG_CURSOR; \
+ ++kCGCursor; \
} \
}
@@ -96,7 +96,7 @@
/// @brief Draws inside a zone.
#define CGDrawInRegionToRgn(_Rgn, _Clr, _Height, _Width, _BaseX, _BaseY) \
- __CG_CURSOR = 0; \
+ kCGCursor = 0; \
\
for (Kernel::SizeT x_base = _BaseX; x_base < (_Width + _BaseX); ++x_base) \
{ \
@@ -105,13 +105,13 @@
*(((volatile Kernel::UInt32*)(_Rgn + \
4 * kHandoverHeader->f_GOP.f_PixelPerLine * \
x_base + \
- 4 * y_base))) = _Clr[__CG_CURSOR]; \
- ++__CG_CURSOR; \
+ 4 * y_base))) = _Clr[kCGCursor]; \
+ ++kCGCursor; \
} \
}
#define CGDrawInRegionToVideoRgn(_VideoRgn, _Clr, _Height, _Width, _BaseX, _BaseY) \
- __CG_CURSOR = 0; \
+ kCGCursor = 0; \
\
for (Kernel::SizeT x_base = _BaseX; x_base < (_Width + _BaseX); ++x_base) \
{ \
@@ -121,12 +121,12 @@
4 * kHandoverHeader->f_GOP.f_PixelPerLine * \
x_base + \
4 * y_base))) = _Clr; \
- ++__CG_CURSOR; \
+ ++kCGCursor; \
} \
}
#define CGDrawInRegionToVideoRgnA(_VideoRgn, _Clr, _Height, _Width, _BaseX, _BaseY) \
- __CG_CURSOR = 0; \
+ kCGCursor = 0; \
\
for (Kernel::SizeT x_base = _BaseX; x_base < (_Width + _BaseX); ++x_base) \
{ \
@@ -136,7 +136,7 @@
4 * kHandoverHeader->f_GOP.f_PixelPerLine * \
x_base + \
4 * y_base))) |= _Clr; \
- ++__CG_CURSOR; \
+ ++kCGCursor; \
} \
}
diff --git a/dev/zba/amd64-efi.make b/dev/zba/amd64-efi.make
index f2121f85..ae019d74 100644
--- a/dev/zba/amd64-efi.make
+++ b/dev/zba/amd64-efi.make
@@ -29,7 +29,7 @@ IMG=epm-master-1.img
IMG_2=epm-slave.img
IMG_3=epm-master-2.img
-EMU_FLAGS=-net none -m 8G -M q35 \
+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 \
diff --git a/dev/zba/arm64-efi.make b/dev/zba/arm64-efi.make
index 9ea31d83..f131374d 100644
--- a/dev/zba/arm64-efi.make
+++ b/dev/zba/arm64-efi.make
@@ -27,12 +27,13 @@ IMG=epm-master-1.img
IMG_2=epm-slave.img
IMG_3=epm-master-2.img
-EMU_FLAGS=-net none -m 8G -cpu max -M virt-9.1 -vga std \
+EMU_FLAGS=-net none -smp 4 -m 8G -cpu max -M virt-9.1 \
-bios $(BIOS) \
-drive id=disk,file=$(IMG),format=raw,if=none \
-drive \
file=fat:rw:src/Root/,index=1,format=raw \
- -d int -no-shutdown -no-reboot
+ -device virtio-tablet-pci \
+ -d int -no-shutdown -no-reboot -device virtio-gpu-pci,xres=844,yres=390
LD_FLAGS=-subsystem:efi_application -entry:Main /nodefaultlib
@@ -66,11 +67,6 @@ all: compile-amd64
$(COPY) src/$(BOOT_LOADER) src/Root/EFI/BOOT/BOOTAA64.EFI
$(COPY) src/$(BOOT_LOADER) src/Root/EFI/BOOT/NEWOSLDR.EFI
$(COPY) ../zka/$(KERNEL) src/Root/$(KERNEL)
- $(COPY) ../sci/$(SCI) src/Root/$(SCI)
- $(COPY) ../ddk/$(DDK) src/Root/$(DDK)
- $(COPY) ./Modules/SysChk/$(SYS_CHK) src/Root/$(SYS_CHK)
- $(COPY) ./Modules/SysChk/$(SYS_CHK) src/Root/zka/$(STARTUP)
- $(COPY) ../crt/$(CRT) src/Root/$(CRT)
$(COPY) src/$(BOOT_LOADER) src/Root/$(BOOT_LOADER)
ifneq ($(DEBUG_SUPPORT), )
diff --git a/dev/zba/src/BootFileReader.cxx b/dev/zba/src/BootFileReader.cxx
index e81ba3fb..72b10b9f 100644
--- a/dev/zba/src/BootFileReader.cxx
+++ b/dev/zba/src/BootFileReader.cxx
@@ -142,7 +142,7 @@ Void Boot::BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead, UIntPtr outA
else if (readUntil < 1)
readUntil = newPtrInfo.FileSize;
- mWriter.Write(L"NEWOSLDR: Physical size: ").Write(readUntil).Write("\r");
+ mWriter.Write(L"NEWOSLDR: SIZE: ").Write(readUntil).Write("\r");
}
if (!outAddress)
diff --git a/dev/zba/src/HEL/AMD64/BootMain.cxx b/dev/zba/src/HEL/AMD64/BootMain.cxx
index 5aa26b03..4f4525ec 100644
--- a/dev/zba/src/HEL/AMD64/BootMain.cxx
+++ b/dev/zba/src/HEL/AMD64/BootMain.cxx
@@ -42,13 +42,13 @@ EXTERN_C Void rt_reset_hardware();
@brief Finds and stores the GOP.
*/
+EXTERN EfiBootServices* BS;
+
STATIC Void boot_init_fb() noexcept
{
kGopGuid = EfiGUID(EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID);
kGop = nullptr;
- extern EfiBootServices* BS;
-
BS->LocateProtocol(&kGopGuid, nullptr, (VoidPtr*)&kGop);
kGopStride = 4;
@@ -228,7 +228,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle,
if (reader_syschk.Blob())
{
syschk_thread = new Boot::BThread(reader_syschk.Blob());
- syschk_thread->SetName("System Check SYS.");
+ syschk_thread->SetName("System Check.");
}
syschk_thread->Start(handover_hdr);
diff --git a/dev/zba/src/HEL/ARM64/BootMain.cxx b/dev/zba/src/HEL/ARM64/BootMain.cxx
index 2033b74b..a7d22b47 100644
--- a/dev/zba/src/HEL/ARM64/BootMain.cxx
+++ b/dev/zba/src/HEL/ARM64/BootMain.cxx
@@ -4,21 +4,73 @@
------------------------------------------- */
+#include <FirmwareKit/EFI/API.hxx>
#include <FirmwareKit/EFI.hxx>
#include <BootKit/Thread.hxx>
#include <BootKit/BootKit.hxx>
+#ifndef cExpectedWidth
+#define cExpectedWidth 844
+#endif
+
+#ifndef cExpectedHeight
+#define cExpectedHeight 390
+#endif
+
EXTERN EfiBootServices* BS;
+STATIC EfiGraphicsOutputProtocol* kGop = nullptr;
+STATIC UInt16 kGopStride = 0U;
+STATIC EfiGUID kGopGuid;
+
/// @brief Main EFI entrypoint.
/// @param ImageHandle Handle of this image.
/// @param SystemTable The system table of it.
/// @return nothing, never returns.
-EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle,
- EfiSystemTable* SystemTable)
+EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle,
+ EfiSystemTable* SystemTable)
{
- SystemTable->ConOut->OutputString(SystemTable->ConOut, L"NEWSOLDR, (C) ZKA TECHNOLOGIES, ALL RIGHTS RESERVED.\r\n");
- SystemTable->ConOut->OutputString(SystemTable->ConOut, L"NEWSOLDR: BOOTING KERNEL...\r\n");
+ InitEFI(SystemTable);
+
+ kGopGuid = EfiGUID(EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID);
+ kGop = nullptr;
+
+ BS->LocateProtocol(&kGopGuid, nullptr, (VoidPtr*)&kGop);
+
+ kGopStride = 4;
+
+ Boot::BTextWriter writer;
+
+ for (SizeT i = 0; i < kGop->Mode->MaxMode; ++i)
+ {
+ EfiGraphicsOutputProtocolModeInformation* infoPtr = nullptr;
+ UInt32 sz = 0U;
+
+ kGop->QueryMode(kGop, i, &sz, &infoPtr);
+
+ writer.Write(infoPtr->HorizontalResolution);
+ writer.Write(infoPtr->VerticalResolution);
+ writer.Write("\r");
+
+ if (infoPtr->HorizontalResolution == cExpectedWidth &&
+ infoPtr->VerticalResolution == cExpectedHeight)
+ {
+ kGop->SetMode(kGop, i);
+ break;
+ }
+ }
+
+ Boot::BFileReader reader_kernel(L"minoskrnl.exe", ImageHandle);
+
+ reader_kernel.ReadAll(0);
+
+ if (reader_kernel.Blob())
+ {
+ auto kernel_thread = Boot::BThread(reader_kernel.Blob());
+
+ if (kernel_thread.IsValid())
+ kernel_thread.Start(nullptr);
+ }
- CANT_REACH();
+ CANT_REACH();
}
diff --git a/dev/zba/src/Thread.cxx b/dev/zba/src/Thread.cxx
index 2c1ee173..b7c44868 100644
--- a/dev/zba/src/Thread.cxx
+++ b/dev/zba/src/Thread.cxx
@@ -26,30 +26,42 @@ namespace Boot
: fBlob(blob), fStartAddress(nullptr)
{
// detect the format.
- const Char* firstBytes = reinterpret_cast<char*>(fBlob);
+ const Char* blob_bytes = reinterpret_cast<char*>(fBlob);
BTextWriter writer;
- if (!firstBytes)
+ if (!blob_bytes)
{
// failed to provide a valid pointer.
return;
}
- if (firstBytes[0] == kMagMz0 &&
- firstBytes[1] == kMagMz1)
+ if (blob_bytes[0] == kMagMz0 &&
+ blob_bytes[1] == kMagMz1)
{
- LDR_EXEC_HEADER_PTR hdrPtr = ldr_find_exec_header(firstBytes);
- LDR_OPTIONAL_HEADER_PTR optHdr = ldr_find_opt_exec_header(firstBytes);
+ LDR_EXEC_HEADER_PTR header_ptr = ldr_find_exec_header(blob_bytes);
+ LDR_OPTIONAL_HEADER_PTR opt_header_ptr = ldr_find_opt_exec_header(blob_bytes);
- if (hdrPtr->mMachine != kPeMachineAMD64 ||
- hdrPtr->mSignature != kPeMagic)
+ if (!header_ptr || !opt_header_ptr)
+ return;
+
+#ifdef __ZKA_AMD64__
+ if (header_ptr->mMachine != kPeMachineAMD64 ||
+ header_ptr->mSignature != kPeMagic)
{
writer.Write("NEWOSLDR: Not a PE32+ executable.\r");
return;
}
+#elif defined(__ZKA_ARM64__)
+ if (header_ptr->mMachine != kPeMachineAMD64 ||
+ header_ptr->mSignature != kPeMagic)
+ {
+ writer.Write("NEWOSLDR: Not a PE32+ executable.\r");
+ return;
+ }
+#endif // __ZKA_AMD64__ || __ZKA_ARM64__
- if (optHdr->mSubsystem != kZKASubsystem)
+ if (opt_header_ptr->mSubsystem != kZKASubsystem)
{
writer.Write("NEWOSLDR: Not a ZKA Subsystem executable.\r");
return;
@@ -57,25 +69,25 @@ namespace Boot
writer.Write("NEWOSLDR: PE32+ executable detected (ZKA Subsystem).\r");
- auto numSecs = hdrPtr->mNumberOfSections;
+ auto numSecs = header_ptr->mNumberOfSections;
- writer.Write("NEWOSLDR: Major Linker Ver: ").Write(optHdr->mMajorLinkerVersion).Write("\r");
- writer.Write("NEWOSLDR: Minor Linker Ver: ").Write(optHdr->mMinorLinkerVersion).Write("\r");
- writer.Write("NEWOSLDR: Major Subsystem Ver: ").Write(optHdr->mMajorSubsystemVersion).Write("\r");
- writer.Write("NEWOSLDR: Minor Subsystem Ver: ").Write(optHdr->mMinorSubsystemVersion).Write("\r");
- writer.Write("NEWOSLDR: Magic: ").Write(hdrPtr->mSignature).Write("\r");
+ writer.Write("NEWOSLDR: Major Linker Ver: ").Write(opt_header_ptr->mMajorLinkerVersion).Write("\r");
+ writer.Write("NEWOSLDR: Minor Linker Ver: ").Write(opt_header_ptr->mMinorLinkerVersion).Write("\r");
+ writer.Write("NEWOSLDR: Major Subsystem Ver: ").Write(opt_header_ptr->mMajorSubsystemVersion).Write("\r");
+ writer.Write("NEWOSLDR: Minor Subsystem Ver: ").Write(opt_header_ptr->mMinorSubsystemVersion).Write("\r");
+ writer.Write("NEWOSLDR: Magic: ").Write(header_ptr->mSignature).Write("\r");
constexpr auto cPageSize = 512;
- EfiPhysicalAddress loadStartAddress = optHdr->mImageBase;
- loadStartAddress += optHdr->mBaseOfData;
+ EfiPhysicalAddress loadStartAddress = opt_header_ptr->mImageBase;
+ loadStartAddress += opt_header_ptr->mBaseOfData;
writer.Write("NEWOSLDR: ImageBase: ").Write(loadStartAddress).Write("\r");
- auto numPages = optHdr->mSizeOfImage / cPageSize;
+ auto numPages = opt_header_ptr->mSizeOfImage / cPageSize;
BS->AllocatePages(AllocateAddress, EfiLoaderData, numPages, &loadStartAddress);
- LDR_SECTION_HEADER_PTR sectPtr = (LDR_SECTION_HEADER_PTR)(((Char*)optHdr) + hdrPtr->mSizeOfOptionalHeader);
+ LDR_SECTION_HEADER_PTR sectPtr = (LDR_SECTION_HEADER_PTR)(((Char*)opt_header_ptr) + header_ptr->mSizeOfOptionalHeader);
constexpr auto sectionForCode = ".text";
constexpr auto sectionForNewLdr = ".ldr";
@@ -89,7 +101,7 @@ namespace Boot
if (StrCmp(sectionForCode, sect->mName) == 0)
{
- fStartAddress = (VoidPtr)((UIntPtr)loadStartAddress + optHdr->mAddressOfEntryPoint);
+ fStartAddress = (VoidPtr)((UIntPtr)loadStartAddress + opt_header_ptr->mAddressOfEntryPoint);
writer.Write("NEWOSLDR: ENTRY OF EXE: ").Write((UIntPtr)fStartAddress).Write("\r");
}
else if (StrCmp(sectionForNewLdr, sect->mName) == 0)
@@ -111,8 +123,6 @@ namespace Boot
writer.Write("NEWOSLDR: ARCH OF EXE: ").Write(handover_struc->HandoverArch).Write("\r");
writer.Write("NEWOSLDR: ENTRY OF EXE: ").Write((UIntPtr)fStartAddress).Write("\r");
CGDrawString("NEWOSLDR: NOT AN HANDOVER IMAGE, BAD ARCHITECTURE...", 40, 10, RGB(0xFF, 0xFF, 0xFF));
-
- ::EFI::Stop();
}
#endif
@@ -122,8 +132,6 @@ namespace Boot
writer.Write("NEWOSLDR: ARCH OF EXE: ").Write(handover_struc->HandoverArch).Write("\r");
writer.Write("NEWOSLDR: ENTRY OF EXE: ").Write((UIntPtr)fStartAddress).Write("\r");
CGDrawString("NEWOSLDR: NOT AN HANDOVER IMAGE, BAD ARCHITECTURE...", 40, 10, RGB(0xFF, 0xFF, 0xFF));
-
- ::EFI::Stop();
}
#endif
writer.Write("NEWOSLDR: ENTRY OF EXE: ").Write((UIntPtr)fStartAddress).Write("\r");
@@ -138,10 +146,10 @@ namespace Boot
CopyMem((VoidPtr)(loadStartAddress + sect->mVirtualAddress), (VoidPtr)((UIntPtr)fBlob + sect->mPointerToRawData), sect->mSizeOfRawData);
}
}
- else if (firstBytes[0] == kPefMagic[0] &&
- firstBytes[1] == kPefMagic[1] &&
- firstBytes[2] == kPefMagic[2] &&
- firstBytes[3] == kPefMagic[3])
+ else if (blob_bytes[0] == kPefMagic[0] &&
+ blob_bytes[1] == kPefMagic[1] &&
+ blob_bytes[2] == kPefMagic[2] &&
+ blob_bytes[3] == kPefMagic[3])
{
// ========================================= //
// PEF executable detected.
@@ -160,14 +168,6 @@ namespace Boot
/// @note handover header has to be valid!
Void BThread::Start(HEL::HANDOVER_INFO_HEADER* handover)
{
- BTextWriter writer;
-
- if (!handover)
- {
- writer.Write("NEWOSLDR: EXEC FORMAT ERROR.\r");
- return;
- }
-
HEL::HandoverProc err_fn = [](HEL::HANDOVER_INFO_HEADER* rcx) -> void {
CGDrawString("NEWOSLDR: INVALID IMAGE! ABORTING...", 50, 10, RGB(0xFF, 0xFF, 0xFF));
::EFI::Stop();
diff --git a/dev/zka/ArchKit/ArchKit.hxx b/dev/zka/ArchKit/ArchKit.hxx
index e52eeabf..371de83e 100644
--- a/dev/zka/ArchKit/ArchKit.hxx
+++ b/dev/zka/ArchKit/ArchKit.hxx
@@ -83,4 +83,3 @@ inline Kernel::Array<HAL_SYSCALL_RECORD,
kKerncalls;
EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_context();
-EXTERN_C Kernel::Void mp_do_user_switch(Kernel::Void);
diff --git a/dev/zka/CFKit/GUIDWizard.hxx b/dev/zka/CFKit/GUIDWizard.hxx
index 034aceea..c3f8e5ac 100644
--- a/dev/zka/CFKit/GUIDWizard.hxx
+++ b/dev/zka/CFKit/GUIDWizard.hxx
@@ -17,6 +17,6 @@
namespace Kernel::XRN::Version1
{
- Ref<GUIDSequence*> cf_make_sequence(const ArrayList<UInt32>& seq);
- ErrorOr<Ref<Kernel::StringView>> cf_try_guid_to_string(Ref<GUIDSequence*>& guid);
+ Ref<GUIDSequence> cf_make_sequence(const ArrayList<UInt32>& seq);
+ ErrorOr<Ref<Kernel::StringView>> cf_try_guid_to_string(Ref<GUIDSequence>& guid);
} // namespace Kernel::XRN::Version1
diff --git a/dev/zka/CFKit/URL.hxx b/dev/zka/CFKit/URL.hxx
deleted file mode 100644
index 02cced28..00000000
--- a/dev/zka/CFKit/URL.hxx
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -------------------------------------------
-
- Copyright ZKA Technologies.
-
-------------------------------------------- */
-
-#ifndef _INC_URL_HPP_
-#define _INC_URL_HPP_
-
-#include <NewKit/Defines.hxx>
-#include <NewKit/String.hxx>
-
-namespace Kernel
-{
- class URL final
- {
- public:
- explicit URL(StringView& strUrl);
- ~URL();
-
- public:
- Ref<ErrorOr<StringView>> Location() noexcept;
- Ref<ErrorOr<StringView>> Protocol() noexcept;
-
- private:
- Ref<StringView> fUrlView;
- };
-
- ErrorOr<StringView> url_extract_location(const Char* url);
- ErrorOr<StringView> url_extract_protocol(const Char* url);
-} // namespace Kernel
-
-#endif /* ifndef _INC_URL_HPP_ */
diff --git a/dev/zka/FirmwareKit/Handover.hxx b/dev/zka/FirmwareKit/Handover.hxx
index 13c34eca..01675973 100644
--- a/dev/zka/FirmwareKit/Handover.hxx
+++ b/dev/zka/FirmwareKit/Handover.hxx
@@ -23,7 +23,7 @@
#define kHandoverVersion 0x0117
/* Initial bitmap pointer location and size. */
-#define kHandoverBitMapSz (gib_cast(3))
+#define kHandoverBitMapSz (gib_cast(4))
/* Executable base */
#define kHandoverExecBase (0x4000000)
diff --git a/dev/zka/HALKit/AMD64/HalACPIFactoryInterface.cxx b/dev/zka/HALKit/AMD64/HalACPIFactoryInterface.cxx
index 83f9993f..0d00b643 100644
--- a/dev/zka/HALKit/AMD64/HalACPIFactoryInterface.cxx
+++ b/dev/zka/HALKit/AMD64/HalACPIFactoryInterface.cxx
@@ -82,8 +82,8 @@ namespace Kernel
};
} // namespace Detail
- ACPIFactoryInterface::ACPIFactoryInterface(VoidPtr rsdPtr)
- : fRsdp(rsdPtr), fEntries(0)
+ ACPIFactoryInterface::ACPIFactoryInterface(VoidPtr rsp_ptr)
+ : fRsdp(rsp_ptr), fEntries(0)
{
}
@@ -123,86 +123,4 @@ namespace Kernel
"jmp reset_wait ; "
".att_syntax; ");
}
-
- /// @brief Finds a descriptor table inside ACPI XSDT.
- ErrorOr<voidPtr> ACPIFactoryInterface::Find(const Char* signature)
- {
- MUST_PASS(fRsdp);
-
- if (!signature)
- return ErrorOr<voidPtr>{-1};
-
- if (*signature == 0)
- return ErrorOr<voidPtr>{-1};
-
- RSDP* rsdPtr = reinterpret_cast<RSDP*>(this->fRsdp);
-
- if (rsdPtr->Revision <= 1)
- return ErrorOr<voidPtr>{-1};
-
- RSDT* xsdt = reinterpret_cast<RSDT*>(rsdPtr->RsdtAddress);
-
- Int64 num = (xsdt->Length - sizeof(SDT)) / sizeof(UInt32);
-
- /***
- crucial to avoid - overflows.
- */
- if (num < 1)
- {
- /// stop here, we should have entries...
- ke_stop(RUNTIME_CHECK_ACPI);
- return ErrorOr<voidPtr>{-1};
- }
-
- this->fEntries = num;
-
- kcout << "ACPI: Number of entries: " << number(this->fEntries) << endl;
- kcout << "ACPI: Revision: " << number(xsdt->Revision) << endl;
- kcout << "ACPI: Signature: " << xsdt->Signature << endl;
- kcout << "ACPI: Address of XSDT: " << hex_number((UIntPtr)xsdt) << endl;
-
- const short cAcpiSignatureLength = 4;
-
- for (Size index = 0; index < this->fEntries; ++index)
- {
- SDT* sdt = reinterpret_cast<SDT*>(xsdt->AddressArr[index]);
-
- kcout << "ACPI: Checksum: " << number(sdt->Checksum) << endl;
- kcout << "ACPI: Revision: " << number(sdt->Revision) << endl;
-
- for (short signature_index = 0; signature_index < cAcpiSignatureLength; ++signature_index)
- {
- if (sdt->Signature[signature_index] != signature[signature_index])
- break;
-
- if (signature_index == (cAcpiSignatureLength - 1))
- {
- kcout << "ACPI: Found the SDT. " << endl;
- return ErrorOr<voidPtr>(reinterpret_cast<voidPtr>(xsdt->AddressArr[index]));
- }
- }
- }
-
- return ErrorOr<voidPtr>{-1};
- }
-
- /***
- @brief check SDT header
- @param checksum the header to checksum
- @param len the length of it.
-*/
- bool ACPIFactoryInterface::Checksum(const Char* checksum, SSizeT len)
- {
- if (len == 0)
- return -1;
-
- char chr = 0;
-
- for (int index = 0; index < len; ++index)
- {
- chr += checksum[index];
- }
-
- return chr == 0;
- }
} // namespace Kernel
diff --git a/dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx b/dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
index c6b8303d..1167e861 100644
--- a/dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
+++ b/dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
@@ -4,6 +4,7 @@
------------------------------------------- */
+#include "NewKit/Stop.hxx"
#include <ArchKit/ArchKit.hxx>
#include <KernelKit/UserProcessScheduler.hxx>
#include <NewKit/String.hxx>
@@ -43,13 +44,9 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp)
Kernel::ke_stop(RUNTIME_CHECK_PROCESS);
}
-EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp)
+/// @brief Handle scheduler interrupt.
+EXTERN_C void idt_handle_scheduler()
{
- if (Kernel::cProcessScheduler == nullptr)
- {
- Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED);
- }
-
Kernel::UserProcessHelper::StartScheduling();
}
@@ -101,6 +98,8 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp)
/// @return nothing.
EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr rdx)
{
+ Kernel::HAL::Out8(0x20, 0x20); // Acknowledge interrupt to master PIC
+
if (rcx <= (kSyscalls.Count() - 1))
{
kcout << "syscall: Enter Fn.\r";
@@ -117,6 +116,8 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr
/// @return nothing.
EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr rdx, Kernel::UIntPtr r8, Kernel::UIntPtr r9)
{
+ Kernel::HAL::Out8(0x20, 0x20); // Acknowledge interrupt to master PIC
+
if (rcx <= (kSyscalls.Count() - 1))
{
kcout << "kerncall: Enter Fn.\r";
diff --git a/dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx b/dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx
index ae6dc905..44f1f60a 100644
--- a/dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx
+++ b/dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx
@@ -136,15 +136,6 @@ namespace Kernel::HAL
EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame);
- /// @brief Called when the AP is ready.
- /// @internal
- EXTERN_C Void hal_on_ap_startup(Void)
- {
- while (Yes)
- {
- }
- }
-
struct PROCESS_CONTROL_BLOCK final
{
HAL::StackFramePtr f_Frame;
@@ -157,18 +148,17 @@ namespace Kernel::HAL
return fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame;
}
+ EXTERN_C Void mp_do_task_switch(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame);
+
EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame)
{
- if (kSMPAware)
- {
- fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame = stack_frame;
- fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Stack = stack_ptr;
- fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Image = image;
+ fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame = stack_frame;
+ fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Stack = stack_ptr;
+ fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Image = image;
- return Yes;
- }
+ mp_do_task_switch(image, stack_ptr, stack_frame);
- return No;
+ return Yes;
}
/***********************************************************************************/
diff --git a/dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx
index 44263a1c..bc06d01a 100644
--- a/dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx
+++ b/dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx
@@ -5,6 +5,7 @@
------------------------------------------- */
#include <ArchKit/ArchKit.hxx>
+#include <HALKit/AMD64/Processor.hxx>
namespace Kernel::HAL
{
@@ -15,24 +16,32 @@ namespace Kernel::HAL
STATIC Void hal_remap_intel_pic_ctrl(Void) noexcept
{
- auto a1 = HAL::In8(0xa1); // save masks
- auto a2 = HAL::In8(0xa2);
+ uint8_t a1_saved = In8(kPICData);
+ uint8_t a2_saved = In8(kPIC2Data);
- HAL::Out8(0x20, 0x11);
+ Out8(kPICCommand, 0x11); // Start initialization
+ Out8(kPICData, 0x20); // Master PIC offset
+ Out8(kPICData, 0x04); // Tell master PIC there is a slave
+ Out8(kPICData, 0x01); // 8086 mode
- HAL::Out8(0xA0, 0x11);
+ Out8(kPIC2Command, 0x11); // Start initialization
+ Out8(kPIC2Data, 0x28); // Slave PIC offset
+ Out8(kPIC2Data, 0x02); // Tell slave PIC its cascade
+ Out8(kPIC2Data, 0x01); // 8086 mode
- HAL::Out8(0x21, 32);
- HAL::Out8(0xA1, 40);
+ Out8(kPICData, a1_saved); // Restore saved masks
+ Out8(kPIC2Data, a2_saved);
+ }
- HAL::Out8(0x21, 4);
- HAL::Out8(0xA1, 2);
+ STATIC Void hal_enable_pit() noexcept
+ {
+ // Configure PIT to receieve scheduler interrupts.
- HAL::Out8(0x21, 0x01);
- HAL::Out8(0xA1, 0x01);
+ UInt32 cCommonDivisor = kPITFrequency / 100; // 100 Hz.
- HAL::Out8(0x21, a2);
- HAL::Out8(0xA1, a1);
+ HAL::Out8(kPITControlPort, 0x36); // Command to PIT
+ HAL::Out8(kPITChannel0Port, cCommonDivisor & 0xFF); // Send low byte
+ HAL::Out8(kPITControlPort, (cCommonDivisor >> 8) & 0xFF); // Send high byte
}
} // namespace Detail
@@ -46,6 +55,9 @@ namespace Kernel::HAL
Void IDTLoader::Load(Register64& idt)
{
+ Detail::hal_remap_intel_pic_ctrl();
+ Detail::hal_enable_pit();
+
volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**)idt.Base;
for (UInt16 idt_indx = 0; idt_indx < (kKernelIdtSize); ++idt_indx)
@@ -66,8 +78,6 @@ namespace Kernel::HAL
(kKernelIdtSize)-1;
hal_load_idt(idt);
-
- Detail::hal_remap_intel_pic_ctrl();
}
void GDTLoader::Load(Ref<RegisterGDT>& gdt)
diff --git a/dev/zka/HALKit/AMD64/HalInterruptAPI.asm b/dev/zka/HALKit/AMD64/HalInterruptAPI.asm
index cdbb2d1f..d9e16f6c 100644
--- a/dev/zka/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/zka/HALKit/AMD64/HalInterruptAPI.asm
@@ -131,8 +131,24 @@ IntNormal 28
IntNormal 29
IntExp 30
IntNormal 31
-IntNormal 32
+
+[extern idt_handle_scheduler]
+
+__ZKA_INT_32:
+ cli
+
+ push rsp
+
+ jmp idt_handle_scheduler
+
+ add rsp, 16
+ pop rsp
+
+ sti
+ o64 iret
+
IntNormal 33
+
IntNormal 34
IntNormal 35
IntNormal 36
@@ -194,25 +210,7 @@ __ZKA_INT_51:
std
o64 iret
-[extern hal_on_ap_startup]
-
-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
-
-; Flags bits
-GRAN_4K equ 1 << 7
-SZ_32 equ 1 << 6
-LONG_MODE equ 1 << 5
-
-__ZKA_INT_52:
- cld
- jmp hal_on_ap_startup
- std
- ret
+IntNormal 52
IntNormal 53
IntNormal 54
diff --git a/dev/zka/HALKit/AMD64/HalKernelMain.cxx b/dev/zka/HALKit/AMD64/HalKernelMain.cxx
index 30124932..ad32ada6 100644
--- a/dev/zka/HALKit/AMD64/HalKernelMain.cxx
+++ b/dev/zka/HALKit/AMD64/HalKernelMain.cxx
@@ -6,6 +6,7 @@
#include <ArchKit/ArchKit.hxx>
#include <KernelKit/UserProcessScheduler.hxx>
+#include <KernelKit/HardwareThreadScheduler.hxx>
#include <KernelKit/CodeMgr.hxx>
#include <modules/ACPI/ACPIFactoryInterface.hxx>
#include <NetworkKit/IPC.hxx>
@@ -15,13 +16,14 @@
namespace Kernel::HAL
{
/// @brief Gets the system cores using the MADT.
- /// @param rsdPtr The 'RSD PTR' data structure.
- EXTERN void mp_get_cores(Kernel::voidPtr rsdPtr) noexcept;
+ /// @param rsp_ptr The 'RSD PTR' data structure.
+ EXTERN void mp_get_cores(Kernel::voidPtr rsp_ptr) noexcept;
} // namespace Kernel::HAL
namespace Kernel
{
EXTERN UserProcessScheduler* cProcessScheduler;
+ EXTERN HardwareThreadScheduler* cHardwareThreadScheduler;
}
EXTERN_C Kernel::VoidPtr kInterruptVectorTable[];
@@ -35,6 +37,7 @@ EXTERN_C void hal_init_platform(
kHandoverHeader = HandoverHeader;
Kernel::cProcessScheduler = nullptr;
+ Kernel::cHardwareThreadScheduler = nullptr;
if (kHandoverHeader->f_Magic != kHandoverMagic &&
kHandoverHeader->f_Version != kHandoverVersion)
@@ -42,13 +45,18 @@ EXTERN_C void hal_init_platform(
return;
}
- // get page size.
- kKernelBitMpSize = kHandoverHeader->f_BitMapSize;
+ /************************************** */
+ /* INITIALIZE BIT MAP. */
+ /************************************** */
- // get virtual address start (for the heap)
+ kKernelBitMpSize = kHandoverHeader->f_BitMapSize;
kKernelBitMpStart = reinterpret_cast<Kernel::VoidPtr>(
reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart));
+ /************************************** */
+ /* INITIALIZE GDT AND SEGMENTS. */
+ /************************************** */
+
STATIC CONST auto cEntriesCount = 6;
/* GDT, mostly descriptors for user and kernel segments. */
@@ -61,25 +69,25 @@ EXTERN_C void hal_init_platform(
};
// Load memory descriptors.
- Kernel::HAL::RegisterGDT gdtBase;
+ Kernel::HAL::RegisterGDT gdt_reg;
- gdtBase.Base = reinterpret_cast<Kernel::UIntPtr>(cGdt);
- gdtBase.Limit = (sizeof(Kernel::HAL::Detail::ZKA_GDT_ENTRY) * cEntriesCount) - 1;
+ gdt_reg.Base = reinterpret_cast<Kernel::UIntPtr>(cGdt);
+ gdt_reg.Limit = (sizeof(Kernel::HAL::Detail::ZKA_GDT_ENTRY) * cEntriesCount) - 1;
//! GDT will load hal_read_init after it successfully loads the segments.
- Kernel::HAL::GDTLoader gdtLoader;
- gdtLoader.Load(gdtBase);
+ Kernel::HAL::GDTLoader gdt_loader;
+ gdt_loader.Load(gdt_reg);
Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP);
}
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
{
- Kernel::HAL::Register64 idtBase;
- idtBase.Base = (Kernel::UIntPtr)kInterruptVectorTable;
+ Kernel::HAL::Register64 idt_reg;
+ idt_reg.Base = (Kernel::UIntPtr)kInterruptVectorTable;
- Kernel::HAL::IDTLoader idtLoader;
- idtLoader.Load(idtBase);
+ Kernel::HAL::IDTLoader idt_loader;
+ idt_loader.Load(idt_reg);
if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
@@ -87,10 +95,7 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
Kernel::NeFileSystemMgr* mgr = Kernel::mm_new_class<Kernel::NeFileSystemMgr>();
Kernel::NeFileSystemMgr::Mount(mgr);
- Kernel::HAL::mm_map_page(mp_user_switch_proc, Kernel::HAL::eFlagsUser | Kernel::HAL::eFlagsWr | Kernel::HAL::eFlagsPresent);
- Kernel::HAL::mm_map_page(mp_user_switch_proc_stack_begin, Kernel::HAL::eFlagsUser | Kernel::HAL::eFlagsWr | Kernel::HAL::eFlagsPresent);
-
- mp_do_user_switch();
+ Kernel::UserProcessHelper::InitializeScheduling();
Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP);
}
diff --git a/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm b/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm
index c6480778..2ad38107 100644
--- a/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm
+++ b/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm
@@ -9,7 +9,7 @@
[bits 64]
-[global mp_do_user_switch]
+[global mp_do_task_switch]
[global mp_do_context_switch_pre]
[global mp_user_switch_proc]
[global mp_user_switch_proc_stack_begin]
@@ -17,12 +17,9 @@
section .text
;; @brief Switch to user mode.
-mp_do_user_switch:
- mov rbp, rsp
- mov rsp, mp_user_switch_proc_stack_end
-
- mov rdx, mp_user_switch_proc
- invlpg [rdx]
+mp_do_task_switch:
+ mov rbp, rdx
+ mov rsp, rdx
mov ax, 0x18 | 3
mov ds, ax
@@ -32,15 +29,15 @@ mp_do_user_switch:
push 0x18 | 3
- mov rax, mp_user_switch_proc_stack_end
+ mov rax, rdx
push rax
o64 pushf
push 0x20 | 3
- mov rdx, mp_user_switch_proc
- push rdx
+ mov rax, rcx
+ push rax
o64 iret
diff --git a/dev/zka/HALKit/AMD64/HalPagingMgr.cxx b/dev/zka/HALKit/AMD64/HalPagingMgr.cxx
index 06a8b7d2..78978bc7 100644
--- a/dev/zka/HALKit/AMD64/HalPagingMgr.cxx
+++ b/dev/zka/HALKit/AMD64/HalPagingMgr.cxx
@@ -57,7 +57,7 @@ namespace Kernel::HAL
kcout << (pte->User ? "User" : "Not User") << endl;
}
- STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, ZKA_PTE* pt_entry);
+ STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, PTE* pt_entry);
/// @brief Maps or allocates a page from virtual_address.
/// @param virtual_address a valid virtual address.
@@ -121,7 +121,7 @@ namespace Kernel::HAL
/// @brief Maps flags for a specific pte.
/// @internal Internal function.
- STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, ZKA_PTE* pt_entry)
+ STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, PTE* pt_entry)
{
if (flags & ~eFlagsPresent)
pt_entry->Present = false;
diff --git a/dev/zka/HALKit/AMD64/HalSchedulerCore.cxx b/dev/zka/HALKit/AMD64/HalSchedulerCore.cxx
index 9dcce147..d2f678e2 100644
--- a/dev/zka/HALKit/AMD64/HalSchedulerCore.cxx
+++ b/dev/zka/HALKit/AMD64/HalSchedulerCore.cxx
@@ -26,7 +26,7 @@ namespace Kernel
EXTERN_C Void __zka_pure_call(void)
{
- asm volatile("mov %r8, 0; mov %r9, 1; syscall");
+ UserProcessScheduler::The().CurrentProcess().Leak().Crash();
}
Bool hal_check_stack(HAL::StackFramePtr stack_ptr)
diff --git a/dev/zka/HALKit/AMD64/HalUtils.asm b/dev/zka/HALKit/AMD64/HalUtils.asm
index 0e4caf2b..715859e8 100644
--- a/dev/zka/HALKit/AMD64/HalUtils.asm
+++ b/dev/zka/HALKit/AMD64/HalUtils.asm
@@ -25,9 +25,3 @@ rt_install_tib:
[extern cBspDone]
[extern kApicMadtAddressesCount]
-[extern hal_on_ap_startup]
-[global hal_ap_trampoline]
-
-hal_ap_trampoline:
-hal_ap_trampoline_1:
- jmp hal_on_ap_startup
diff --git a/dev/zka/HALKit/AMD64/Processor.hxx b/dev/zka/HALKit/AMD64/Processor.hxx
index b0a8aa0a..f01c73ab 100644
--- a/dev/zka/HALKit/AMD64/Processor.hxx
+++ b/dev/zka/HALKit/AMD64/Processor.hxx
@@ -19,6 +19,15 @@
#include <FirmwareKit/Handover.hxx>
#include <HALKit/AMD64/Paging.hxx>
+#define kPITControlPort 0x43
+#define kPITChannel0Port 0x40
+#define kPITFrequency 1193180
+
+#define kPICCommand 0x20
+#define kPICData 0x21
+#define kPIC2Command 0xA0
+#define kPIC2Data 0xA1
+
EXTERN_C
{
#include <cpuid.h>
@@ -35,7 +44,7 @@ EXTERN_C
#define IsActiveLow(FLG) (FLG & 2)
#define IsLevelTriggered(FLG) (FLG & 8)
-#define kInterruptGate (0x8E)
+#define kInterruptGate (0x0E)
#define kTrapGate (0xEF)
#define kTaskGate (0b10001100)
#define kIDTSelector (0x08)
@@ -59,7 +68,7 @@ namespace Kernel
namespace Kernel::HAL
{
- /// @brief Virtual memory flags.
+ /// @brief Memory Manager mapping flags.
enum
{
eFlagsPresent = 1 << 0,
@@ -168,7 +177,7 @@ namespace Kernel::HAL
static Void Load(Ref<Register64>& idt);
};
- Void mp_get_cores(VoidPtr rsdPtr) noexcept;
+ Void mp_get_cores(VoidPtr rsp_ptr) noexcept;
Void hal_send_start_ipi(UInt32 apicId, UInt8 vector, UInt32 targetAddress);
Void hal_send_end_ipi(UInt32 apicId, UInt8 vector, UInt32 targetAddress);
diff --git a/dev/zka/HALKit/ARM64/APM/APM.cxx b/dev/zka/HALKit/ARM64/APM/APM.cxx
new file mode 100644
index 00000000..7962aa16
--- /dev/null
+++ b/dev/zka/HALKit/ARM64/APM/APM.cxx
@@ -0,0 +1,37 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+------------------------------------------- */
+
+#include <modules/APM/APM.hxx>
+#include <KernelKit/LPC.hxx>
+
+using namespace Kernel;
+
+/// @brief Send a APM command into it's own IO space.
+/// @param base_dma the IO base port.
+/// @param cmd the command.
+/// @return status code.
+EXTERN_C Int32 apm_send_io_command(UInt16 cmd, APMPowerCmd value)
+{
+ switch (cmd)
+ {
+ case kAPMPowerCommandReboot: {
+ asm volatile(
+ "ldr x0, =0x84000009\n"
+ "hvc #0\n");
+
+ return kErrorSuccess;
+ }
+ case kAPMPowerCommandShutdown: {
+ asm volatile(
+ "ldr x0, =0x84000008\n"
+ "hvc #0\n");
+
+ return kErrorSuccess;
+ }
+ default:
+ return kErrorInvalidData;
+ }
+}
diff --git a/dev/zka/HALKit/ARM64/HalACPIFactoryInterface.cxx b/dev/zka/HALKit/ARM64/HalACPIFactoryInterface.cxx
new file mode 100644
index 00000000..75ecefee
--- /dev/null
+++ b/dev/zka/HALKit/ARM64/HalACPIFactoryInterface.cxx
@@ -0,0 +1,31 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+------------------------------------------- */
+
+#include <modules/ACPI/ACPIFactoryInterface.hxx>
+#include <NewKit/String.hxx>
+#include <ArchKit/ArchKit.hxx>
+#include <KernelKit/Heap.hxx>
+#include <modules/APM/APM.hxx>
+
+namespace Kernel
+{
+ ACPIFactoryInterface::ACPIFactoryInterface(VoidPtr rsp_ptr)
+ : fRsdp(rsp_ptr), fEntries(0)
+ {
+ }
+
+ Void ACPIFactoryInterface::Shutdown()
+ {
+ apm_send_io_command(kAPMPowerCommandShutdown, 0);
+ }
+
+ /// @brief Reboot machine in either ACPI or by triple faulting.
+ /// @return nothing it's a reboot.
+ Void ACPIFactoryInterface::Reboot()
+ {
+ apm_send_io_command(kAPMPowerCommandReboot, 0);
+ }
+} // namespace Kernel
diff --git a/dev/zka/HALKit/ARM64/HalCoreMPScheduler.cxx b/dev/zka/HALKit/ARM64/HalCoreMPScheduler.cxx
new file mode 100644
index 00000000..102ca194
--- /dev/null
+++ b/dev/zka/HALKit/ARM64/HalCoreMPScheduler.cxx
@@ -0,0 +1,19 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+------------------------------------------- */
+
+#include <modules/ACPI/ACPIFactoryInterface.hxx>
+#include <KernelKit/UserProcessScheduler.hxx>
+
+using namespace Kernel;
+
+EXTERN_C Void mp_do_task_switch(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame);
+
+EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame)
+{
+ mp_do_task_switch(image, stack_ptr, stack_frame);
+
+ return Yes;
+}
diff --git a/dev/zka/HALKit/ARM64/HalDebugOutput.cxx b/dev/zka/HALKit/ARM64/HalDebugOutput.cxx
new file mode 100644
index 00000000..9dc7278c
--- /dev/null
+++ b/dev/zka/HALKit/ARM64/HalDebugOutput.cxx
@@ -0,0 +1,81 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+------------------------------------------- */
+
+#include <ArchKit/ArchKit.hxx>
+#include <KernelKit/DebugOutput.hxx>
+#include <NewKit/Utils.hxx>
+#include <NewKit/New.hxx>
+
+namespace Kernel
+{
+ EXTERN_C void ke_io_write(const Char* bytes)
+ {
+#ifdef __DEBUG__
+ if (*bytes == 0)
+ return;
+
+ SizeT index = 0;
+ SizeT len = 0;
+
+ index = 0;
+ len = rt_string_len(bytes, 255);
+
+ volatile UInt8* uart_ptr = (UInt8*)0x09000000;
+
+ while (index < len)
+ {
+ if (bytes[index] == '\r')
+ *uart_ptr = '\r';
+
+ *uart_ptr = bytes[index] == '\r' ? '\n' : bytes[index];
+ ++index;
+ }
+#endif // __DEBUG__
+ }
+
+ EXTERN_C void ke_io_read(const Char* bytes)
+ {
+#ifdef __DEBUG__
+ SizeT index = 0;
+
+ volatile UInt8* uart_ptr = (UInt8*)0x09000000;
+
+ ///! TODO: Look on how to wait for the UART to complete.
+ while (Yes)
+ {
+ auto in = *uart_ptr;
+
+ ///! If enter pressed then break.
+ if (in == 0xD)
+ {
+ break;
+ }
+
+ if (in < '0' || in < 'A' || in < 'a')
+ {
+ if (in != '@' || in != '!' || in != '?' || in != '.' || in != '/' ||
+ in != ':')
+ {
+ continue;
+ }
+ }
+
+ ((char*)bytes)[index] = in;
+
+ ++index;
+ }
+
+ ((char*)bytes)[index] = 0;
+#endif // __DEBUG__
+ }
+
+ TerminalDevice TerminalDevice::The() noexcept
+ {
+ TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read);
+ return out;
+ }
+
+} // namespace Kernel
diff --git a/dev/zka/HALKit/ARM64/HalKernelMain.cxx b/dev/zka/HALKit/ARM64/HalKernelMain.cxx
index 56287733..4d0d0875 100644
--- a/dev/zka/HALKit/ARM64/HalKernelMain.cxx
+++ b/dev/zka/HALKit/ARM64/HalKernelMain.cxx
@@ -17,13 +17,6 @@
#include <NetworkKit/IPC.hxx>
#include <CFKit/Property.hxx>
-namespace Kernel::HAL
-{
- /// @brief Gets the system cores using the MADT.
- /// @param rsdPtr The 'RSD PTR' data structure.
- EXTERN void mp_get_cores(Kernel::voidPtr rsdPtr) noexcept;
-} // namespace Kernel::HAL
-
Kernel::Void hal_real_init(Kernel::Void) noexcept;
EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void);
@@ -38,24 +31,5 @@ EXTERN_C void hal_init_platform(
return;
}
- // get page size.
- kKernelBitMpSize = kHandoverHeader->f_BitMapSize;
-
- // get virtual address start (for the heap)
- kKernelBitMpStart = reinterpret_cast<Kernel::VoidPtr>(
- reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart));
-
- if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
- Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
-
- kcout << "Creating filesystem and such.\r";
-
- if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
- Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
-
- Kernel::NeFileSystemMgr::Mount(Kernel::mm_new_class<Kernel::NeFileSystemMgr>());
-
- mp_do_user_switch();
-
- Kernel::ke_stop(RUNTIME_CHECK_FAILED);
+ while (Yes) {}
}
diff --git a/dev/zka/HALKit/ARM64/HalPagingMgr.cxx b/dev/zka/HALKit/ARM64/HalPagingMgr.cxx
new file mode 100644
index 00000000..7e686905
--- /dev/null
+++ b/dev/zka/HALKit/ARM64/HalPagingMgr.cxx
@@ -0,0 +1,87 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+ File: HalPagingMgr.cxx
+ Purpose: Platform Paging Manager..
+
+------------------------------------------- */
+
+#include <HALKit/ARM64/Paging.hxx>
+#include <HALKit/ARM64/Processor.hxx>
+
+namespace Kernel::HAL
+{
+ typedef UInt32 PageTableIndex;
+
+ /// \brief Page store type.
+ struct ZKA_PAGE_STORE final
+ {
+ struct
+ {
+ PDE* fPde{nullptr};
+ PTE* fPte{nullptr};
+ VoidPtr fVAddr{nullptr};
+ } fInternalStore;
+
+ Bool fStoreOp{No}; // Store operation in progress.
+
+ static ZKA_PAGE_STORE& The()
+ {
+ static ZKA_PAGE_STORE the;
+ return the;
+ }
+ };
+
+ /// \brief Retrieve the page status of a PTE.
+ STATIC Void mmi_page_status(PTE* pte)
+ {
+
+ }
+
+ STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, PTE* pt_entry);
+
+ /// @brief Maps or allocates a page from virtual_address.
+ /// @param virtual_address a valid virtual address.
+ /// @param phys_addr point to physical address.
+ /// @param flags the flags to put on the page.
+ /// @return Status code of page manipulation process.
+ EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, UInt32 flags)
+ {
+ if (!virtual_address ||
+ !flags)
+ return 0;
+
+ ZKA_PAGE_STORE& page_store = ZKA_PAGE_STORE::The();
+
+ while (page_store.fStoreOp)
+ ;
+
+ page_store.fStoreOp = Yes;
+
+ if (page_store.fInternalStore.fVAddr == virtual_address)
+ {
+ page_store.fStoreOp = No;
+ return mmi_map_page_table_entry(page_store.fInternalStore.fVAddr, flags, page_store.fInternalStore.fPte);
+ }
+
+ return -1;
+ }
+
+ /// @brief Maps flags for a specific pte.
+ /// @internal Internal function.
+ STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, PTE* pt_entry)
+ {
+ ZKA_PAGE_STORE& page_store = ZKA_PAGE_STORE::The();
+
+ // Update Internal store.
+
+ page_store.fInternalStore.fPde = nullptr;
+ page_store.fInternalStore.fPte = pt_entry;
+ page_store.fInternalStore.fVAddr = virtual_address;
+
+ page_store.fStoreOp = No;
+
+ return 0;
+ }
+} // namespace Kernel::HAL
diff --git a/dev/zka/HALKit/ARM64/HalSchedulerCore.cxx b/dev/zka/HALKit/ARM64/HalSchedulerCore.cxx
index 630df4fd..30e2f1b5 100644
--- a/dev/zka/HALKit/ARM64/HalSchedulerCore.cxx
+++ b/dev/zka/HALKit/ARM64/HalSchedulerCore.cxx
@@ -8,6 +8,11 @@
namespace Kernel
{
+ EXTERN_C Void __zka_pure_call(void)
+ {
+ UserProcessScheduler::The().CurrentProcess().Leak().Crash();
+ }
+
Void UserProcess::SetImageStart(VoidPtr image_start) noexcept
{
if (image_start == 0)
diff --git a/dev/zka/HALKit/ARM64/Processor.hxx b/dev/zka/HALKit/ARM64/Processor.hxx
index 533457a9..68c305f3 100644
--- a/dev/zka/HALKit/ARM64/Processor.hxx
+++ b/dev/zka/HALKit/ARM64/Processor.hxx
@@ -11,8 +11,6 @@
#include <NewKit/Utils.hxx>
#include <FirmwareKit/Handover.hxx>
-#define kPageSize 512 /* 64-bit PT */
-
#define kCPUBackendName "ARMv8"
namespace Kernel::HAL
@@ -23,6 +21,23 @@ namespace Kernel::HAL
UIntPtr Base;
};
+ /// @brief Memory Manager mapping flags.
+ enum
+ {
+ eFlagsPresent = 1 << 0,
+ eFlagsWr = 1 << 1,
+ eFlagsUser = 1 << 2,
+ eFlagsNX = 1 << 3,
+ eFlagsCount = 3,
+ };
+
+ /// @brief Set a PTE from pd_base.
+ /// @param virt_addr a valid virtual address.
+ /// @param phys_addr point to physical address.
+ /// @param flags the flags to put on the page.
+ /// @return Status code of page manip.
+ EXTERN_C Int32 mm_map_page(VoidPtr virt_addr, UInt32 flags);
+
typedef UIntPtr Reg;
typedef Register64 Register;
@@ -37,9 +52,20 @@ namespace Kernel::HAL
Reg R13{0};
Reg R14{0};
Reg R15{0};
+ Reg SP{0};
+ Reg BP{0};
};
typedef StackFrame* StackFramePtr;
+
+ inline Void rt_halt()
+ {
+ while (Yes)
+ {
+
+ }
+ }
+
} // namespace Kernel::HAL
inline Kernel::VoidPtr kKernelBitMpStart = nullptr;
diff --git a/dev/zka/HALKit/POWER/HalContextSwitchPowerPC.s b/dev/zka/HALKit/POWER/HalContextSwitchPowerPC.s
index 588de23a..d90c1fa0 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 mp_do_user_switch
+.globl mp_do_task_switch
/* r3 (3) = assigner stack, r4 (4) = assignee stack */
-mp_do_user_switch:
+mp_do_task_switch:
lwz 0(%4), 0(%3)
lwz 4(%4), 4(%3)
lwz 8(%4), 8(%3)
diff --git a/dev/zka/KernelKit/DriveMgr.hxx b/dev/zka/KernelKit/DriveMgr.hxx
index ffad5340..000020e1 100644
--- a/dev/zka/KernelKit/DriveMgr.hxx
+++ b/dev/zka/KernelKit/DriveMgr.hxx
@@ -26,17 +26,19 @@ namespace Kernel
{
enum
{
- kInvalidDrive = -1,
+ /// Storage type.
+ kInvalidStorage = -1,
kBlockDevice = 0xAD,
kMassStorage = 0xDA,
kFloppyDisc = 0xCD,
kOpticalDisc = 0xDC, // CD-ROM/DVD-ROM/Blu-Ray
- /// combine with below.
+ /// Storage flags, combine with below.
kReadOnly = 0x10, // Read only drive
kEPMDrive = 0x11, // Explicit Partition Map.
kEPTDrive = 0x12, // ESP w/ EPM partition.
- kMBRDrive = 0x13, // IBM PC classic partition scheme
- kDriveCnt = 9,
+ kMBRDrive = 0x13, // PC classic partition scheme
+ kGPTDrive = 0x14, // PC new partition scheme
+ kStorageCount = 9,
};
typedef Int64 rt_drive_id_type;
diff --git a/dev/zka/KernelKit/Heap.hxx b/dev/zka/KernelKit/Heap.hxx
index 8776ab5b..071c7f66 100644
--- a/dev/zka/KernelKit/Heap.hxx
+++ b/dev/zka/KernelKit/Heap.hxx
@@ -52,8 +52,6 @@ namespace Kernel
inline T* mm_new_class(Args&&... args)
{
T* cls = (T*)mm_new_heap(sizeof(T), No, No);
- MUST_PASS(cls);
-
*cls = T(move(args)...);
return cls;
diff --git a/dev/zka/KernelKit/IDLLObject.hxx b/dev/zka/KernelKit/IDLLObject.hxx
index 21c2848a..d8e273eb 100644
--- a/dev/zka/KernelKit/IDLLObject.hxx
+++ b/dev/zka/KernelKit/IDLLObject.hxx
@@ -10,6 +10,7 @@
#pragma once
#include <NewKit/Defines.hxx>
+#include <CompilerKit/CompilerKit.hxx>
namespace Kernel
{
diff --git a/dev/zka/KernelKit/IPEFDLLObject.hxx b/dev/zka/KernelKit/IPEFDLLObject.hxx
index c41d3365..4fbfe7b0 100644
--- a/dev/zka/KernelKit/IPEFDLLObject.hxx
+++ b/dev/zka/KernelKit/IPEFDLLObject.hxx
@@ -13,6 +13,7 @@
#include <KernelKit/PEF.hxx>
#include <NewKit/Defines.hxx>
#include <KernelKit/PEFCodeMgr.hxx>
+#include <KernelKit/UserProcessScheduler.hxx>
#include <KernelKit/IDLLObject.hxx>
namespace Kernel
diff --git a/dev/zka/KernelKit/UserProcessScheduler.hxx b/dev/zka/KernelKit/UserProcessScheduler.hxx
index 6bab5856..84d674cc 100644
--- a/dev/zka/KernelKit/UserProcessScheduler.hxx
+++ b/dev/zka/KernelKit/UserProcessScheduler.hxx
@@ -14,7 +14,7 @@
#define kSchedMinMicroTime (AffinityKind::kStandard)
#define kSchedInvalidPID (-1)
-#define kSchedProcessLimitPerTeam (16U)
+#define kSchedProcessLimitPerTeam (32U)
#define kSchedMaxMemoryLimit gib_cast(128)
#define kSchedMaxStackSz mib_cast(8)
@@ -157,7 +157,7 @@ namespace Kernel
SizeT StackSize{kSchedMaxStackSz};
- //! @brief Shared library handle, reserved for eExecutableDLLKind types of executables only.
+ //! @brief Shared library handle, reserved for kExectuableDLLKind types of executables only.
IPEFDLLObject* PefDLLDelegate{nullptr};
// Memory usage.
@@ -178,15 +178,15 @@ namespace Kernel
enum
{
- eExecutableKind,
- eExecutableDLLKind,
- eExecutableKindCount,
+ kExectuableKind,
+ kExectuableDLLKind,
+ kExectuableKindCount,
};
ProcessTime PTime{0}; //! @brief Process allocated tine.
PID ProcessId{kSchedInvalidPID};
- Int32 Kind{eExecutableKind};
+ Int32 Kind{kExectuableKind};
public:
//! @brief boolean operator, check status.
@@ -263,7 +263,6 @@ namespace Kernel
public:
explicit UserProcessScheduler() = default;
-
~UserProcessScheduler() = default;
ZKA_COPY_DEFAULT(UserProcessScheduler)
@@ -275,23 +274,13 @@ namespace Kernel
UserProcessTeam& CurrentTeam();
public:
- SizeT Add(UserProcess processRef);
- Bool Remove(ProcessID processSlot);
-
- const Bool IsUser() override
- {
- return Yes;
- }
+ SizeT Add(UserProcess process);
+ Bool Remove(ProcessID process_id);
- const Bool IsKernel() override
- {
- return No;
- }
+ const Bool IsUser() override;
+ const Bool IsKernel() override;
+ const Bool HasMP() override;
- const Bool HasMP() override
- {
- return kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled;
- }
public:
Ref<UserProcess>& CurrentProcess();
@@ -315,6 +304,7 @@ namespace Kernel
STATIC bool CanBeScheduled(const UserProcess& process);
STATIC PID& TheCurrentPID();
STATIC SizeT StartScheduling();
+ STATIC Bool InitializeScheduling();
};
const UInt32& sched_get_exit_code(void) noexcept;
diff --git a/dev/zka/NewKit/ErrorOr.hxx b/dev/zka/NewKit/ErrorOr.hxx
index e280cb77..ae475316 100644
--- a/dev/zka/NewKit/ErrorOr.hxx
+++ b/dev/zka/NewKit/ErrorOr.hxx
@@ -34,7 +34,7 @@ namespace Kernel
}
explicit ErrorOr(T Class)
- : mRef(Class, true)
+ : mRef(Class)
{
}
diff --git a/dev/zka/NewKit/Ref.hxx b/dev/zka/NewKit/Ref.hxx
index 31941d50..b374fe73 100644
--- a/dev/zka/NewKit/Ref.hxx
+++ b/dev/zka/NewKit/Ref.hxx
@@ -18,12 +18,17 @@ namespace Kernel
class Ref final
{
public:
- Ref() = default;
- ~Ref() = default;
+ Ref() = default;
+
+ ~Ref()
+ {
+ if (mm_is_valid_heap(fClass))
+ delete fClass;
+ }
public:
- Ref(T cls, const Bool& strong = false)
- : fClass(&cls), fStrong(strong)
+ Ref(T cls)
+ : fClass(&cls)
{
}
@@ -59,19 +64,13 @@ namespace Kernel
return *fClass;
}
- bool IsStrong() const
- {
- return fStrong;
- }
-
operator bool() noexcept
{
- return fStrong;
+ return fClass;
}
private:
T* fClass{nullptr};
- Bool fStrong{false};
};
template <typename T>
@@ -82,7 +81,7 @@ namespace Kernel
NonNullRef(nullPtr) = delete;
NonNullRef(T* ref)
- : fRef(ref, true)
+ : fRef(ref)
{
MUST_PASS(ref);
}
diff --git a/dev/zka/NewKit/String.hxx b/dev/zka/NewKit/String.hxx
index 184ccc42..80f3b279 100644
--- a/dev/zka/NewKit/String.hxx
+++ b/dev/zka/NewKit/String.hxx
@@ -83,7 +83,6 @@ namespace Kernel
struct StringBuilder final
{
static ErrorOr<StringView> Construct(const Char* data);
- static const Char* FromInt(const Char* fmt, int n);
static const Char* FromBool(const Char* fmt, bool n);
static const Char* Format(const Char* fmt, const Char* from);
static bool Equals(const Char* lhs, const Char* rhs);
diff --git a/dev/zka/arm64-efi.make b/dev/zka/arm64-efi.make
index 51ea8638..2db6535c 100644
--- a/dev/zka/arm64-efi.make
+++ b/dev/zka/arm64-efi.make
@@ -7,7 +7,7 @@ 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_NEFS__ -D__NEWOSKRNL__ -D__HAVE_ZKA_APIS__ -D__ZKA__ -I../
+ -std=c++20 -O3 -D__NEWOSKRNL__ -D__ZKA_MINIMAL_OS__ -D__ZKA_NO_BUILTIN__ -D__HAVE_ZKA_APIS__ -D__ZKA__ -I../
ASM = clang++
@@ -23,7 +23,7 @@ LDFLAGS = -subsystem:efi_application -entry:hal_init_platform /nodefaultlib
LDOBJ = obj/*.obj
# This file is the Kernel, responsible of task management and memory.
-KERNEL = minoskrnl.so
+KERNEL = minoskrnl.exe
.PHONY: error
error:
@@ -38,7 +38,7 @@ newos-arm64-epm: clean
$(wildcard src/FS/*.cxx) $(wildcard HALKit/ARM64/Storage/*.cxx) \
$(wildcard HALKit/ARM64/PCI/*.cxx) $(wildcard src/Network/*.cxx) $(wildcard src/Storage/*.cxx) \
$(wildcard HALKit/ARM64/*.cxx) $(wildcard HALKit/ARM64/*.cpp) \
- $(wildcard HALKit/ARM64/*.s)
+ $(wildcard HALKit/ARM64/*.s) $(wildcard HALKit/ARM64/APM/*.cxx)
$(MOVEALL)
diff --git a/dev/zka/src/ACPIFactoryInterface.cxx b/dev/zka/src/ACPIFactoryInterface.cxx
new file mode 100644
index 00000000..e5c0b514
--- /dev/null
+++ b/dev/zka/src/ACPIFactoryInterface.cxx
@@ -0,0 +1,95 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+------------------------------------------- */
+
+#include <modules/ACPI/ACPIFactoryInterface.hxx>
+#include <NewKit/String.hxx>
+#include <ArchKit/ArchKit.hxx>
+#include <KernelKit/Heap.hxx>
+
+namespace Kernel
+{
+ /// @brief Finds a descriptor table inside ACPI XSDT.
+ ErrorOr<voidPtr> ACPIFactoryInterface::Find(const Char* signature)
+ {
+ MUST_PASS(fRsdp);
+
+ if (!signature)
+ return ErrorOr<voidPtr>{-1};
+
+ if (*signature == 0)
+ return ErrorOr<voidPtr>{-1};
+
+ RSDP* rsp_ptr = reinterpret_cast<RSDP*>(this->fRsdp);
+
+ if (rsp_ptr->Revision <= 1)
+ return ErrorOr<voidPtr>{-1};
+
+ RSDT* xsdt = reinterpret_cast<RSDT*>(rsp_ptr->RsdtAddress);
+
+ Int64 num = (xsdt->Length - sizeof(SDT)) / sizeof(UInt32);
+
+ /***
+ crucial to avoid - overflows.
+ */
+ if (num < 1)
+ {
+ /// stop here, we should have entries...
+ ke_stop(RUNTIME_CHECK_ACPI);
+ return ErrorOr<voidPtr>{-1};
+ }
+
+ this->fEntries = num;
+
+ kcout << "ACPI: Number of entries: " << number(this->fEntries) << endl;
+ kcout << "ACPI: Revision: " << number(xsdt->Revision) << endl;
+ kcout << "ACPI: Signature: " << xsdt->Signature << endl;
+ kcout << "ACPI: Address of XSDT: " << hex_number((UIntPtr)xsdt) << endl;
+
+ const short cAcpiSignatureLength = 4;
+
+ for (Size index = 0; index < this->fEntries; ++index)
+ {
+ SDT* sdt = reinterpret_cast<SDT*>(xsdt->AddressArr[index]);
+
+ kcout << "ACPI: Checksum: " << number(sdt->Checksum) << endl;
+ kcout << "ACPI: Revision: " << number(sdt->Revision) << endl;
+
+ for (short signature_index = 0; signature_index < cAcpiSignatureLength; ++signature_index)
+ {
+ if (sdt->Signature[signature_index] != signature[signature_index])
+ break;
+
+ if (signature_index == (cAcpiSignatureLength - 1))
+ {
+ kcout << "ACPI: Found the SDT. " << endl;
+ return ErrorOr<voidPtr>(reinterpret_cast<voidPtr>(xsdt->AddressArr[index]));
+ }
+ }
+ }
+
+ return ErrorOr<voidPtr>{-1};
+ }
+
+ /***
+ @brief check SDT header
+ @param checksum the header to checksum
+ @param len the length of it.
+*/
+ bool ACPIFactoryInterface::Checksum(const Char* checksum, SSizeT len)
+ {
+ if (len == 0)
+ return -1;
+
+ char chr = 0;
+
+ for (int index = 0; index < len; ++index)
+ {
+ chr += checksum[index];
+ }
+
+ return chr == 0;
+ }
+} // namespace Kernel
diff --git a/dev/zka/src/BitMapMgr.cxx b/dev/zka/src/BitMapMgr.cxx
index 8e8a2208..a3d403d3 100644
--- a/dev/zka/src/BitMapMgr.cxx
+++ b/dev/zka/src/BitMapMgr.cxx
@@ -168,7 +168,7 @@ namespace Kernel
if (!ptr_new)
{
- ke_stop(RUNTIME_CHECK_PAGE);
+ return nullptr;
}
if (wr)
diff --git a/dev/zka/src/CRuntime.cxx b/dev/zka/src/CRuntime.cxx
new file mode 100644
index 00000000..832c39f6
--- /dev/null
+++ b/dev/zka/src/CRuntime.cxx
@@ -0,0 +1,69 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+------------------------------------------- */
+
+#include <KernelKit/DebugOutput.hxx>
+
+using namespace Kernel;
+
+/// @brief memset definition in C++.
+/// @param dst destination pointer.
+/// @param byte value to fill in.
+/// @param len length of of src.
+EXTERN_C VoidPtr memset(void* dst, int byte, long long unsigned int len)
+{
+ for (size_t i = 0UL; i < len; ++i)
+ {
+ ((int*)dst)[i] = byte;
+ }
+
+ return dst;
+}
+
+/// @brief memcpy definition in C++.
+/// @param dst destination pointer.
+/// @param src source pointer.
+/// @param len length of of src.
+EXTERN_C VoidPtr memcpy(void* dst, const void* src, long long unsigned int len)
+{
+ for (size_t i = 0UL; i < len; ++i)
+ {
+ ((int*)dst)[i] = ((int*)src)[i];
+ }
+
+ return dst;
+}
+
+/// @brief strlen definition in C++.
+EXTERN_C size_t strlen(const char* whatToCheck)
+{
+ SizeT len = 0;
+
+ while (whatToCheck[len] != 0)
+ {
+ ++len;
+ }
+
+ return len;
+}
+
+/// @brief strcmp definition in C++.
+EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight)
+{
+ if (!whatToCheck || *whatToCheck == 0)
+ return 0;
+
+ SizeT len = 0;
+
+ while (whatToCheck[len] == whatToCheckRight[len])
+ {
+ if (whatToCheck[len] == 0)
+ return 0;
+
+ ++len;
+ }
+
+ return len;
+}
diff --git a/dev/zka/src/CodeMgr.cxx b/dev/zka/src/CodeMgr.cxx
index cc1d2059..c3f06096 100644
--- a/dev/zka/src/CodeMgr.cxx
+++ b/dev/zka/src/CodeMgr.cxx
@@ -22,7 +22,7 @@ namespace Kernel
UserProcess proc;
proc.SetImageStart(reinterpret_cast<VoidPtr>(main));
- proc.Kind = UserProcess::eExecutableKind;
+ proc.Kind = UserProcess::kExectuableKind;
proc.StackSize = kib_cast(32);
rt_set_memory(proc.Name, 0, kProcessLen);
diff --git a/dev/zka/src/CxxAbi-AMD64.cxx b/dev/zka/src/CxxAbi-AMD64.cxx
index 908e26f4..1f3c5495 100644
--- a/dev/zka/src/CxxAbi-AMD64.cxx
+++ b/dev/zka/src/CxxAbi-AMD64.cxx
@@ -17,15 +17,16 @@ uarch_t __atexit_func_count;
/// @brief Dynamic Shared Object Handle.
Kernel::UIntPtr __dso_handle;
-EXTERN_C void __cxa_pure_virtual()
+EXTERN_C Kernel::Void __cxa_pure_virtual(void* self)
{
- kcout << "C++ placeholder method.\n";
+ kcout << "object: " << Kernel::number(reinterpret_cast<Kernel::UIntPtr>(self));
+ kcout << ", has unimplemented virtual functions.\r";
}
EXTERN_C void ___chkstk_ms(void)
{
- Kernel::err_bug_check_raise();
- Kernel::err_bug_check();
+ kcout << "Stack pointer has grown too much.\r";
+ Kernel::ke_stop(RUNTIME_CHECK_FAILED);
}
EXTERN_C int atexit(void (*f)(void*), void* arg, void* dso)
diff --git a/dev/zka/src/CxxAbi-ARM64.cxx b/dev/zka/src/CxxAbi-ARM64.cxx
index f6f7e763..b1e3ec1b 100644
--- a/dev/zka/src/CxxAbi-ARM64.cxx
+++ b/dev/zka/src/CxxAbi-ARM64.cxx
@@ -10,65 +10,79 @@
#include <NewKit/CxxAbi.hxx>
#include <KernelKit/LPC.hxx>
-EXTERN_C
-{
-#include <limits.h>
-}
+atexit_func_entry_t __atexit_funcs[kDSOMaxObjects];
-int const cUninitialized = 0;
-int const cBeingInitialized = -1;
-int const cEpochStart = INT_MIN;
+uarch_t __atexit_func_count;
-EXTERN_C
-{
- int _Init_global_epoch = cEpochStart;
- __thread int _Init_thread_epoch = cEpochStart;
-}
+/// @brief Dynamic Shared Object Handle.
+Kernel::UIntPtr __dso_handle;
-Kernel::UInt32 const cNKTimeout = 100; // ms
+EXTERN_C void __chkstk(void) {}
-EXTERN_C void __cdecl _Init_thread_wait(Kernel::UInt32 const timeout)
+EXTERN_C int atexit(void (*f)(void*), void* arg, void* dso)
{
- MUST_PASS(timeout != INT_MAX);
+ if (__atexit_func_count >= kDSOMaxObjects)
+ return -1;
+
+ __atexit_funcs[__atexit_func_count].destructor_func = f;
+ __atexit_funcs[__atexit_func_count].obj_ptr = arg;
+ __atexit_funcs[__atexit_func_count].dso_handle = dso;
+
+ __atexit_func_count++;
+
+ return 0;
}
-EXTERN_C void __cdecl _Init_thread_header(int* const pOnce) noexcept
+EXTERN_C void __cxa_finalize(void* f)
{
- if (*pOnce == cUninitialized)
+ uarch_t i = __atexit_func_count;
+ if (!f)
{
- *pOnce = cBeingInitialized;
- }
- else
- {
- while (*pOnce == cBeingInitialized)
+ while (i--)
{
- _Init_thread_wait(cNKTimeout);
-
- if (*pOnce == cUninitialized)
+ if (__atexit_funcs[i].destructor_func)
{
- *pOnce = cBeingInitialized;
- return;
- }
+ (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr);
+ };
}
- _Init_thread_epoch = _Init_global_epoch;
+
+ return;
}
-}
-EXTERN_C void __cdecl _Init_thread_abort(int* const pOnce) noexcept
-{
- *pOnce = cUninitialized;
+ while (i--)
+ {
+ if (__atexit_funcs[i].destructor_func)
+ {
+ (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr);
+ __atexit_funcs[i].destructor_func = 0;
+ };
+ }
}
-EXTERN_C void __cdecl _Init_thread_footer(int* const pOnce) noexcept
+namespace cxxabiv1
{
- ++_Init_global_epoch;
- *pOnce = _Init_global_epoch;
- _Init_thread_epoch = _Init_global_epoch;
-}
+ EXTERN_C int __cxa_guard_acquire(__guard* g)
+ {
+ (void)g;
+ return 0;
+ }
+
+ EXTERN_C int __cxa_guard_release(__guard* g)
+ {
+ *(char*)g = 1;
+ return 0;
+ }
+
+ EXTERN_C void __cxa_guard_abort(__guard* g)
+ {
+ (void)g;
+ }
+} // namespace cxxabiv1
-EXTERN_C void _purecall()
+EXTERN_C Kernel::Void _purecall(void* self)
{
- ZKA_UNUSED(0);
+ kcout << "object: " << Kernel::number(reinterpret_cast<Kernel::UIntPtr>(self));
+ kcout << ", has unimplemented virtual functions.\r";
}
#endif // ifdef __ZKA_ARM64__
diff --git a/dev/zka/src/DriveMgr.cxx b/dev/zka/src/DriveMgr.cxx
index 77412d12..b5edb2b1 100644
--- a/dev/zka/src/DriveMgr.cxx
+++ b/dev/zka/src/DriveMgr.cxx
@@ -88,20 +88,24 @@ namespace Kernel
return "ATA-PIO";
}
#endif
-
#ifdef __ATA_DMA__
const Char* io_drv_kind(Void)
{
return "ATA-DMA";
}
#endif
-
#ifdef __AHCI__
const Char* io_drv_kind(Void)
{
return "AHCI";
}
#endif
+#ifdef __ZKA_MINIMAL_OS__
+ const Char* io_drv_kind(Void)
+ {
+ return "Unknown";
+ }
+#endif
/// @brief Unimplemented drive.
/// @param pckt
@@ -118,7 +122,7 @@ namespace Kernel
DriveTrait trait;
rt_copy_memory((VoidPtr) "\\Mount\\NUL:", trait.fName, rt_string_len("\\Mount\\NUL:"));
- trait.fKind = kInvalidDrive;
+ trait.fKind = kInvalidStorage;
trait.fInput = io_drv_unimplemented;
trait.fOutput = io_drv_unimplemented;
@@ -136,7 +140,7 @@ namespace Kernel
DriveTrait trait;
rt_copy_memory((VoidPtr) "\\Mount\\MainDisk:", trait.fName, rt_string_len("\\Mount\\MainDisk:"));
- trait.fKind = kMassStorage;
+ trait.fKind = kMassStorage | kEPMDrive;
trait.fVerify = io_drv_unimplemented;
trait.fOutput = io_drv_output;
diff --git a/dev/zka/src/FS/NeFS.cxx b/dev/zka/src/FS/NeFS.cxx
index ee1e32c6..455f894d 100644
--- a/dev/zka/src/FS/NeFS.cxx
+++ b/dev/zka/src/FS/NeFS.cxx
@@ -19,9 +19,10 @@
#include <KernelKit/UserProcessScheduler.hxx>
#include <KernelKit/User.hxx>
+#ifndef __ZKA_MINIMAL_OS__
using namespace Kernel;
-#ifdef __ZKA_IN_EDITOR__
+#ifdef __ZKA_NO_BUILTIN__
/***********************************************************************************/
/**
Define those external symbols, to make the editor shutup
@@ -325,56 +326,56 @@ _Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name,
constexpr auto cNeFSCatalogPadding = 4;
- NFS_ROOT_PARTITION_BLOCK* partBlock = (NFS_ROOT_PARTITION_BLOCK*)sectorBufPartBlock;
- out_lba = partBlock->StartCatalog;
+ NFS_ROOT_PARTITION_BLOCK* part_block = (NFS_ROOT_PARTITION_BLOCK*)sectorBufPartBlock;
+ out_lba = part_block->StartCatalog;
}
constexpr SizeT cDefaultForkSize = kNeFSForkSize;
- NFS_CATALOG_STRUCT* catalogChild = new NFS_CATALOG_STRUCT();
+ NFS_CATALOG_STRUCT* child_catalog = new NFS_CATALOG_STRUCT();
Int32 flagsList = flags;
- catalogChild->ResourceForkSize = cDefaultForkSize;
- catalogChild->DataForkSize = cDefaultForkSize;
+ child_catalog->ResourceForkSize = cDefaultForkSize;
+ child_catalog->DataForkSize = cDefaultForkSize;
- catalogChild->NextSibling = out_lba;
- catalogChild->PrevSibling = out_lba;
- catalogChild->Kind = kind;
- catalogChild->Flags = kNeFSFlagCreated | flagsList;
+ child_catalog->NextSibling = out_lba;
+ child_catalog->PrevSibling = out_lba;
+ child_catalog->Kind = kind;
+ child_catalog->Flags = kNeFSFlagCreated | flagsList;
- rt_copy_memory((VoidPtr)name, (VoidPtr)catalogChild->Name,
+ rt_copy_memory((VoidPtr)name, (VoidPtr)child_catalog->Name,
rt_string_len(name));
- UInt16 catalogBuf[kNeFSSectorSz] = {0};
+ NFS_CATALOG_STRUCT temporary_catalog;
Lba start_free = out_lba;
rt_copy_memory((VoidPtr) "fs/newfs-packet", drive.fPacket.fPacketMime,
rt_string_len("fs/newfs-packet"));
- drive.fPacket.fPacketContent = catalogBuf;
+ drive.fPacket.fPacketContent = &temporary_catalog;
drive.fPacket.fPacketSize = kNeFSSectorSz;
drive.fPacket.fLba = start_free;
drive.fInput(&drive.fPacket);
- NFS_CATALOG_STRUCT* nextSibling = (NFS_CATALOG_STRUCT*)catalogBuf;
+ NFS_CATALOG_STRUCT* next_sibling = reinterpret_cast<NFS_CATALOG_STRUCT*>(&temporary_catalog);
- start_free = nextSibling->NextSibling;
+ start_free = next_sibling->NextSibling;
- catalogChild->PrevSibling = out_lba;
+ child_catalog->PrevSibling = out_lba;
drive.fPacket.fLba = start_free;
drive.fInput(&drive.fPacket);
while (drive.fPacket.fPacketGood)
{
- nextSibling = reinterpret_cast<NFS_CATALOG_STRUCT*>(catalogBuf);
+ next_sibling = reinterpret_cast<NFS_CATALOG_STRUCT*>(&temporary_catalog);
if (start_free <= kNeFSRootCatalogStartAddress)
{
- delete catalogChild;
+ delete child_catalog;
delete catalog;
return nullptr;
@@ -383,7 +384,7 @@ _Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name,
// ========================== //
// Allocate catalog now...
// ========================== //
- if ((nextSibling->Flags & kNeFSFlagCreated) == 0)
+ if ((next_sibling->Flags & kNeFSFlagCreated) == 0)
{
Char sectorBufPartBlock[kNeFSSectorSz] = {0};
@@ -395,26 +396,26 @@ _Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name,
constexpr auto cNeFSCatalogPadding = 4;
- NFS_ROOT_PARTITION_BLOCK* partBlock = (NFS_ROOT_PARTITION_BLOCK*)sectorBufPartBlock;
+ NFS_ROOT_PARTITION_BLOCK* part_block = (NFS_ROOT_PARTITION_BLOCK*)sectorBufPartBlock;
- if (partBlock->FreeCatalog < 1)
+ if (part_block->FreeCatalog < 1)
{
- delete catalogChild;
+ delete child_catalog;
return nullptr;
}
- catalogChild->DataFork = partBlock->DiskSize - start_free;
- catalogChild->ResourceFork = catalogChild->DataFork;
+ child_catalog->DataFork = part_block->DiskSize - start_free;
+ child_catalog->ResourceFork = child_catalog->DataFork;
// Write the new catalog next sibling, if we don't know this parent. //
// This is necessary, so that we don't have to get another lba to allocate. //
- if (!StringBuilder::Equals(parentName, nextSibling->Name))
+ if (!StringBuilder::Equals(parentName, next_sibling->Name))
{
- catalogChild->NextSibling =
+ child_catalog->NextSibling =
start_free + (sizeof(NFS_CATALOG_STRUCT) * cNeFSCatalogPadding);
}
- drive.fPacket.fPacketContent = catalogChild;
+ drive.fPacket.fPacketContent = child_catalog;
drive.fPacket.fPacketSize = sizeof(NFS_CATALOG_STRUCT);
drive.fPacket.fLba = start_free;
@@ -428,24 +429,24 @@ _Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name,
drive.fInput(&drive.fPacket);
- partBlock->FreeSectors -= 1;
- partBlock->CatalogCount += 1;
- partBlock->FreeCatalog -= 1;
+ part_block->FreeSectors -= 1;
+ part_block->CatalogCount += 1;
+ part_block->FreeCatalog -= 1;
drive.fOutput(&drive.fPacket);
kcout << "Create new catalog, status: "
- << hex_number(catalogChild->Flags) << endl;
- kcout << "Create new catalog, name: " << catalogChild->Name
+ << hex_number(child_catalog->Flags) << endl;
+ kcout << "Create new catalog, name: " << child_catalog->Name
<< endl;
delete catalog;
- return catalogChild;
+ return child_catalog;
}
- else if ((nextSibling->Flags & kNeFSFlagCreated) &&
- StringBuilder::Equals(nextSibling->Name, name))
+ else if ((next_sibling->Flags & kNeFSFlagCreated) &&
+ StringBuilder::Equals(next_sibling->Name, name))
{
- return nextSibling;
+ return next_sibling;
}
constexpr auto cNeFSCatalogPadding = 4;
@@ -453,7 +454,7 @@ _Output NFS_CATALOG_STRUCT* NeFSParser::CreateCatalog(_Input const Char* name,
//// @note that's how we find the next catalog in the partition block.
start_free = start_free + (sizeof(NFS_CATALOG_STRUCT) * cNeFSCatalogPadding);
- drive.fPacket.fPacketContent = catalogBuf;
+ drive.fPacket.fPacketContent = &temporary_catalog;
drive.fPacket.fPacketSize = kNeFSSectorSz;
drive.fPacket.fLba = start_free;
@@ -563,22 +564,22 @@ bool NeFSParser::Format(_Input _Output DriveTrait* drive, _Input const Lba endLb
// disk isnt faulty and data has been fetched.
while (drive->fPacket.fPacketGood)
{
- NFS_ROOT_PARTITION_BLOCK* partBlock = (NFS_ROOT_PARTITION_BLOCK*)fs_buf;
+ NFS_ROOT_PARTITION_BLOCK* part_block = (NFS_ROOT_PARTITION_BLOCK*)fs_buf;
// check for an empty partition here.
- if (partBlock->PartitionName[0] == 0 &&
- rt_string_cmp(partBlock->Ident, kNeFSIdent, kNeFSIdentLen))
+ if (part_block->PartitionName[0] == 0 &&
+ rt_string_cmp(part_block->Ident, kNeFSIdent, kNeFSIdentLen))
{
// partition is free and valid.
- partBlock->Version = kNeFSVersionInteger;
+ part_block->Version = kNeFSVersionInteger;
const auto cUntitledHD = part_name;
- rt_copy_memory((VoidPtr)kNeFSIdent, (VoidPtr)partBlock->Ident,
+ rt_copy_memory((VoidPtr)kNeFSIdent, (VoidPtr)part_block->Ident,
kNeFSIdentLen);
- rt_copy_memory((VoidPtr)cUntitledHD, (VoidPtr)partBlock->PartitionName,
+ rt_copy_memory((VoidPtr)cUntitledHD, (VoidPtr)part_block->PartitionName,
rt_string_len(cUntitledHD));
SizeT catalogCount = 0UL;
@@ -586,13 +587,13 @@ bool NeFSParser::Format(_Input _Output DriveTrait* drive, _Input const Lba endLb
SizeT sectorCount = drv_get_sector_count();
SizeT diskSize = drv_get_size();
- partBlock->Kind = kNeFSPartitionTypeStandard;
- partBlock->StartCatalog = kNeFSCatalogStartAddress;
- partBlock->Flags = kNeFSPartitionTypeStandard;
- partBlock->CatalogCount = sectorCount / sizeof(NFS_CATALOG_STRUCT);
- partBlock->SectorCount = sectorCount;
- partBlock->DiskSize = diskSize;
- partBlock->FreeCatalog = sectorCount / sizeof(NFS_CATALOG_STRUCT);
+ part_block->Kind = kNeFSPartitionTypeStandard;
+ part_block->StartCatalog = kNeFSCatalogStartAddress;
+ part_block->Flags = kNeFSPartitionTypeStandard;
+ part_block->CatalogCount = sectorCount / sizeof(NFS_CATALOG_STRUCT);
+ part_block->SectorCount = sectorCount;
+ part_block->DiskSize = diskSize;
+ part_block->FreeCatalog = sectorCount / sizeof(NFS_CATALOG_STRUCT);
drive->fPacket.fPacketContent = fs_buf;
drive->fPacket.fPacketSize = kNeFSSectorSz;
@@ -602,12 +603,12 @@ bool NeFSParser::Format(_Input _Output DriveTrait* drive, _Input const Lba endLb
kcout << "drive kind: " << drive->fDriveKind() << endl;
- kcout << "partition name: " << partBlock->PartitionName << endl;
- kcout << "start: " << hex_number(partBlock->StartCatalog) << endl;
- kcout << "number of catalogs: " << hex_number(partBlock->CatalogCount) << endl;
- kcout << "free catalog: " << hex_number(partBlock->FreeCatalog) << endl;
- kcout << "free sectors: " << hex_number(partBlock->FreeSectors) << endl;
- kcout << "sector size: " << hex_number(partBlock->SectorSize) << endl;
+ kcout << "partition name: " << part_block->PartitionName << endl;
+ kcout << "start: " << hex_number(part_block->StartCatalog) << endl;
+ kcout << "number of catalogs: " << hex_number(part_block->CatalogCount) << endl;
+ kcout << "free catalog: " << hex_number(part_block->FreeCatalog) << endl;
+ kcout << "free sectors: " << hex_number(part_block->FreeSectors) << endl;
+ kcout << "sector size: " << hex_number(part_block->SectorSize) << endl;
// write the root catalog.
this->CreateCatalog(kNeFSRoot, 0, kNeFSCatalogKindDir);
@@ -617,7 +618,7 @@ bool NeFSParser::Format(_Input _Output DriveTrait* drive, _Input const Lba endLb
kcout << "partition block already exists.\r";
- start += partBlock->DiskSize;
+ start += part_block->DiskSize;
drive->fPacket.fPacketContent = fs_buf;
drive->fPacket.fPacketSize = kNeFSSectorSz;
@@ -745,10 +746,10 @@ _Output NFS_CATALOG_STRUCT* NeFSParser::FindCatalog(_Input const Char* catalogNa
auto localSearchFirst = false;
- NFS_CATALOG_STRUCT catalogBuf{0};
+ NFS_CATALOG_STRUCT temporary_catalog{0};
drive.fPacket.fLba = startCatalogList;
- drive.fPacket.fPacketContent = &catalogBuf;
+ drive.fPacket.fPacketContent = &temporary_catalog;
drive.fPacket.fPacketSize = sizeof(NFS_CATALOG_STRUCT);
drive.fInput(&drive.fPacket);
@@ -802,12 +803,12 @@ NeFSSearchThroughCatalogList:
while (drive.fPacket.fPacketGood)
{
drive.fPacket.fLba = startCatalogList;
- drive.fPacket.fPacketContent = &catalogBuf;
+ drive.fPacket.fPacketContent = &temporary_catalog;
drive.fPacket.fPacketSize = sizeof(NFS_CATALOG_STRUCT);
drive.fInput(&drive.fPacket);
- NFS_CATALOG_STRUCT* catalog = (NFS_CATALOG_STRUCT*)&catalogBuf;
+ NFS_CATALOG_STRUCT* catalog = (NFS_CATALOG_STRUCT*)&temporary_catalog;
if (StringBuilder::Equals(catalogName, catalog->Name))
{
@@ -909,11 +910,11 @@ Boolean NeFSParser::RemoveCatalog(_Input const Char* catalogName)
drive.fInput(&drive.fPacket);
- NFS_ROOT_PARTITION_BLOCK* partBlock =
+ NFS_ROOT_PARTITION_BLOCK* part_block =
reinterpret_cast<NFS_ROOT_PARTITION_BLOCK*>(partitionBlockBuf);
- --partBlock->CatalogCount;
- ++partBlock->FreeSectors;
+ --part_block->CatalogCount;
+ ++part_block->FreeSectors;
drive.fOutput(&drive.fPacket);
@@ -1051,5 +1052,6 @@ namespace Kernel::Detail
return true;
}
} // namespace Kernel::Detail
+#endif // !__ZKA_MINIMAL_OS__
#endif // ifdef __FSKIT_USE_NEFS__
diff --git a/dev/zka/src/GUIDWizard.cxx b/dev/zka/src/GUIDWizard.cxx
index aede3a19..c1aa23f5 100644
--- a/dev/zka/src/GUIDWizard.cxx
+++ b/dev/zka/src/GUIDWizard.cxx
@@ -19,47 +19,47 @@
namespace Kernel::XRN::Version1
{
- auto cf_make_sequence(const ArrayList<UInt32>& uuidSeq) -> Ref<GUIDSequence*>
+ auto cf_make_sequence(const ArrayList<UInt32>& uuidSeq) -> Ref<GUIDSequence>
{
GUIDSequence* seq = new GUIDSequence();
MUST_PASS(seq);
- Ref<GUIDSequence*> sequenceReference{seq, true};
-
- sequenceReference->fMs1 = uuidSeq[0];
- sequenceReference->fMs2 = uuidSeq[1];
- sequenceReference->fMs3 = uuidSeq[2];
- sequenceReference->fMs4[0] = uuidSeq[3];
- sequenceReference->fMs4[1] = uuidSeq[4];
- sequenceReference->fMs4[2] = uuidSeq[5];
- sequenceReference->fMs4[3] = uuidSeq[6];
- sequenceReference->fMs4[4] = uuidSeq[7];
- sequenceReference->fMs4[5] = uuidSeq[8];
- sequenceReference->fMs4[6] = uuidSeq[9];
- sequenceReference->fMs4[7] = uuidSeq[10];
-
- return sequenceReference;
+ Ref<GUIDSequence> seq_ref{*seq};
+
+ seq_ref.Leak().fMs1 = uuidSeq[0];
+ seq_ref.Leak().fMs2 = uuidSeq[1];
+ seq_ref.Leak().fMs3 = uuidSeq[2];
+ seq_ref.Leak().fMs4[0] = uuidSeq[3];
+ seq_ref.Leak().fMs4[1] = uuidSeq[4];
+ seq_ref.Leak().fMs4[2] = uuidSeq[5];
+ seq_ref.Leak().fMs4[3] = uuidSeq[6];
+ seq_ref.Leak().fMs4[4] = uuidSeq[7];
+ seq_ref.Leak().fMs4[5] = uuidSeq[8];
+ seq_ref.Leak().fMs4[6] = uuidSeq[9];
+ seq_ref.Leak().fMs4[7] = uuidSeq[10];
+
+ return seq_ref;
}
// @brief Tries to make a guid out of a string.
// This function is not complete for now
- auto cf_try_guid_to_string(Ref<GUIDSequence*>& seq) -> ErrorOr<Ref<StringView>>
+ auto cf_try_guid_to_string(Ref<GUIDSequence>& seq) -> ErrorOr<Ref<StringView>>
{
Char buf[kUUIDSize];
for (SizeT index = 0; index < 16; ++index)
{
- buf[index] = seq->u8[index] + kAsciiBegin;
+ buf[index] = seq.Leak().u8[index] + kAsciiBegin;
}
for (SizeT index = 16; index < 24; ++index)
{
- buf[index] = seq->u16[index] + kAsciiBegin;
+ buf[index] = seq.Leak().u16[index] + kAsciiBegin;
}
for (SizeT index = 24; index < 28; ++index)
{
- buf[index] = seq->u32[index] + kAsciiBegin;
+ buf[index] = seq.Leak().u32[index] + kAsciiBegin;
}
auto view = StringBuilder::Construct(buf);
diff --git a/dev/zka/src/HardwareThreadScheduler.cxx b/dev/zka/src/HardwareThreadScheduler.cxx
index ef04907d..cc32dd0d 100644
--- a/dev/zka/src/HardwareThreadScheduler.cxx
+++ b/dev/zka/src/HardwareThreadScheduler.cxx
@@ -108,8 +108,6 @@ namespace Kernel
fStack = frame;
- kcout << "Trying to register progress...\r";
-
Bool ret = mp_register_process(image, stack_ptr, fStack);
if (ret)
diff --git a/dev/zka/src/NeFS+FileMgr.cxx b/dev/zka/src/NeFS+FileMgr.cxx
index cee80531..bd9c260b 100644
--- a/dev/zka/src/NeFS+FileMgr.cxx
+++ b/dev/zka/src/NeFS+FileMgr.cxx
@@ -7,6 +7,7 @@
#include <KernelKit/FileMgr.hxx>
#include <KernelKit/Heap.hxx>
+#ifndef __ZKA_MINIMAL_OS__
#ifdef __FSKIT_USE_NEFS__
/// @brief NeFS File manager.
@@ -14,7 +15,6 @@
namespace Kernel
{
-#ifdef __FSKIT_USE_NEFS__
/// @brief C++ constructor
NeFileSystemMgr::NeFileSystemMgr()
{
@@ -242,7 +242,7 @@ namespace Kernel
{
return fImpl;
}
-#endif // __FSKIT_USE_NEFS__
} // namespace Kernel
#endif // ifdef __FSKIT_USE_NEFS__
+#endif // ifndef __ZKA_MINIMAL_OS__
diff --git a/dev/zka/src/PageMgr.cxx b/dev/zka/src/PageMgr.cxx
index 3a4a743c..df8e85b4 100644
--- a/dev/zka/src/PageMgr.cxx
+++ b/dev/zka/src/PageMgr.cxx
@@ -34,7 +34,9 @@ namespace Kernel
/// @param VirtAddr
Void PageMgr::FlushTLB()
{
+#ifndef __ZKA_MINIMAL_OS__
hal_flush_tlb();
+#endif // !__ZKA_MINIMAL_OS__
}
/// @brief Reclaim freed page.
diff --git a/dev/zka/src/Stop.cxx b/dev/zka/src/Stop.cxx
index a02ea099..9c25f374 100644
--- a/dev/zka/src/Stop.cxx
+++ b/dev/zka/src/Stop.cxx
@@ -11,7 +11,6 @@
#include <KernelKit/DebugOutput.hxx>
#include <NewKit/String.hxx>
#include <FirmwareKit/Handover.hxx>
-#include <modules/ACPI/ACPIFactoryInterface.hxx>
#include <KernelKit/FileMgr.hxx>
#include <modules/FB/FB.hxx>
#include <modules/FB/Text.hxx>
@@ -27,17 +26,17 @@ namespace Kernel
{
CGInit();
- auto panicTxt = RGB(0xff, 0xff, 0xff);
+ auto panic_text = RGB(0xff, 0xff, 0xff);
auto start_y = 10;
auto x = 10;
- CGDrawString("minoskrnl.exe stopped working properly so it had to stop.", start_y, x, panicTxt);
+ CGDrawString("minoskrnl.exe stopped working properly so it had to stop.", start_y, x, panic_text);
start_y += 10;
// simply offset from previous string and then write the website.
- CGDrawString("Please visit: ", start_y, x, panicTxt);
- CGDrawString(cWebsiteMacro, start_y, x + (FONT_SIZE_X * rt_string_len("Please visit: ")), panicTxt);
+ CGDrawString("Please visit: ", start_y, x, panic_text);
+ CGDrawString(cWebsiteMacro, start_y, x + (FONT_SIZE_X * rt_string_len("Please visit: ")), panic_text);
CGFini();
@@ -48,91 +47,77 @@ namespace Kernel
switch (id)
{
case RUNTIME_CHECK_PROCESS: {
- CGDrawString("0x00000008 Scheduler error.", start_y, x, panicTxt);
- RecoveryFactory::Recover();
+ CGDrawString("0x00000008 Scheduler error.", start_y, x, panic_text);
+
break;
}
case RUNTIME_CHECK_ACPI: {
- CGDrawString("0x00000006 ACPI configuration error.", start_y, x, panicTxt);
- RecoveryFactory::Recover();
+ CGDrawString("0x00000006 ACPI configuration error.", start_y, x, panic_text);
+
break;
}
case RUNTIME_CHECK_PAGE: {
- CGDrawString("0x0000000B Write/Read in non paged area.", start_y, x, panicTxt);
- RecoveryFactory::Recover();
+ CGDrawString("0x0000000B Write/Read in non paged area.", start_y, x, panic_text);
+
}
case RUNTIME_CHECK_FILESYSTEM: {
- CGDrawString("0x0000000A Filesystem error.", start_y, x, panicTxt);
-
- PowerFactoryInterface power(nullptr);
- power.Shutdown();
+ CGDrawString("0x0000000A Filesystem error.", start_y, x, panic_text);
break;
}
case RUNTIME_CHECK_POINTER: {
- CGDrawString("0x00000000 Heap is corrupted.", start_y, x, panicTxt);
-
- PowerFactoryInterface power(nullptr);
- power.Shutdown();
+ CGDrawString("0x00000000 Heap is corrupted.", start_y, x, panic_text);
break;
}
case RUNTIME_CHECK_BAD_BEHAVIOR: {
- CGDrawString("0x00000009 Bad behavior error.", start_y, x, panicTxt);
-
- PowerFactoryInterface power(nullptr);
- power.Shutdown();
+ CGDrawString("0x00000009 Bad Behavior.", start_y, x, panic_text);
break;
}
case RUNTIME_CHECK_BOOTSTRAP: {
- CGDrawString("0x0000000A OS finished executing.", start_y, x, panicTxt);
-
- PowerFactoryInterface power(nullptr);
- power.Shutdown();
- break;
+ CGDrawString("0x0000000A Boot code has finished executing, waiting for scheduler and other cores.", start_y, x, panic_text);
+ return;
}
case RUNTIME_CHECK_HANDSHAKE: {
- CGDrawString("0x00000005 Handshake fault.", start_y, x, panicTxt);
- RecoveryFactory::Recover();
+ CGDrawString("0x00000005 Handshake fault.", start_y, x, panic_text);
+
break;
}
case RUNTIME_CHECK_IPC: {
- CGDrawString("0x00000003 Bad IPC/XPCOM message.", start_y, x, panicTxt);
- RecoveryFactory::Recover();
+ CGDrawString("0x00000003 Bad IPC/XPCOM message.", start_y, x, panic_text);
+
break;
}
case RUNTIME_CHECK_INVALID_PRIVILEGE: {
- CGDrawString("0x00000007 Privilege access violation.", start_y, x, panicTxt);
- RecoveryFactory::Recover();
+ CGDrawString("0x00000007 Privilege access violation.", start_y, x, panic_text);
+
break;
case RUNTIME_CHECK_UNEXCPECTED: {
- CGDrawString("0x0000000B Kernel access violation.", start_y, x, panicTxt);
+ CGDrawString("0x0000000B Unexpected violation.", start_y, x, panic_text);
break;
}
case RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM: {
- CGDrawString("0x10000001 Out of virtual memory.", start_y, x, panicTxt);
- RecoveryFactory::Recover();
+ CGDrawString("0x10000001 Out of virtual memory.", start_y, x, panic_text);
+
break;
}
case RUNTIME_CHECK_FAILED: {
- CGDrawString("0x10000001 Kernel Bug check appears to have failed, a dump has been written to the storage.", start_y, x, panicTxt);
- RecoveryFactory::Recover();
+ CGDrawString("0x10000001 Kernel Bug check appears to have failed, a dump has been written to the storage.", start_y, x, panic_text);
+
break;
}
default: {
- RecoveryFactory::Recover();
- CGDrawString("0xFFFFFFFC Unknown Kernel Error.", start_y, x, panicTxt);
+
+ CGDrawString("0xFFFFFFFC Unknown Kernel Error.", start_y, x, panic_text);
break;
}
}
};
- PowerFactoryInterface power(nullptr);
- power.Reboot();
+ RecoveryFactory::Recover();
}
Void RecoveryFactory::Recover() noexcept
{
- PowerFactoryInterface power(nullptr);
- power.Reboot();
+ HAL::rt_halt();
}
void ke_runtime_check(bool expr, const Char* file, const Char* line)
diff --git a/dev/zka/src/String.cxx b/dev/zka/src/String.cxx
index bb0f80e3..520e42f3 100644
--- a/dev/zka/src/String.cxx
+++ b/dev/zka/src/String.cxx
@@ -86,52 +86,10 @@ namespace Kernel
if (!data || *data == 0)
return {};
- StringView view(rt_string_len(data));
+ StringView* view = new StringView(rt_string_len(data));
+ (*view) += data;
- view += data;
-
- return ErrorOr<StringView>(view);
- }
-
- const Char* StringBuilder::FromInt(const Char* fmt, int i)
- {
- if (!fmt)
- return ("-1");
-
- char* ret = (char*)ALLOCA(sizeof(char) * 8 + rt_string_len(fmt));
-
- if (!ret)
- return ("-1");
-
- Char result[8];
-
- if (!rt_to_string(result, sizeof(int), i))
- {
- return ("-1");
- }
-
- const auto fmt_len = rt_string_len(fmt);
- const auto res_len = rt_string_len(result);
-
- for (Size idx = 0; idx < fmt_len; ++idx)
- {
- if (fmt[idx] == '%')
- {
- SizeT result_cnt = idx;
-
- for (auto y_idx = idx; y_idx < res_len; ++y_idx)
- {
- ret[result_cnt] = result[y_idx];
- ++result_cnt;
- }
-
- break;
- }
-
- ret[idx] = fmt[idx];
- }
-
- return ret; /* Copy that ret into a buffer, 'ALLOCA' allocates to the stack */
+ return ErrorOr<StringView>(*view);
}
const Char* StringBuilder::FromBool(const Char* fmt, bool i)
diff --git a/dev/zka/src/URL.cxx b/dev/zka/src/URL.cxx
deleted file mode 100644
index 9748ba32..00000000
--- a/dev/zka/src/URL.cxx
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -------------------------------------------
-
- Copyright ZKA Technologies.
-
-------------------------------------------- */
-
-#include <CFKit/URL.hxx>
-#include <KernelKit/DebugOutput.hxx>
-#include <NewKit/Utils.hxx>
-
-/// BUGS: 0
-
-namespace Kernel
-{
- URL::URL(StringView& strUrl)
- : fUrlView(strUrl, false)
- {
- }
-
- URL::~URL() = default;
-
- /// @brief internal and reserved protocols by Kernel.
- constexpr const Char* kURLProtocols[] = {
- "file", // Filesystem protocol
- "zup", // ZKA update protocol
- "oscc", // Open System Configuration Connectivity.
- "odbc", // ODBC connectivity.
- "https", // HTTPS layer driver (HTTPS.sys).
- };
-
- constexpr const int kUrlOutSz = 1; //! such as: ://
- constexpr const int kProtosCount = 5; //! Number of protocols registered as of right now.
- constexpr const int kRangeSz = 4096;
-
- ErrorOr<StringView> url_extract_location(const Char* url)
- {
- if (!url || *url == 0 || rt_string_len(url, kRangeSz) > kRangeSz)
- return ErrorOr<StringView>{-1};
-
- StringView view(rt_string_len(url));
-
- SizeT i = 0;
- bool scheme_found = false;
-
- for (; i < rt_string_len(url); ++i)
- {
- if (!scheme_found)
- {
- for (int y = 0; kProtosCount; ++y)
- {
- if (rt_string_in_string(view.CData(), kURLProtocols[y]))
- {
- i += rt_string_len(kURLProtocols[y]) + kUrlOutSz;
- scheme_found = true;
-
- break;
- }
- }
- }
-
- view.Data()[i] = url[i];
- }
-
- return ErrorOr<StringView>(view);
- }
-
- ErrorOr<StringView> url_extract_protocol(const Char* url)
- {
- if (!url || *url == 0 || rt_string_len(url, kRangeSz) > kRangeSz)
- return ErrorOr<StringView>{-1};
-
- ErrorOr<StringView> view{-1};
-
- return view;
- }
-
- Ref<ErrorOr<StringView>> URL::Location() noexcept
- {
- const Char* src = fUrlView.Leak().CData();
- auto loc = url_extract_location(src);
-
- if (!loc)
- return {};
-
- return Ref<ErrorOr<StringView>>(loc);
- }
-
- Ref<ErrorOr<StringView>> URL::Protocol() noexcept
- {
- const Char* src = fUrlView.Leak().CData();
- auto loc = url_extract_protocol(src);
-
- if (!loc)
- return {};
-
- return Ref<ErrorOr<StringView>>(loc);
- }
-} // namespace Kernel
diff --git a/dev/zka/src/UserProcessScheduler.cxx b/dev/zka/src/UserProcessScheduler.cxx
index 0819e638..b5a2a998 100644
--- a/dev/zka/src/UserProcessScheduler.cxx
+++ b/dev/zka/src/UserProcessScheduler.cxx
@@ -242,12 +242,16 @@ namespace Kernel
{
if (memory_list->MemoryEntry)
{
+#ifdef __ZKA_AMD64__
auto pd = hal_read_cr3();
hal_write_cr3(reinterpret_cast<VoidPtr>(this->MemoryPD));
+#endif
MUST_PASS(mm_delete_heap(memory_list->MemoryEntry));
+#ifdef __ZKA_AMD64__
hal_write_cr3(pd);
+#endif
}
auto next = memory_list->MemoryNext;
@@ -271,7 +275,7 @@ namespace Kernel
this->Image = nullptr;
this->StackFrame = nullptr;
- if (this->Kind == eExecutableDLLKind)
+ if (this->Kind == kExectuableDLLKind)
{
Bool success = false;
rtl_fini_dll(this, this->PefDLLDelegate, &success);
@@ -317,14 +321,14 @@ namespace Kernel
}
// Create heap according to type of process.
- if (process.Kind == UserProcess::eExecutableDLLKind)
+ if (process.Kind == UserProcess::kExectuableDLLKind)
{
process.PefDLLDelegate = rtl_init_dll(&process);
}
if (!process.Image)
{
- if (process.Kind != UserProcess::eExecutableDLLKind)
+ if (process.Kind != UserProcess::kExectuableDLLKind)
{
process.Crash();
return -kErrorProcessFault;
@@ -378,12 +382,27 @@ namespace Kernel
{
// check if process is within range.
if (process_id > mTeam.AsArray().Count())
- return false;
+ return No;
mTeam.AsArray()[process_id].Status = ProcessStatusKind::kDead;
--mTeam.mProcessAmount;
- return true;
+ return Yes;
+ }
+
+ const Bool UserProcessScheduler::IsUser()
+ {
+ return Yes;
+ }
+
+ const Bool UserProcessScheduler::IsKernel()
+ {
+ return No;
+ }
+
+ const Bool UserProcessScheduler::HasMP()
+ {
+ return kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled;
}
/***********************************************************************************/
@@ -466,7 +485,7 @@ namespace Kernel
return No;
if (!process.Image &&
- process.Kind == UserProcess::eExecutableKind)
+ process.Kind == UserProcess::kExectuableKind)
return No;
return Yes;
@@ -474,27 +493,32 @@ namespace Kernel
/***********************************************************************************/
/**
- * @brief Scheduler helper class.
+ * @brief Allocate a scheduler.
*/
/***********************************************************************************/
- EXTERN
- HardwareThreadScheduler* cHardwareThreadScheduler; //! @brief Ask linker for the hardware thread scheduler.
-
- SizeT UserProcessHelper::StartScheduling()
+ Bool UserProcessHelper::InitializeScheduling()
{
- if (!cHardwareThreadScheduler)
- {
- cHardwareThreadScheduler = mm_new_class<HardwareThreadScheduler>();
- MUST_PASS(cHardwareThreadScheduler);
- }
-
if (!cProcessScheduler)
{
cProcessScheduler = mm_new_class<UserProcessScheduler>();
- MUST_PASS(cProcessScheduler);
+ return cProcessScheduler;
}
+ return No;
+ }
+
+ /***********************************************************************************/
+ /**
+ * @brief Start the scheduler.
+ */
+ /***********************************************************************************/
+
+ SizeT UserProcessHelper::StartScheduling()
+ {
+ if (!cProcessScheduler)
+ return 0;
+
SizeT ret = cProcessScheduler->Run();
return ret;
}