summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-01-06 20:11:53 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2025-01-06 20:11:53 +0100
commit98110adc9f47666696e18a6c7c97a3edc89c5d90 (patch)
treee39f76352995abfdcc154637b2dae00ed246d5c7 /dev
parent8c179d8801df7f5f77fe7ec65a0a98b7901dad09 (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')
-rw-r--r--dev/Boot/BootKit/BootKit.h1
-rw-r--r--dev/Boot/BootKit/Support.h10
-rw-r--r--dev/Boot/Mod/SysChk/Boot.S2
-rw-r--r--dev/Boot/Mod/SysChk/Module.cc4
-rw-r--r--dev/Boot/Mod/SysChk/amd64.json (renamed from dev/Boot/Mod/SysChk/build.json)0
-rw-r--r--dev/Boot/Mod/SysChk/arm64.json26
-rw-r--r--dev/Boot/amd64-desktop.make4
-rw-r--r--dev/Boot/arm64-desktop.make28
-rw-r--r--dev/Boot/arm64-mobile.make19
-rw-r--r--dev/Boot/src/BootFileReader.cc31
-rw-r--r--dev/Boot/src/BootThread.cc2
-rw-r--r--dev/Boot/src/HEL/AMD64/EFIBootStartup.cc17
-rw-r--r--dev/Boot/src/HEL/ARM64/CoreBootStartup.S6
-rw-r--r--dev/Boot/src/HEL/ARM64/EFIBootStartup.cc190
-rw-r--r--dev/Boot/src/Root/EFI/STARTUP.NSH2
-rw-r--r--dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc (renamed from dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc)43
-rw-r--r--dev/Kernel/HALKit/AMD64/HalKernelMain.cc21
-rw-r--r--dev/Kernel/HALKit/AMD64/Processor.h5
-rw-r--r--dev/Kernel/HALKit/ARM64/AP.h36
-rw-r--r--dev/Kernel/HALKit/ARM64/ApplicationProcessor.h19
-rw-r--r--dev/Kernel/HALKit/ARM64/HalApplicationProcessor.cc140
-rw-r--r--dev/Kernel/HALKit/ARM64/HalCoreMPScheduler.cc28
-rw-r--r--dev/Kernel/HALKit/ARM64/HalKernelMain.cc6
-rw-r--r--dev/Kernel/HALKit/ARM64/HalKernelPanic.cc80
-rw-r--r--dev/Kernel/HALKit/ARM64/HalSchedulerCoreARM64.cc16
-rw-r--r--dev/Kernel/HALKit/ARM64/HalSchedulerCorePrimitivesARM64.cc (renamed from dev/Kernel/HALKit/ARM64/HalSchedulerCore.cc)2
-rw-r--r--dev/Kernel/HALKit/ARM64/Processor.h13
-rwxr-xr-x[-rw-r--r--]dev/Kernel/MoveAll.ARM64.sh0
-rw-r--r--dev/Kernel/amd64-desktop.make2
-rw-r--r--dev/Kernel/arm64-desktop.make2
-rw-r--r--dev/Kernel/src/KernelMain.cc4
-rw-r--r--dev/Kernel/src/UserProcessScheduler.cc14
-rw-r--r--dev/Mod/GfxMgr/FBMgr.h17
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>