summaryrefslogtreecommitdiffhomepage
path: root/dev/zba
diff options
context:
space:
mode:
authorAmlal El Mahrouss <zka-holder@mahrouss-logic.com>2024-10-14 05:58:38 +0000
committerAmlal El Mahrouss <zka-holder@mahrouss-logic.com>2024-10-14 05:58:38 +0000
commit7ad3739afdfaa2466723467f5ef2526f171c87c3 (patch)
tree37775f4299281598b0f5121df4c188392daebd04 /dev/zba
parent7477a0f942c374b652da4f80cdb36d4661aac3c8 (diff)
parentd9d82713326069478e6dd212763d1fac15e65370 (diff)
Merge branch 'port-stage1-hello-world' into 'unstable'
IMP: Basic ARM64 port. See merge request mahrouss/zka-dev!20
Diffstat (limited to 'dev/zba')
-rw-r--r--dev/zba/amd64-efi.make2
-rw-r--r--dev/zba/arm64-efi.make10
-rw-r--r--dev/zba/src/BootFileReader.cxx2
-rw-r--r--dev/zba/src/HEL/AMD64/BootMain.cxx6
-rw-r--r--dev/zba/src/HEL/ARM64/BootMain.cxx62
-rw-r--r--dev/zba/src/Thread.cxx72
6 files changed, 101 insertions, 53 deletions
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();