diff options
| author | Amlal El Mahrouss <zka-holder@mahrouss-logic.com> | 2024-10-14 05:58:38 +0000 |
|---|---|---|
| committer | Amlal El Mahrouss <zka-holder@mahrouss-logic.com> | 2024-10-14 05:58:38 +0000 |
| commit | 7ad3739afdfaa2466723467f5ef2526f171c87c3 (patch) | |
| tree | 37775f4299281598b0f5121df4c188392daebd04 | |
| parent | 7477a0f942c374b652da4f80cdb36d4661aac3c8 (diff) | |
| parent | d9d82713326069478e6dd212763d1fac15e65370 (diff) | |
Merge branch 'port-stage1-hello-world' into 'unstable'
IMP: Basic ARM64 port.
See merge request mahrouss/zka-dev!20
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; } |
