From 7e16694a4fff437322561cf0afba1f426d66e8bc Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 30 Mar 2024 11:07:14 +0100 Subject: NewBoot: See below. What has been done: - Add LX header for PowerPC and RISC-V 64 HELs. - Force usage of a custom firmware for AMD64, except for debug builds with a CD-ROM containing NewBoot. - Handle missing ATA driver. - Add debug switch on bootloader. What is in progress: - Preemptive multi-tasking and user processes. - NewFS support. - System calls. - AHCI support. - PowerPC support. - RISC-V support. Signed-off-by: Amlal El Mahrouss --- Private/NewBoot/Source/CDROM/.HCORE | 2 -- Private/NewBoot/Source/CDROM/.NEWDEV | 2 ++ .../NewBoot/Source/HEL/AMD64/BootCustomPart.cxx | 4 +--- Private/NewBoot/Source/HEL/AMD64/BootMain.cxx | 24 +++++++++++++--------- Private/NewBoot/Source/HEL/AMD64/BootPlatform.cxx | 15 ++++++++++++++ Private/NewBoot/Source/HEL/PowerPC/.gitkeep | 0 Private/NewBoot/Source/HEL/PowerPC/BootPowerPC.S | 22 ++++++++++++++++++++ Private/NewBoot/Source/HEL/RISCV/BootRISCV.S | 22 ++++++++++++++++++++ Private/NewBoot/Source/makefile | 4 ++-- 9 files changed, 78 insertions(+), 17 deletions(-) delete mode 100644 Private/NewBoot/Source/CDROM/.HCORE create mode 100644 Private/NewBoot/Source/CDROM/.NEWDEV create mode 100644 Private/NewBoot/Source/HEL/AMD64/BootPlatform.cxx create mode 100644 Private/NewBoot/Source/HEL/PowerPC/.gitkeep create mode 100644 Private/NewBoot/Source/HEL/PowerPC/BootPowerPC.S create mode 100644 Private/NewBoot/Source/HEL/RISCV/BootRISCV.S diff --git a/Private/NewBoot/Source/CDROM/.HCORE b/Private/NewBoot/Source/CDROM/.HCORE deleted file mode 100644 index d5d2badf..00000000 --- a/Private/NewBoot/Source/CDROM/.HCORE +++ /dev/null @@ -1,2 +0,0 @@ -[POWER_MANAGEMENT] -ENFORCE_ACPI=YES \ No newline at end of file diff --git a/Private/NewBoot/Source/CDROM/.NEWDEV b/Private/NewBoot/Source/CDROM/.NEWDEV new file mode 100644 index 00000000..d5d2badf --- /dev/null +++ b/Private/NewBoot/Source/CDROM/.NEWDEV @@ -0,0 +1,2 @@ +[POWER_MANAGEMENT] +ENFORCE_ACPI=YES \ No newline at end of file diff --git a/Private/NewBoot/Source/HEL/AMD64/BootCustomPart.cxx b/Private/NewBoot/Source/HEL/AMD64/BootCustomPart.cxx index 29fd596d..d3022339 100644 --- a/Private/NewBoot/Source/HEL/AMD64/BootCustomPart.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/BootCustomPart.cxx @@ -18,12 +18,10 @@ EXTERN_C Boolean boot_write_newos_partition(BootDeviceATA* ataInterface) { Char newOSHeader[kATASectorSize] = { /// signature of our system partition. - 'N', 'e', 'w', '!', + 'N', 'e', 'w', 'O', 'S', /// version of our os partition (Char)0x10, - /// to retrieve the header size add these two fileds. (divided into parts.) - /// header size (pt 1) (Char)0x100, /// header size (pt 2) diff --git a/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx b/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx index 88ad1e32..599a533f 100644 --- a/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx @@ -17,8 +17,6 @@ #define kMaxBufSize 256 -EXTERN_C void Main(HEL::HandoverInformationHeader* handoverInfo); - /// @brief Bootloader main type. typedef void (*bt_main_type)(HEL::HandoverInformationHeader* handoverInfo); @@ -44,6 +42,7 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, BootDeviceATA ataDrv; Boolean isIniNotFound = No; +#ifndef __DEBUG__ /// if ATA drive is initialized and EFI vendor supports an EPM scheme. /// @EDK tells our OS that it supports EPM scheme as well. if (ataDrv && @@ -51,16 +50,26 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, Char namePart[kEPMNameLength] = {"BootBlock"}; /// tries to read an EPM block, or writes one if it fails. - bool isIniNotFound = + isIniNotFound = boot_write_epm_partition(namePart, kEPMNameLength, &ataDrv); } else if (SystemTable->FirmwareVendor[0] != '@') { - writer.Write(L"This firmware can't understand NewOS, please use Mahrouss Logic products instead\r\nOur website: www.el-mahrouss-logic.com\r\n"); + writer.Write(L"NewBoot.exe: This firmware can't understand NewOS, please use Mahrouss Logic products instead\r\nNewBoot.exe: Our website: www.el-mahrouss-logic.com\r\n"); + return kEfiFail; + } else if (!ataDrv) { + writer.Write(L"NewBoot.exe: This computer can't work with NewOS, please use Mahrouss Logic products instead\r\nNewBoot.exe: Our website: www.el-mahrouss-logic.com\r\n"); return kEfiFail; } +#else + Char namePart[kEPMNameLength] = {"BootBlock"}; + + /// tries to read an EPM block, or writes one if it fails. + isIniNotFound = + boot_write_epm_partition(namePart, kEPMNameLength, &ataDrv); +#endif // !__DEBUG__ /// Read Kernel blob. - BFileReader kernelImg(L".HCORE", ImageHandle); + BFileReader kernelImg(L".NEWDEV", ImageHandle); kernelImg.Size(kMaxBufSize); kernelImg.ReadAll(); @@ -160,11 +169,6 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, if (!isIniNotFound) { writer.Write(L"NewBoot.exe: No partition found for NewOS. (HCR-1000)\r\n"); - writer.Write(L"NewBoot.exe: Running setup for NewOS...\r\n"); - - EFI::ExitBootServices(MapKey, ImageHandle); - - Main(handoverHdrPtr); } else { handoverHdrPtr->f_Magic = kHandoverMagic; handoverHdrPtr->f_Version = kHandoverVersion; diff --git a/Private/NewBoot/Source/HEL/AMD64/BootPlatform.cxx b/Private/NewBoot/Source/HEL/AMD64/BootPlatform.cxx new file mode 100644 index 00000000..08a6979f --- /dev/null +++ b/Private/NewBoot/Source/HEL/AMD64/BootPlatform.cxx @@ -0,0 +1,15 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + +------------------------------------------- */ + +extern "C" void rt_halt() { asm volatile("hlt"); } + +extern "C" void rt_cli() { asm volatile("cli"); } + +extern "C" void rt_sti() { asm volatile("sti"); } + +extern "C" void rt_cld() { asm volatile("cld"); } + +extern "C" void rt_std() { asm volatile("std"); } \ No newline at end of file diff --git a/Private/NewBoot/Source/HEL/PowerPC/.gitkeep b/Private/NewBoot/Source/HEL/PowerPC/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Private/NewBoot/Source/HEL/PowerPC/BootPowerPC.S b/Private/NewBoot/Source/HEL/PowerPC/BootPowerPC.S new file mode 100644 index 00000000..87b87bab --- /dev/null +++ b/Private/NewBoot/Source/HEL/PowerPC/BootPowerPC.S @@ -0,0 +1,22 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + +------------------------------------------- */ + +.section .init +.align 4 + +/* NewOS kernel header begin */ + +k_hdr_mag: + .ascii "LX" +k_hdr_name: + // it has to match ten bytes. + .asciz "New OS\0\0\0\0" +k_hdr_ver: + .word 0x104 +k_hdr_proc: + .long __bootloader_start + +/* end */ \ No newline at end of file diff --git a/Private/NewBoot/Source/HEL/RISCV/BootRISCV.S b/Private/NewBoot/Source/HEL/RISCV/BootRISCV.S new file mode 100644 index 00000000..87b87bab --- /dev/null +++ b/Private/NewBoot/Source/HEL/RISCV/BootRISCV.S @@ -0,0 +1,22 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + +------------------------------------------- */ + +.section .init +.align 4 + +/* NewOS kernel header begin */ + +k_hdr_mag: + .ascii "LX" +k_hdr_name: + // it has to match ten bytes. + .asciz "New OS\0\0\0\0" +k_hdr_ver: + .word 0x104 +k_hdr_proc: + .long __bootloader_start + +/* end */ \ No newline at end of file diff --git a/Private/NewBoot/Source/makefile b/Private/NewBoot/Source/makefile index af35a110..a3807a6d 100644 --- a/Private/NewBoot/Source/makefile +++ b/Private/NewBoot/Source/makefile @@ -20,7 +20,7 @@ IMG=epm.img EMU_FLAGS=-net none -smp 4 -m 4G -M q35 -bios OVMF.fd -device piix3-ide,id=ide -drive id=disk,file=$(IMG),format=raw,if=none -device ide-hd,drive=disk,bus=ide.0 -drive file=fat:rw:CDROM,index=2,format=raw -d int LD_FLAGS=-e efi_main --subsystem=10 -OBJ=$(wildcard *.o) $(wildcard ../../Objects/*.obj) $(wildcard HEL/AMD64/*.obj) +OBJ=$(wildcard *.o) $(wildcard HEL/AMD64/*.obj) REM=rm REM_FLAG=-f @@ -40,7 +40,7 @@ bootloader-amd64: compile-amd64 .PHONY: compile-amd64 compile-amd64: - $(CC_GNU) $(FLAG_GNU) $(wildcard HEL/AMD64/*.cxx) $(wildcard *.cxx) + $(CC_GNU) $(FLAG_GNU) $(DEBUG) $(wildcard HEL/AMD64/*.cxx) $(wildcard *.cxx) .PHONY: run-efi-amd64 run-efi-amd64: -- cgit v1.2.3