diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-01-06 20:11:53 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-01-06 20:11:53 +0100 |
| commit | 98110adc9f47666696e18a6c7c97a3edc89c5d90 (patch) | |
| tree | e39f76352995abfdcc154637b2dae00ed246d5c7 /dev | |
| parent | 8c179d8801df7f5f77fe7ec65a0a98b7901dad09 (diff) | |
ADD: Fix kernel build and bootloader build on aarch64, add syschk for
aarch64.
WIP: aarch64 on CoreBoot (EFI is unpractical)
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
33 files changed, 541 insertions, 249 deletions
diff --git a/dev/Boot/BootKit/BootKit.h b/dev/Boot/BootKit/BootKit.h index 646cf72f..003d3d9e 100644 --- a/dev/Boot/BootKit/BootKit.h +++ b/dev/Boot/BootKit/BootKit.h @@ -389,7 +389,6 @@ namespace Boot fDiskDev.Write((Char*)&epm_boot, sizeof(BOOT_BLOCK_STRUCT)); - BTextWriter writer; writer.Write(L"BootZ: Drive has been formatted Successfully.\r"); #endif diff --git a/dev/Boot/BootKit/Support.h b/dev/Boot/BootKit/Support.h index 9d662219..37111df3 100644 --- a/dev/Boot/BootKit/Support.h +++ b/dev/Boot/BootKit/Support.h @@ -9,7 +9,9 @@ /// @file Support.h /// @brief Purpose of this file is to help port libs into the bootloader. +#ifndef __aarch64__ #include <string.h> +#endif #define kLongMax ((long)(~0UL >> 1)) #define kLongMin (~kLongMax) @@ -34,14 +36,18 @@ EXTERN_C size_t strlen(const char* whatToCheck); /// @brief strcmp definition in C++. EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight); +#else + +#include <string.h> + +#endif // __ZBAOSLDR__ + #define SetMem(dst, c, sz) memset(dst, c, sz) #define MoveMem(dst, src, sz) memcpy(dst, src, sz) #define CopyMem(dst, src, sz) memcpy(dst, src, sz) #define StrLen(src) strlen(src) #define StrCmp(dst, src) strcmp(dst, src) -#endif // __ZBAOSLDR__ - inline int IsSpace(int c) { return c == ' '; diff --git a/dev/Boot/Mod/SysChk/Boot.S b/dev/Boot/Mod/SysChk/Boot.S index 88904a96..ab0ddc52 100644 --- a/dev/Boot/Mod/SysChk/Boot.S +++ b/dev/Boot/Mod/SysChk/Boot.S @@ -7,8 +7,10 @@ ;; * ======================================================== ;; */ +#ifdef __ZKA_AMD64__ .code64 .intel_syntax noprefix +#endif #define kTypeDriver 101 #define kArchAmd64 122 diff --git a/dev/Boot/Mod/SysChk/Module.cc b/dev/Boot/Mod/SysChk/Module.cc index c5edb161..bd89982d 100644 --- a/dev/Boot/Mod/SysChk/Module.cc +++ b/dev/Boot/Mod/SysChk/Module.cc @@ -23,10 +23,14 @@ EXTERN_C Int32 ModuleMain(Kernel::HEL::BootInfoHeader* handover) { +#ifdef __ZKA_AMD64__ Boot::BDiskFormatFactory<BootDeviceATA> partition_factory; if (partition_factory.IsPartitionValid()) return kEfiOk; return kEfiFail; +#else + return kEfiOk; +#endif } diff --git a/dev/Boot/Mod/SysChk/build.json b/dev/Boot/Mod/SysChk/amd64.json index 2c079889..2c079889 100644 --- a/dev/Boot/Mod/SysChk/build.json +++ b/dev/Boot/Mod/SysChk/amd64.json diff --git a/dev/Boot/Mod/SysChk/arm64.json b/dev/Boot/Mod/SysChk/arm64.json new file mode 100644 index 00000000..46cfb081 --- /dev/null +++ b/dev/Boot/Mod/SysChk/arm64.json @@ -0,0 +1,26 @@ +{ + "compiler_path": "clang++", + "compiler_std": "c++20", + "headers_path": ["../", "../../", "../../../Kernel", "../../../", "./"], + "sources_path": ["*.cc", "*.S", "../../src/HEL/ARM64/*.cc", "../../src/HEL/ARM64/*.S", "../../src/*.cc"], + "output_name": "syschk.sys", + "compiler_flags": [ + "-ffreestanding", + "-nostdlib", + "-std=c++20", + "-fno-rtti", + "-fno-exceptions", + "-fuse-ld=lld", + "-Wl,-subsystem:efi_application,-entry:ModuleMain", + "-target aarch64-unknown-windows" + ], + "cpp_macros": [ + "__MINOSKRNL__", + "__ZBAOSLDR__", + "__BOOTLDR_STANDALONE__", + "__ZKA_ARM64__", + "kChkVersionHighest=0x0100", + "kChkVersionLowest=0x0100", + "kChkVersion=0x0100" + ] +} diff --git a/dev/Boot/amd64-desktop.make b/dev/Boot/amd64-desktop.make index 36cba61a..e6002760 100644 --- a/dev/Boot/amd64-desktop.make +++ b/dev/Boot/amd64-desktop.make @@ -94,8 +94,8 @@ run-efi-amd64-ata: epm-img: qemu-img create -f raw $(IMG) 4G -.PHONY: download-edk -download-edk: +.PHONY: efi +efi: $(HTTP_GET) https://retrage.github.io/edk2-nightly/bin/DEBUGX64_OVMF.fd -O OVMF.fd BINS=*.bin diff --git a/dev/Boot/arm64-desktop.make b/dev/Boot/arm64-desktop.make index 0594a1cf..04ec4ab4 100644 --- a/dev/Boot/arm64-desktop.make +++ b/dev/Boot/arm64-desktop.make @@ -27,13 +27,12 @@ IMG=epm-master-1.img IMG_2=epm-slave.img IMG_3=epm-master-2.img -EMU_FLAGS=-net none -smp 4 -m 8G -cpu max -M virt-9.1 \ +EMU_FLAGS=-net none -smp 4 -m 8G -cpu max -M virt \ -bios $(BIOS) \ -drive id=disk,file=$(IMG),format=raw,if=none \ -drive \ - file=fat:rw:src/Root/,index=1,format=raw \ - -device virtio-tablet-pci \ - -d int -no-shutdown -no-reboot -device virtio-gpu-pci,xres=844,yres=390 -serial stdio + file=fat:rw:src/Root/,index=2,format=raw \ + -no-shutdown -no-reboot -cpu cortex-a72 -device virtio-gpu-pci LD_FLAGS=-subsystem:efi_application -entry:Main /nodefaultlib @@ -46,11 +45,11 @@ REM_FLAG=-f FLAG_ASM=-f win64 FLAG_GNU=-fshort-wchar -c -ffreestanding -MMD -mno-red-zone -D__ZKA_ARM64__ -fno-rtti -fno-exceptions -I./ \ -target aarch64-unknown-windows \ - -std=c++20 -DBOOTZ_EPM_SUPPORT -D__FSKIT_USE_NEFS__ -D__BOOTLDR_STANDALONE__ -D__MINOSKRNL__ -D__ZBAOSLDR__ -D__HAVE_ZKA_APIS__ -D__ZKA__ -I../ -I../Kernel + -std=c++20 -DBOOTZ_EPM_SUPPORT -DZBA_USE_FB -D__FSKIT_USE_NEFS__ -D__BOOTLDR_STANDALONE__ -D__MINOSKRNL__ -D__ZBAOSLDR__ -D__HAVE_ZKA_APIS__ -D__ZKA__ -I../ -I../Kernel BOOT_LOADER=zbaosldr.exe KERNEL=minoskrnl.exe -SYS_CHK=syschk.sys +SYSCHK=syschk.sys STARTUP=startup.sys .PHONY: invalid-recipe @@ -58,28 +57,29 @@ invalid-recipe: @echo "invalid-recipe: Use make compile-<arch> instead." .PHONY: all -all: compile-amd64 +all: compile mkdir -p src/Root/EFI/BOOT $(LD_GNU) $(OBJ) $(LD_FLAGS) /out:src/$(BOOT_LOADER) $(COPY) src/$(BOOT_LOADER) src/Root/EFI/BOOT/BOOTAA64.EFI $(COPY) src/$(BOOT_LOADER) src/Root/EFI/BOOT/BootZ.EFI $(COPY) ../Kernel/$(KERNEL) src/Root/$(KERNEL) + $(COPY) ./Mod/SysChk/$(SYSCHK) src/Root/$(SYSCHK) $(COPY) src/$(BOOT_LOADER) src/Root/$(BOOT_LOADER) ifneq ($(DEBUG_SUPPORT), ) DEBUG = -D__DEBUG__ endif -.PHONY: compile-amd64 -compile-amd64: +.PHONY: compile +compile: $(RESCMD) $(CC_GNU) $(ZKA_MODEL) $(STANDALONE_MACRO) $(FLAG_GNU) $(DEBUG) \ $(wildcard src/HEL/ARM64/*.cc) \ $(wildcard src/HEL/ARM64/*.S) \ $(wildcard src/*.cc) -.PHONY: run-efi-amd64 -run-efi-amd64: +.PHONY: run +run: $(EMU) $(EMU_FLAGS) # img_2 is the rescue disk. img is the bootable disk, as provided by the Zeta. @@ -89,8 +89,8 @@ epm-img: qemu-img create -f raw $(IMG_2) 4G qemu-img create -f raw $(IMG_3) 4G -.PHONY: download-edk -download-edk: +.PHONY: efi +efi: $(HTTP_GET) https://retrage.github.io/edk2-nightly/bin/DEBUGAARCH64_QEMU_EFI.fd -O OVMF.fd BINS=*.bin @@ -109,4 +109,4 @@ help: @echo "gpt-img: Format a disk using the Explicit Partition Map." @echo "clean: clean bootloader." @echo "bootloader-amd64: Build bootloader. (PC AMD64)" - @echo "run-efi-amd64: Run bootloader. (PC AMD64)" + @echo "run: Run bootloader. (PC AMD64)" diff --git a/dev/Boot/arm64-mobile.make b/dev/Boot/arm64-mobile.make index e001dcee..e3a86e64 100644 --- a/dev/Boot/arm64-mobile.make +++ b/dev/Boot/arm64-mobile.make @@ -33,7 +33,7 @@ EMU_FLAGS=-net none -smp 4 -m 8G -cpu max -M virt-9.1 \ -drive \ file=fat:rw:src/Root/,index=1,format=raw \ -device virtio-tablet-pci \ - -d int -no-shutdown -no-reboot -device virtio-gpu-pci,xres=844,yres=390 -serial stdio + -no-shutdown -no-reboot -cpu cortex-a72 -device virtio-gpu-pci LD_FLAGS=-subsystem:efi_application -entry:Main /nodefaultlib @@ -50,7 +50,7 @@ FLAG_GNU=-fshort-wchar -c -ffreestanding -MMD -mno-red-zone -D__ZKA_ARM64__ -fno BOOT_LOADER=zbaosldr.exe KERNEL=minoskrnl.exe -SYS_CHK=syschk.sys +SYSCHK=syschk.sys STARTUP=startup.sys .PHONY: invalid-recipe @@ -58,28 +58,29 @@ invalid-recipe: @echo "invalid-recipe: Use make compile-<arch> instead." .PHONY: all -all: compile-amd64 +all: compile mkdir -p src/Root/EFI/BOOT $(LD_GNU) $(OBJ) $(LD_FLAGS) /out:src/$(BOOT_LOADER) $(COPY) src/$(BOOT_LOADER) src/Root/EFI/BOOT/BOOTAA64.EFI $(COPY) src/$(BOOT_LOADER) src/Root/EFI/BOOT/BootZ.EFI $(COPY) ../Kernel/$(KERNEL) src/Root/$(KERNEL) + $(COPY) ./Mod/SysChk/$(SYSCHK) src/Root/$(SYSCHK) $(COPY) src/$(BOOT_LOADER) src/Root/$(BOOT_LOADER) ifneq ($(DEBUG_SUPPORT), ) DEBUG = -D__DEBUG__ endif -.PHONY: compile-amd64 -compile-amd64: +.PHONY: compile +compile: $(RESCMD) $(CC_GNU) $(ZKA_MODEL) $(STANDALONE_MACRO) $(FLAG_GNU) $(DEBUG) \ $(wildcard src/HEL/ARM64/*.cc) \ $(wildcard src/HEL/ARM64/*.S) \ $(wildcard src/*.cc) -.PHONY: run-efi-amd64 -run-efi-amd64: +.PHONY: run +run: $(EMU) $(EMU_FLAGS) # img_2 is the rescue disk. img is the bootable disk, as provided by the Zeta. @@ -89,8 +90,8 @@ epm-img: qemu-img create -f raw $(IMG_2) 4G qemu-img create -f raw $(IMG_3) 4G -.PHONY: download-edk -download-edk: +.PHONY: efi +efi: $(HTTP_GET) https://retrage.github.io/edk2-nightly/bin/DEBUGAARCH64_QEMU_EFI.fd -O OVMF.fd BINS=*.bin diff --git a/dev/Boot/src/BootFileReader.cc b/dev/Boot/src/BootFileReader.cc index eb5f80a2..e8f8772c 100644 --- a/dev/Boot/src/BootFileReader.cc +++ b/dev/Boot/src/BootFileReader.cc @@ -128,23 +128,26 @@ Boot::BFileReader::~BFileReader() */ Void Boot::BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead, UIntPtr out_address) { - if (mBlob == nullptr) - { - EfiFileInfo newPtrInfo{}; - UInt32 szInfo = 0U; + UInt32 szInfo = sizeof(EfiFileInfo); - EfiGUID kFileInfoGUID = EFI_FILE_INFO_GUID; + EfiFileInfo newPtrInfo{}; - if (mFile->GetInfo(mFile, &kFileInfoGUID, &szInfo, &newPtrInfo) == kEfiOk) - { - if (newPtrInfo.FileSize < readUntil) - readUntil = newPtrInfo.FileSize; - else if (readUntil < 1) - readUntil = newPtrInfo.FileSize; + EfiGUID kFileInfoGUID = EFI_FILE_INFO_GUID; - mWriter.Write(L"BootZ: File size: ").Write(readUntil).Write("\r"); - } + if (mFile->GetInfo(mFile, &kFileInfoGUID, &szInfo, &newPtrInfo) == kEfiOk) + { + readUntil = newPtrInfo.FileSize; + mWriter.Write(L"BootZ: File size: ").Write(readUntil).Write("\r"); + } + if (readUntil == 0) + { + mErrorCode = kNotSupported; + return; + } + + if (mBlob == nullptr) + { if (!out_address) { if (auto err = BS->AllocatePool(EfiLoaderCode, readUntil, (VoidPtr*)&mBlob) != @@ -160,7 +163,7 @@ Void Boot::BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead, UIntPtr out_ } } - mErrorCode = kNotSupported; + mWriter.Write(L"*** Bytes to read: ").Write(readUntil).Write(L" ***\r"); UInt64 bufSize = chunkToRead; UInt64 szCnt = 0UL; diff --git a/dev/Boot/src/BootThread.cc b/dev/Boot/src/BootThread.cc index 61f3e805..15773b9b 100644 --- a/dev/Boot/src/BootThread.cc +++ b/dev/Boot/src/BootThread.cc @@ -55,7 +55,7 @@ namespace Boot return; } #elif defined(__ZKA_ARM64__) - if (header_ptr->mMachine != kPeMachineAMD64 || + if (header_ptr->mMachine != kPeMachineARM64 || header_ptr->mSignature != kPeSignature) { writer.Write("BootZ: Not a PE32+ executable.\r"); diff --git a/dev/Boot/src/HEL/AMD64/EFIBootStartup.cc b/dev/Boot/src/HEL/AMD64/EFIBootStartup.cc index ff705652..000e5b40 100644 --- a/dev/Boot/src/HEL/AMD64/EFIBootStartup.cc +++ b/dev/Boot/src/HEL/AMD64/EFIBootStartup.cc @@ -72,9 +72,6 @@ STATIC Bool boot_init_fb() noexcept return No; } -EXTERN_C VoidPtr boot_read_cr3(); -EXTERN_C Void boot_write_cr3(VoidPtr new_cr3); - EXTERN EfiBootServices* BS; /// @brief Main EFI entrypoint. @@ -152,9 +149,15 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, UInt32 cnt_enabled = 0; UInt32 cnt_disabled = 0; - mp->GetNumberOfProcessors(mp, &cnt_disabled, &cnt_enabled); - - handover_hdr->f_HardwareTables.f_MultiProcessingEnabled = cnt_enabled > 1; + if (mp) + { + mp->GetNumberOfProcessors(mp, &cnt_disabled, &cnt_enabled); + handover_hdr->f_HardwareTables.f_MultiProcessingEnabled = cnt_enabled > 1; + } + else + { + handover_hdr->f_HardwareTables.f_MultiProcessingEnabled = NO; + } // Fill handover header now. // ---------------------------------------------------- // @@ -316,7 +319,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, // Finally load the OS kernel. // ---------------------------------------------------- // - kernel_thread->Start(handover_hdr, YES); + kernel_thread->Start(handover_hdr, NO); CANT_REACH(); } diff --git a/dev/Boot/src/HEL/ARM64/CoreBootStartup.S b/dev/Boot/src/HEL/ARM64/CoreBootStartup.S index ee2dd3ec..000ade0f 100644 --- a/dev/Boot/src/HEL/ARM64/CoreBootStartup.S +++ b/dev/Boot/src/HEL/ARM64/CoreBootStartup.S @@ -4,6 +4,8 @@ ------------------------------------------- */ +#ifdef __ZKA_COREBOOT__ + .section .boot_hdr .align 4 @@ -33,4 +35,6 @@ bootloader_start: mov sp, x0 bl bootloader_main - ret
\ No newline at end of file + ret + +#endif // __ZKA_COREBOOT__
\ No newline at end of file diff --git a/dev/Boot/src/HEL/ARM64/EFIBootStartup.cc b/dev/Boot/src/HEL/ARM64/EFIBootStartup.cc index 279d1e40..bf940074 100644 --- a/dev/Boot/src/HEL/ARM64/EFIBootStartup.cc +++ b/dev/Boot/src/HEL/ARM64/EFIBootStartup.cc @@ -4,43 +4,56 @@ ------------------------------------------- */ -#include <FirmwareKit/EFI/API.h> +#include <BootKit/BootKit.h> +#include <Mod/GfxMgr/FBMgr.h> +#include <Mod/GfxMgr/TextMgr.h> #include <FirmwareKit/EFI.h> +#include <FirmwareKit/EFI/API.h> +#include <FirmwareKit/Handover.h> +#include <KernelKit/MSDOS.h> +#include <KernelKit/PE.h> +#include <KernelKit/PEF.h> +#include <NewKit/Macros.h> +#include <NewKit/Ref.h> #include <BootKit/BootThread.h> -#include <BootKit/BootKit.h> +#include <Mod/GfxMgr/FBMgr.h> + +// Makes the compiler shut up. +#ifndef kMachineModel +#define kMachineModel "ZkaOS" +#endif // !kMachineModel #ifndef kExpectedWidth -#define kExpectedWidth (1280) +#define kExpectedWidth (1920) #endif #ifndef kExpectedHeight -#define kExpectedHeight (720) +#define kExpectedHeight (1080) #endif -EXTERN EfiBootServices* BS; +/** Graphics related. */ 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) -{ - InitEFI(SystemTable); +EXTERN_C Void rt_reset_hardware(); + +EXTERN EfiBootServices* BS; +/** + @brief Finds and stores the GOP object. +*/ +STATIC Bool boot_init_fb() noexcept +{ kGopGuid = EfiGUID(EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID); kGop = nullptr; - BS->LocateProtocol(&kGopGuid, nullptr, (VoidPtr*)&kGop); + if (BS->LocateProtocol(&kGopGuid, nullptr, (VoidPtr*)&kGop) != kEfiOk) + return No; kGopStride = 4; - Boot::BTextWriter writer; - for (SizeT i = 0; i < kGop->Mode->MaxMode; ++i) { EfiGraphicsOutputProtocolModeInformation* infoPtr = nullptr; @@ -48,28 +61,159 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, kGop->QueryMode(kGop, i, &sz, &infoPtr); - writer.Write(infoPtr->HorizontalResolution); - writer.Write(infoPtr->VerticalResolution); - writer.Write("\r"); - if (infoPtr->HorizontalResolution == kExpectedWidth && infoPtr->VerticalResolution == kExpectedHeight) { kGop->SetMode(kGop, i); + return Yes; + } + } + + return No; +} + +EXTERN EfiBootServices* BS; + +/// @brief Main EFI entrypoint. +/// @param image_handle Handle of this image. +/// @param sys_table The system table of it. +/// @return nothing, never returns. +EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle, + EfiSystemTable* sys_table) +{ + InitEFI(sys_table); ///! Init the EFI library. + + HEL::BootInfoHeader* handover_hdr = + new HEL::BootInfoHeader(); + + UInt32 map_key = 0; + UInt32 size_struct_ptr = sizeof(EfiMemoryDescriptor); + EfiMemoryDescriptor* struct_ptr = nullptr; + UInt32 sz_desc = sizeof(EfiMemoryDescriptor); + UInt32 rev_desc = 0; + +#ifdef ZBA_USE_FB + if (!boot_init_fb()) + return 1; ///! Init the GOP. + + for (SizeT index_vt = 0; index_vt < sys_table->NumberOfTableEntries; + ++index_vt) + { + Char* vendor_table = reinterpret_cast<Char*>( + sys_table->ConfigurationTable[index_vt].VendorTable); + + // ACPI's 'RSD PTR', which contains the ACPI SDT (MADT, FACP...) + if (vendor_table[0] == 'R' && vendor_table[1] == 'S' && + vendor_table[2] == 'D' && vendor_table[3] == ' ' && + vendor_table[4] == 'P' && vendor_table[5] == 'T' && + vendor_table[6] == 'R' && vendor_table[7] == ' ') + { + handover_hdr->f_HardwareTables.f_VendorPtr = (VoidPtr)vendor_table; break; } } - Boot::BFileReader reader_kernel(L"minoskrnl.exe", ImageHandle); + // ------------------------------------------ // + // draw background color. + // ------------------------------------------ // + + handover_hdr->f_GOP.f_The = kGop->Mode->FrameBufferBase; + handover_hdr->f_GOP.f_Width = kGop->Mode->Info->VerticalResolution; + handover_hdr->f_GOP.f_Height = kGop->Mode->Info->HorizontalResolution; + handover_hdr->f_GOP.f_PixelPerLine = kGop->Mode->Info->PixelsPerScanLine; + handover_hdr->f_GOP.f_PixelFormat = kGop->Mode->Info->PixelFormat; + handover_hdr->f_GOP.f_Size = kGop->Mode->FrameBufferSize; +#endif // ZBA_USE_FB + + // ------------------------------------------- // + // Grab MP services, extended to runtime. // + // ------------------------------------------- // + + EfiGUID guid_mp = EfiGUID(EFI_MP_SERVICES_PROTOCOL_GUID); + EfiMpServicesProtocol* mp = nullptr; + + BS->LocateProtocol(&guid_mp, nullptr, reinterpret_cast<VoidPtr*>(&mp)); + + handover_hdr->f_HardwareTables.f_MpPtr = reinterpret_cast<VoidPtr>(mp); + + kHandoverHeader = handover_hdr; + + fb_init(); + + UI::fb_clear_video(); + + FBDrawBitMapInRegion(zka_disk, ZKA_DISK_WIDTH, ZKA_DISK_HEIGHT, (kHandoverHeader->f_GOP.f_Width - ZKA_DISK_WIDTH) / 2, (kHandoverHeader->f_GOP.f_Height - ZKA_DISK_HEIGHT) / 2); + + fb_clear(); + + UInt32 cnt_enabled = 0; + UInt32 cnt_disabled = 0; + + if (mp) + { + mp->GetNumberOfProcessors(mp, &cnt_disabled, &cnt_enabled); + handover_hdr->f_HardwareTables.f_MultiProcessingEnabled = cnt_enabled > 1; + } + else + { + handover_hdr->f_HardwareTables.f_MultiProcessingEnabled = NO; + } + + //-------------------------------------------------------------// + // Update handover file specific table and phyiscal start field. + //-------------------------------------------------------------// + + handover_hdr->f_BitMapStart = nullptr; /* Start of bitmap. */ + handover_hdr->f_BitMapSize = kHandoverBitMapSz; /* Size of bitmap. */ + + while (BS->AllocatePool(EfiLoaderData, handover_hdr->f_BitMapSize, &handover_hdr->f_BitMapStart) != kEfiOk) + { + if (handover_hdr->f_BitMapStart) + { + BS->FreePool(handover_hdr->f_BitMapStart); + handover_hdr->f_BitMapStart = nullptr; + } + } + + // ------------------------------------------ // + // null these fields, to avoid being reused later. + // ------------------------------------------ // + + handover_hdr->f_FirmwareCustomTables[0] = nullptr; + handover_hdr->f_FirmwareCustomTables[1] = nullptr; + + handover_hdr->f_FirmwareVendorLen = Boot::BStrLen(sys_table->FirmwareVendor); + + handover_hdr->f_Magic = kHandoverMagic; + handover_hdr->f_Version = kHandoverVersion; + + // Provide fimware vendor name. + + Boot::BCopyMem(handover_hdr->f_FirmwareVendorName, sys_table->FirmwareVendor, + handover_hdr->f_FirmwareVendorLen); + + handover_hdr->f_FirmwareVendorLen = Boot::BStrLen(sys_table->FirmwareVendor); + + // Assign to global 'kHandoverHeader'. + + Boot::BFileReader reader_kernel(L"minoskrnl.exe", image_handle); reader_kernel.ReadAll(0); + // ------------------------------------------ // + // If we succeed in reading the blob, then execute it. + // ------------------------------------------ // + if (reader_kernel.Blob()) { auto kernel_thread = Boot::BootThread(reader_kernel.Blob()); + kernel_thread.SetName("BootZ: MicroKernel."); - if (kernel_thread.IsValid()) - kernel_thread.Start(nullptr, YES); + handover_hdr->f_KernelImage = reader_kernel.Blob(); + + EFI::ExitBootServices(map_key, image_handle); + + kernel_thread.Start(handover_hdr, NO); } CANT_REACH(); diff --git a/dev/Boot/src/Root/EFI/STARTUP.NSH b/dev/Boot/src/Root/EFI/STARTUP.NSH index d29ba8fd..2cf25f23 100644 --- a/dev/Boot/src/Root/EFI/STARTUP.NSH +++ b/dev/Boot/src/Root/EFI/STARTUP.NSH @@ -1,2 +1,2 @@ fs0: -BOOT\BOOTX64.EFI +BOOT\BOOTAA64.EFI diff --git a/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc b/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc index 5d314aa7..bd14253f 100644 --- a/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc +++ b/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -13,13 +13,11 @@ #include <KernelKit/Timer.h> #include <Mod/GfxMgr/TextMgr.h> #include <NewKit/KernelPanic.h> - -// Needed for SMP. #include <KernelKit/HardwareThreadScheduler.h> #define kApicSignature "APIC" -#define kApicBaseAddress (0xFEE00000) +#define kApicBaseAddress (0xFEE00000) #define kAPIC_ICR_Low 0x300 #define kAPIC_ICR_High 0x310 @@ -140,12 +138,12 @@ namespace Kernel::HAL Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector); } - STATIC struct PROCESS_CONTROL_BLOCK final + struct PROCESS_CONTROL_BLOCK final { HAL::StackFramePtr f_Frame; - UInt8* f_Stack; - VoidPtr f_Image; - } kProcessBlocks[kSchedProcessLimitPerTeam] = {0}; + }; + + STATIC PROCESS_CONTROL_BLOCK kProcessBlocks[kSchedProcessLimitPerTeam] = {0}; EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 pid) { @@ -160,37 +158,6 @@ namespace Kernel::HAL const auto process_index = pid % kSchedProcessLimitPerTeam; kProcessBlocks[process_index].f_Frame = stack_frame; - kProcessBlocks[process_index].f_Stack = stack_ptr; - kProcessBlocks[process_index].f_Image = image; - - if (!mp_is_smp()) - { - ke_panic(RUNTIME_CHECK_PROCESS, "The Kernel does not support non-SMP profiles as of now. We are unable to process this context switch."); - } - else - { - for (SizeT smpi = 0UL; smpi < kSMPMax; ++smpi) - { - if (!kAPICAddresses[smpi].mUsed) - { - kAPICAddresses[smpi].mUsed = YES; - - hal_send_start_ipi(kAPICLocales[smpi], ((UIntPtr)image) >> 12, kApicBaseAddress); - - for (SizeT i = 0; i < 1000000; ++i) - ; - - hal_send_sipi(kAPICLocales[smpi], ((UIntPtr)image) >> 12, kApicBaseAddress); - - for (SizeT i = 0; i < 1000000; ++i) - ; - - hal_send_sipi(kAPICLocales[smpi], ((UIntPtr)image) >> 12, kApicBaseAddress); - - kAPICAddresses[smpi].mUsed = NO; - } - } - } return YES; } diff --git a/dev/Kernel/HALKit/AMD64/HalKernelMain.cc b/dev/Kernel/HALKit/AMD64/HalKernelMain.cc index 16571373..7b3e2345 100644 --- a/dev/Kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/Kernel/HALKit/AMD64/HalKernelMain.cc @@ -93,27 +93,6 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { rtl_kernel_main(0, nullptr, nullptr, 0); - auto id = Kernel::rtl_create_process([] (const Kernel::SizeT argc, Kernel::Char** argv, Kernel::Char** envp, const Kernel::SizeT envp_len) -> void { - while (YES); - }, "SMP Process #1"); - - Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].PTime = 0; - Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].Status = Kernel::ProcessStatusKind::kRunning; - - id = Kernel::rtl_create_process([] (const Kernel::SizeT argc, Kernel::Char** argv, Kernel::Char** envp, const Kernel::SizeT envp_len) -> void { - while (YES); - }, "SMP Process #2"); - - Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].PTime = 0; - Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].Status = Kernel::ProcessStatusKind::kRunning; - - id = Kernel::rtl_create_process([] (const Kernel::SizeT argc, Kernel::Char** argv, Kernel::Char** envp, const Kernel::SizeT envp_len) -> void { - while (YES); - }, "SMP Process #3"); - - Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].PTime = 0; - Kernel::UserProcessScheduler::The().CurrentTeam().mProcessList[id].Status = Kernel::ProcessStatusKind::kRunning; - Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); Kernel::HAL::Register64 idt_reg; diff --git a/dev/Kernel/HALKit/AMD64/Processor.h b/dev/Kernel/HALKit/AMD64/Processor.h index 26256baf..def26fa9 100644 --- a/dev/Kernel/HALKit/AMD64/Processor.h +++ b/dev/Kernel/HALKit/AMD64/Processor.h @@ -177,10 +177,12 @@ namespace Kernel::HAL static Void Load(Register64& idt); static Void Load(Ref<Register64>& idt); }; + /***********************************************************************************/ /// @brief Is the current config SMP aware? /// @return True if YES, False if not. /***********************************************************************************/ + Bool mp_is_smp(Void) noexcept; /***********************************************************************************/ @@ -192,6 +194,9 @@ namespace Kernel::HAL /***********************************************************************************/ 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/Kernel/HALKit/ARM64/AP.h b/dev/Kernel/HALKit/ARM64/AP.h deleted file mode 100644 index 8cebfeca..00000000 --- a/dev/Kernel/HALKit/ARM64/AP.h +++ /dev/null @@ -1,36 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024, Theater Quality Corp, all rights reserved. - - File: AP.h - Purpose: RISC-V hardware threads. - - Revision History: - - 30/01/24: Added file (amlel) - -------------------------------------------- */ - -#pragma once - -#include <NewKit/Defines.h> - -namespace Kernel -{ - typedef Int64 hal_ap_kind; - - typedef struct HAL_HARDWARE_THREAD - { - Kernel::UIntPtr fStartAddress; - Kernel::UInt8 fPrivleged : 1; - Kernel::UInt32 fPageMemoryFlags; - hal_ap_kind fIdentNumber; - } HAL_HARDWARE_THREAD; - - /// @brief Set PC to specific hart. - /// @param hart the hart - /// @param epc the pc. - /// @return - EXTERN_C Kernel::Void hal_set_pc_to_hart(HAL_HARDWARE_THREAD* hart, Kernel::VoidPtr epc); - -} // namespace Kernel diff --git a/dev/Kernel/HALKit/ARM64/ApplicationProcessor.h b/dev/Kernel/HALKit/ARM64/ApplicationProcessor.h new file mode 100644 index 00000000..25d948d5 --- /dev/null +++ b/dev/Kernel/HALKit/ARM64/ApplicationProcessor.h @@ -0,0 +1,19 @@ +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Corp, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include <NewKit/Defines.h> +#include <HALKit/ARM64/Processor.h> + +/************************************************** */ +/* INITIALIZE THE GIC ON CPU. */ +/************************************************** */ + +namespace Kernel +{ + BOOL mp_initialize_gic(Kernel::Void); +}
\ No newline at end of file diff --git a/dev/Kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/Kernel/HALKit/ARM64/HalApplicationProcessor.cc index fa62cf20..91252455 100644 --- a/dev/Kernel/HALKit/ARM64/HalApplicationProcessor.cc +++ b/dev/Kernel/HALKit/ARM64/HalApplicationProcessor.cc @@ -6,35 +6,129 @@ #include <HALKit/ARM64/Processor.h>
#include <KernelKit/DebugOutput.h>
-#include <HALKit/ARM64/AP.h>
+#include <HALKit/ARM64/ApplicationProcessor.h>
+#include <KernelKit/UserProcessScheduler.h>
-using namespace Kernel;
+#define GICD_BASE 0x08000000 // Distributor base address
+#define GICC_BASE 0x08010000 // CPU interface base address
-namespace Kernel::Detail
+#define GICD_CTLR 0x000 // Distributor Control Register
+#define GICD_ISENABLER 0x100 // Interrupt Set-Enable Registers
+#define GICD_ICENABLER 0x180 // Interrupt Clear-Enable Registers
+#define GICD_ISPENDR 0x200 // Interrupt Set-Pending Registers
+#define GICD_ICPENDR 0x280 // Interrupt Clear-Pending Registers
+#define GICD_IPRIORITYR 0x400 // Interrupt Priority Registers
+#define GICD_ITARGETSR 0x800 // Interrupt Processor Targets Registers
+#define GICD_ICFGR 0xC00 // Interrupt Configuration Registers
+
+#define GICC_CTLR 0x000 // CPU Interface Control Register
+#define GICC_PMR 0x004 // Interrupt Priority Mask Register
+#define GICC_IAR 0x00C // Interrupt Acknowledge Register
+#define GICC_EOIR 0x010 // End of Interrupt Register
+
+// ================================================================= //
+
+namespace Kernel
{
- STATIC void mp_hang_fn(void)
+ struct PROCESS_CONTROL_BLOCK final
+ {
+ HAL::StackFramePtr f_Frame;
+ };
+
+ STATIC PROCESS_CONTROL_BLOCK kProcessBlocks[kSchedProcessLimitPerTeam] = {0};
+
+ namespace Detail
+ {
+ STATIC BOOL kGICEnabled = NO;
+
+ STATIC void mp_hang_fn(void)
+ {
+ while (YES)
+ ;
+ }
+
+ Void mp_setup_gic_el0(Void)
+ {
+ // enable distributor.
+ HAL::hal_mmio_write(GICD_BASE + GICD_CTLR, 0x1);
+
+ UInt32 gicc_ctlr = HAL::hal_mmio_read<UInt32>(GICC_BASE + GICC_CTLR);
+
+ gicc_ctlr |= 0x1; // Enable signaling of interrupts
+ gicc_ctlr |= (1 << 1); // Allow Group 1 interrupts in EL0
+
+ HAL::hal_mmio_write(GICC_BASE + GICC_CTLR, gicc_ctlr);
+
+ // Set priority mask (accept all priorities)
+ HAL::hal_mmio_write(GICC_BASE + GICC_PMR, 0xFF);
+
+ UInt32 icfgr = HAL::hal_mmio_read<UInt32>(GICD_BASE + GICD_ICFGR + (32 / 16) * 4);
+
+ icfgr |= (0x2 << ((32 % 16) * 2)); // Edge-triggered
+ HAL::hal_mmio_write(GICD_BASE + GICD_ICFGR + (32 / 16) * 4, icfgr);
+
+ // Target interrupt 32 to CPU 1
+ HAL::hal_mmio_write(GICD_BASE + GICD_ITARGETSR + (32 / 4) * 4, 0x2 << ((32 % 4) * 8));
+
+ // Set interrupt 32 priority to lowest (0xFF)
+ HAL::hal_mmio_write(GICD_BASE + GICD_IPRIORITYR + (32 / 4) * 4, 0xFF << ((32 % 4) * 8));
+
+ // Enable interrupt 32 for AP.
+ HAL::hal_mmio_write(GICD_BASE + GICD_ISENABLER + (32 / 32) * 4, 0x01 << (32 % 32));
+
+ kcout << "AP's GIC configured for interrupt 32." << endl;
+ }
+
+ BOOL mp_handle_gic_interrupt_el0(Void)
+ {
+ // Read the interrupt ID
+ UInt32 interrupt_id = HAL::hal_mmio_read<UInt32>(GICC_BASE + GICC_IAR);
+
+ // Check if it's a valid interrupt (not spurious)
+ if ((interrupt_id & 0x3FF) < 1020)
+ {
+ kcout << "Handling interrupt for AP: " << (interrupt_id & 0x3FF) << endl;
+
+ // TODO: Handle code here.
+
+ // End the interrupt
+
+ HAL::hal_mmio_write(GICC_BASE + GICC_EOIR, interrupt_id);
+
+ return YES;
+ }
+
+ // spurious interrupt
+ return NO;
+ }
+ } // namespace Detail
+
+ EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID pid)
{
- while (YES)
- ;
+ return kProcessBlocks[pid % kSchedProcessLimitPerTeam].f_Frame;
}
-} // namespace Kernel::Detail
-/// @brief wakes up thread from it's hang state.
-/// wakes up thread from hang.
-Void mp_wakeup_thread(HAL::StackFramePtr stack)
-{
- if (!stack)
- return;
+ EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame, ProcessID pid)
+ {
+ MUST_PASS(image && stack_ptr && stack_frame);
- hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(stack->BP));
-}
+ const auto process_index = pid % kSchedProcessLimitPerTeam;
-/// @brief makes thread go to hang state.
-/// hooks and hangs thread to prevent code from executing.
-Void mp_hang_thread(HAL::StackFramePtr stack)
-{
- if (!stack)
- return;
+ kProcessBlocks[process_index].f_Frame = stack_frame;
+
+ return YES;
+ }
- hal_set_pc_to_hart(reinterpret_cast<HAL_HARDWARE_THREAD*>(stack->R15), reinterpret_cast<VoidPtr>(Kernel::Detail::mp_hang_fn));
-}
+ BOOL mp_initialize_gic(Void)
+ {
+ if (!Detail::kGICEnabled)
+ {
+ Detail::kGICEnabled = YES;
+ Detail::mp_setup_gic_el0();
+
+ return YES;
+ }
+
+ return NO;
+ }
+} // namespace Kernel
\ No newline at end of file diff --git a/dev/Kernel/HALKit/ARM64/HalCoreMPScheduler.cc b/dev/Kernel/HALKit/ARM64/HalCoreMPScheduler.cc deleted file mode 100644 index fe055db8..00000000 --- a/dev/Kernel/HALKit/ARM64/HalCoreMPScheduler.cc +++ /dev/null @@ -1,28 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024, Theater Quality Corp, all rights reserved. - -------------------------------------------- */ - -#include <Mod/ACPI/ACPIFactoryInterface.h> -#include <KernelKit/UserProcessScheduler.h> - -using namespace Kernel; - -STATIC struct PROCESS_CONTROL_BLOCK final -{ - HAL::StackFramePtr f_Frame; - UInt8* f_Stack; - VoidPtr f_Image; -} kProcessBlocks[kSchedProcessLimitPerTeam] = {0}; - -EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID pid) -{ - return kProcessBlocks[pid % kSchedProcessLimitPerTeam].f_Frame; -} - -EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame, ProcessID pid) -{ - MUST_PASS(image && stack_ptr && stack_frame); - return No; -} diff --git a/dev/Kernel/HALKit/ARM64/HalKernelMain.cc b/dev/Kernel/HALKit/ARM64/HalKernelMain.cc index 692c6be2..1869d97b 100644 --- a/dev/Kernel/HALKit/ARM64/HalKernelMain.cc +++ b/dev/Kernel/HALKit/ARM64/HalKernelMain.cc @@ -4,6 +4,7 @@ ------------------------------------------- */ +#include "HALKit/ARM64/ApplicationProcessor.h" #include <ArchKit/ArchKit.h> #include <Mod/GfxMgr/FBMgr.h> #include <FirmwareKit/Handover.h> @@ -15,10 +16,9 @@ #include <KernelKit/CodeMgr.h> #include <Mod/ACPI/ACPIFactoryInterface.h> #include <NetworkKit/IPC.h> +#include <HALKit/ARM64/Processor.h> #include <CFKit/Property.h> -Kernel::Void hal_real_init(Kernel::Void) noexcept; -EXTERN_C Kernel::Void rtl_kernel_main(Kernel::SizeT argc, char** argv, char** envp, Kernel::SizeT envp_len); EXTERN_C void hal_init_platform( Kernel::HEL::BootInfoHeader* handover_hdr) @@ -46,7 +46,7 @@ EXTERN_C void hal_init_platform( /// @note do initialize the interrupts after it. - rtl_kernel_main(0, nullptr, nullptr, 0); + Kernel::mp_initialize_gic(); while (YES) { diff --git a/dev/Kernel/HALKit/ARM64/HalKernelPanic.cc b/dev/Kernel/HALKit/ARM64/HalKernelPanic.cc new file mode 100644 index 00000000..4cd61aff --- /dev/null +++ b/dev/Kernel/HALKit/ARM64/HalKernelPanic.cc @@ -0,0 +1,80 @@ +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Corp, all rights reserved. + +------------------------------------------- */ + +#include <NewKit/KernelPanic.h> +#include <ArchKit/ArchKit.h> +#include <KernelKit/Timer.h> +#include <KernelKit/DebugOutput.h> +#include <NewKit/KString.h> +#include <FirmwareKit/Handover.h> +#include <KernelKit/FileMgr.h> +#include <Mod/GfxMgr/FBMgr.h> +#include <Mod/GfxMgr/TextMgr.h> +#include <NewKit/Utils.h> + +/* Each error code is attributed with an ID, which will prompt a string onto the + * screen. Wait for debugger... */ + +namespace Kernel +{ + /// @brief Dumping factory class. + class RecoveryFactory final + { + public: + STATIC Void Recover() noexcept; + }; + + /***********************************************************************************/ + /// @brief Stops execution of the kernel. + /// @param id kernel stop ID. + /***********************************************************************************/ + Void ke_panic(const Kernel::Int32& id, const Char* message) + { + fb_init(); + + auto panic_text = RGB(0xff, 0xff, 0xff); + + auto y = 10; + auto x = 10; + + Char* message_apicid = new Char[128]; + rt_set_memory(message_apicid, 0, 128); + + rt_copy_memory((VoidPtr) "panic id: ", message_apicid, rt_string_len("panic id: ")); + rt_to_string(message_apicid + rt_string_len("panic id: "), (UIntPtr)id, 10); + + fb_render_string(message_apicid, y, x, panic_text); + + y += 10; + + fb_render_string((message ? message : "message: panic raised, going nowhere after this!"), y, x, panic_text); + + y += 10; + + fb_clear(); + + RecoveryFactory::Recover(); + } + + Void RecoveryFactory::Recover() noexcept + { + while (YES) + { + HAL::rt_halt(); + } + } + + void ke_runtime_check(bool expr, const Char* file, const Char* line) + { + if (!expr) + { + kcout << "FAILED: FILE: " << file << endl; + kcout << "FAILED: LINE: " << line << endl; + + ke_panic(RUNTIME_CHECK_FAILED, file); // Runtime Check failed + } + } +} // namespace Kernel diff --git a/dev/Kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc b/dev/Kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc index b015f001..e0a21c2f 100644 --- a/dev/Kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc +++ b/dev/Kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc @@ -8,22 +8,6 @@ namespace Kernel { - EXTERN_C Void __zka_pure_call(void) - { - UserProcessScheduler::The().GetCurrentProcess().Leak().Crash(); - } - - bool hal_check_stack(HAL::StackFramePtr stackPtr) - { - if (!stackPtr) - return No; - - if (stackPtr->BP == 0 || stackPtr->SP == 0) - return No; - - return Yes; - } - /// @brief Wakes up thread. /// Wakes up thread from the hang state. Void mp_wakeup_thread(HAL::StackFrame* stack) diff --git a/dev/Kernel/HALKit/ARM64/HalSchedulerCore.cc b/dev/Kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc index c6585cb8..941fdf7a 100644 --- a/dev/Kernel/HALKit/ARM64/HalSchedulerCore.cc +++ b/dev/Kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc @@ -4,7 +4,7 @@ ------------------------------------------- */
-#include <HALKit/AMD64/Processor.h>
+#include <HALKit/ARM64/Processor.h>
#include <KernelKit/UserProcessScheduler.h>
namespace Kernel
diff --git a/dev/Kernel/HALKit/ARM64/Processor.h b/dev/Kernel/HALKit/ARM64/Processor.h index 422fafe1..bdf3272a 100644 --- a/dev/Kernel/HALKit/ARM64/Processor.h +++ b/dev/Kernel/HALKit/ARM64/Processor.h @@ -58,13 +58,24 @@ namespace Kernel::HAL typedef StackFrame* StackFramePtr; - inline Void rt_halt() + inline Void rt_halt() noexcept { while (Yes) { } } + template <typename DataKind> + inline void hal_mmio_write(UIntPtr address, DataKind value) + { + *reinterpret_cast<volatile DataKind*>(address) = value; + } + + template <typename DataKind> + inline DataKind hal_mmio_read(UIntPtr address) + { + return *reinterpret_cast<volatile DataKind*>(address); + } } // namespace Kernel::HAL inline Kernel::VoidPtr kKernelBitMpStart = nullptr; diff --git a/dev/Kernel/MoveAll.ARM64.sh b/dev/Kernel/MoveAll.ARM64.sh index 35e0909e..35e0909e 100644..100755 --- a/dev/Kernel/MoveAll.ARM64.sh +++ b/dev/Kernel/MoveAll.ARM64.sh diff --git a/dev/Kernel/amd64-desktop.make b/dev/Kernel/amd64-desktop.make index 99be29ad..cfc4db9f 100644 --- a/dev/Kernel/amd64-desktop.make +++ b/dev/Kernel/amd64-desktop.make @@ -7,7 +7,7 @@ CC = x86_64-w64-mingw32-g++ LD = x86_64-w64-mingw32-ld CCFLAGS = -fshort-wchar -c -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \ -std=c++20 -D__ZKA_SUPPORT_NX__ -O0 -I../Vendor -D__FSKIT_INCLUDES_NEFS__ \ - -D__MINOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA__ -I./ -I../ -I../zba + -D__MINOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA_VIRTUAL_MEMORY_SUPPORT__ -D__ZKA_AUTO_FORMAT__ -D__ZKA__ -I./ -I../ -I../zba ASM = nasm diff --git a/dev/Kernel/arm64-desktop.make b/dev/Kernel/arm64-desktop.make index a899ae18..27e68679 100644 --- a/dev/Kernel/arm64-desktop.make +++ b/dev/Kernel/arm64-desktop.make @@ -11,7 +11,7 @@ CCFLAGS = -fshort-wchar -c -ffreestanding -MMD -mno-red-zone -D__ZKA_ARM64__ -f ASM = clang++ -DISKDRIVER = -D__USE_FLASH_MEM__ -D__USE_SAS__ -D__USE_SATA__ +DISKDRIVER = -D__USE_FLASH_MEM__ ifneq ($(DEBUG_SUPPORT), ) DEBUG = -D__DEBUG__ diff --git a/dev/Kernel/src/KernelMain.cc b/dev/Kernel/src/KernelMain.cc index 303b1d81..af835183 100644 --- a/dev/Kernel/src/KernelMain.cc +++ b/dev/Kernel/src/KernelMain.cc @@ -24,6 +24,7 @@ #include <CFKit/Property.h> #include <KernelKit/Timer.h> +#ifdef __ZKA_AUTO_FORMAT__ namespace Kernel::Detail { /// @brief Filesystem auto formatter, additional checks are also done by the class. @@ -91,12 +92,15 @@ namespace Kernel::Detail ZKA_COPY_DEFAULT(NeFilesystemInstaller); }; } // namespace Kernel::Detail +#endif // ifdef __ZKA_AUTO_FORMAT__ /// @brief Kernel entrypoint. /// @param Void /// @return Void EXTERN_C Kernel::Void rtl_kernel_main(Kernel::SizeT argc, char** argv, char** envp, Kernel::SizeT envp_len) { +#ifdef __ZKA_AUTO_FORMAT__ Kernel::Detail::fs_init_newfs(); Kernel::Detail::NeFilesystemInstaller installer{}; +#endif // __ZKA_AUTO_FORMAT__ } diff --git a/dev/Kernel/src/UserProcessScheduler.cc b/dev/Kernel/src/UserProcessScheduler.cc index 936d0547..55d3474b 100644 --- a/dev/Kernel/src/UserProcessScheduler.cc +++ b/dev/Kernel/src/UserProcessScheduler.cc @@ -106,7 +106,7 @@ namespace Kernel ErrorOr<VoidPtr> UserThread::New(const SizeT& sz, const SizeT& pad_amount) { -#ifdef __ZKA_AMD64__ +#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__ auto vm_register = hal_read_cr3(); hal_write_cr3(this->VMRegister); @@ -206,7 +206,7 @@ namespace Kernel auto memory_heap_list = this->ProcessMemoryHeap; -#ifdef __ZKA_AMD64__ +#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__ auto pd = hal_read_cr3(); hal_write_cr3(this->VMRegister); #endif @@ -219,7 +219,7 @@ namespace Kernel MUST_PASS(mm_delete_heap(memory_heap_list->MemoryEntry)); } -#ifdef __ZKA_AMD64__ +#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__ hal_write_cr3(pd); #endif @@ -297,7 +297,7 @@ namespace Kernel rt_copy_memory(reinterpret_cast<VoidPtr>(const_cast<Char*>(name)), process.Name, rt_string_len(name)); -#ifdef __ZKA_AMD64__ +#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__ process.VMRegister = new PDE(); if (!process.VMRegister) @@ -311,7 +311,7 @@ namespace Kernel flags |= HAL::kMMFlagsUser; HAL::mm_map_page((VoidPtr)process.VMRegister, flags); -#endif // __ZKA_AMD64__ +#endif // __ZKA_VIRTUAL_MEMORY_SUPPORT__ process.StackFrame = new HAL::StackFrame(); @@ -321,11 +321,13 @@ namespace Kernel return kErrorProcessFault; } +#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__ flags = HAL::kMMFlagsPresent; flags |= HAL::kMMFlagsWr; flags |= HAL::kMMFlagsUser; HAL::mm_map_page((VoidPtr)process.StackFrame, flags); +#endif // __ZKA_VIRTUAL_MEMORY_SUPPORT__ // Create heap according to type of process. if (process.Kind == UserThread::kExectuableDLLKind) @@ -336,11 +338,13 @@ namespace Kernel process.StackReserve = new UInt8[process.StackSize]; +#ifdef __ZKA_VIRTUAL_MEMORY_SUPPORT__ flags = HAL::kMMFlagsPresent; flags |= HAL::kMMFlagsWr; flags |= HAL::kMMFlagsUser; HAL::mm_map_page((VoidPtr)process.StackReserve, flags); +#endif // __ZKA_VIRTUAL_MEMORY_SUPPORT__ if (!process.StackReserve) { diff --git a/dev/Mod/GfxMgr/FBMgr.h b/dev/Mod/GfxMgr/FBMgr.h index cde12343..87abfeca 100644 --- a/dev/Mod/GfxMgr/FBMgr.h +++ b/dev/Mod/GfxMgr/FBMgr.h @@ -16,6 +16,7 @@ #define fb_clear() kCGCursor = 0 +#ifdef __ZKA_AMD64__ /// @brief Performs Alpha drawing on the framebuffer. #define FBDrawBitMapInRegionA(reg_ptr, height, width, base_x, base_y) \ for (Kernel::SizeT i = base_x; i < (width + base_x); ++i) \ @@ -111,6 +112,22 @@ 4 * y_base))) |= _Clr; \ } \ } +#else +#define FBDrawBitMapInRegionA(reg_ptr, height, width, base_x, base_y) +#define FBDrawBitMapInRegion(reg_ptr, height, width, base_x, base_y) +#define FBDrawBitMapInRegionToRgn(_Rgn, reg_ptr, height, width, base_x, base_y) +#define CGClearRegion(height, width, base_x, base_y) +#define FBDrawInRegion(_Clr, height, width, base_x, base_y) +#define FBDrawInRegionToRgn(_Rgn, _Clr, height, width, base_x, base_y) +#define FBDrawInRegionA(_Clr, height, width, base_x, base_y) +#define FBDrawBitMapInRegionA(reg_ptr, height, width, base_x, base_y) +#define FBDrawBitMapInRegion(reg_ptr, height, width, base_x, base_y) +#define FBDrawBitMapInRegionToRgn(_Rgn, reg_ptr, height, width, base_x, base_y) +#define CGClearRegion(height, width, base_x, base_y) +#define FBDrawInRegion(_Clr, height, width, base_x, base_y) +#define FBDrawInRegionToRgn(_Rgn, _Clr, height, width, base_x, base_y) +#define FBDrawInRegionA(_Clr, height, width, base_x, base_y) +#endif // __ZKA_AMD64__ #ifndef GFX_MGR_ACCESSIBILITY_H #include <Mod/GfxMgr/AccessibilityMgr.h> |
