Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ jobs:
- name: Install Dependencies
run: |
sudo apt-get -y update
sudo apt-get -y install build-essential git xorriso qemu-system-x86
sudo apt-get -y install build-essential curl xorriso qemu-system-x86

- name: Enable KVM Group Perms
run: |
Expand Down
8 changes: 6 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,17 @@
*.sys
*.SYS
/src/EFI
/build/limine
/build/ovmf
/build/limine-binary
/build/limine-binary.tar.gz
/build/edk2-ovmf-bins
/build/edk2-ovmf-bins.tar.gz
*.iso
*.raw
*.hdd
*.o
*.d
/zealbooter/compile_commands.json
/zealbooter/.cache
/zealbooter/src/limine.h
/zealbooter/bin
/zealbooter/obj
74 changes: 28 additions & 46 deletions build/build-iso.sh
Original file line number Diff line number Diff line change
Expand Up @@ -79,33 +79,22 @@ umount_tempdisk
echo "Rebuilding kernel headers, kernel, OS, and building Distro ISO ..."
"$QEMU_BIN_PATH/qemu-system-x86_64" -machine q35 $KVM -drive format=raw,file="$TMPDISK" -m 1G -rtc base=localtime -smp 4 -device isa-debug-exit $QEMU_HEADLESS || true

LIMINE_BINARY_BRANCH="v10.x-binary"

if [ -d "limine" ]
if [ ! -d "limine-binary" ]
then
cd limine
git remote set-branches origin $LIMINE_BINARY_BRANCH
git fetch
git remote set-head origin $LIMINE_BINARY_BRANCH
git switch $LIMINE_BINARY_BRANCH
git config --local pull.ff true
git config --local pull.rebase true
git pull
rm limine

cd ..
else
git clone https://github.com/limine-bootloader/limine.git --branch=$LIMINE_BINARY_BRANCH --depth=1
echo "Downloading latest Limine binary release ..."
rm -f limine-binary.tar.gz
curl -fL -o limine-binary.tar.gz https://github.com/Limine-Bootloader/Limine/releases/latest/download/limine-binary.tar.gz
gunzip < limine-binary.tar.gz | tar -xf -
rm -f limine-binary.tar.gz
fi
make -C limine

touch limine/Limine-BIOS-HDD.HH
echo "/*\$WW,1\$" > limine/Limine-BIOS-HDD.HH
cat limine/LICENSE >> limine/Limine-BIOS-HDD.HH
echo "*/\$WW,0\$" >> limine/Limine-BIOS-HDD.HH
cat limine/limine-bios-hdd.h >> limine/Limine-BIOS-HDD.HH
sed -i 's/const uint8_t/U8/g' limine/Limine-BIOS-HDD.HH
sed -i "s/\[\]/\[$(grep -o "0x" ./limine/limine-bios-hdd.h | wc -l)\]/g" limine/Limine-BIOS-HDD.HH
touch limine-binary/Limine-BIOS-HDD.HH
echo "/*\$WW,1\$" > limine-binary/Limine-BIOS-HDD.HH
cat limine-binary/LICENSE >> limine-binary/Limine-BIOS-HDD.HH
echo "*/\$WW,0\$" >> limine-binary/Limine-BIOS-HDD.HH
cat limine-binary/limine-bios-hdd.h >> limine-binary/Limine-BIOS-HDD.HH
sed -i 's/const uint8_t/U8/g' limine-binary/Limine-BIOS-HDD.HH
sed -i "s/\[\]/\[$(grep -o "0x" ./limine-binary/limine-bios-hdd.h | wc -l)\]/g" limine-binary/Limine-BIOS-HDD.HH

mount_tempdisk
echo "Extracting MyDistro ISO from vdisk ..."
Expand All @@ -116,43 +105,36 @@ sudo cp -rf "$TMPMOUNT"/* "$TMPISODIR/"
sudo rm -f "$TMPISODIR/Boot/OldMBR.BIN"
sudo rm -f "$TMPISODIR/Boot/BootMHD2.BIN"
sudo mkdir -p "$TMPISODIR/EFI/BOOT"
sudo cp limine/Limine-BIOS-HDD.HH "$TMPISODIR/Boot/Limine-BIOS-HDD.HH"
sudo cp limine/BOOTX64.EFI "$TMPISODIR/EFI/BOOT/BOOTX64.EFI"
sudo cp limine/limine-uefi-cd.bin "$TMPISODIR/Boot/Limine-UEFI-CD.BIN"
sudo cp limine/limine-bios-cd.bin "$TMPISODIR/Boot/Limine-BIOS-CD.BIN"
sudo cp limine/limine-bios.sys "$TMPISODIR/Boot/Limine-BIOS.SYS"
sudo cp limine-binary/Limine-BIOS-HDD.HH "$TMPISODIR/Boot/Limine-BIOS-HDD.HH"
sudo cp limine-binary/BOOTX64.EFI "$TMPISODIR/EFI/BOOT/BOOTX64.EFI"
sudo cp limine-binary/BOOTIA32.EFI "$TMPISODIR/EFI/BOOT/BOOTIA32.EFI"
sudo cp limine-binary/limine-uefi-cd.bin "$TMPISODIR/Boot/Limine-UEFI-CD.BIN"
sudo cp limine-binary/limine-bios-cd.bin "$TMPISODIR/Boot/Limine-BIOS-CD.BIN"
sudo cp limine-binary/limine-bios.sys "$TMPISODIR/Boot/Limine-BIOS.SYS"
sudo cp ../zealbooter/bin/kernel "$TMPISODIR/Boot/ZealBooter.ELF"
sudo cp ../zealbooter/limine.conf "$TMPISODIR/Boot/Limine.CONF"
echo "Copying DVDKernel.ZXE over ISO Boot/Kernel.ZXE ..."
sudo mv "$TMPMOUNT/Tmp/DVDKernel.ZXE" "$TMPISODIR/Boot/Kernel.ZXE"
sudo rm -f "$TMPISODIR/Tmp/DVDKernel.ZXE"
umount_tempdisk

truncate -s 32K bios_boot.img

# ZealOS only boots off optical media, but the GPT stays, as the kernel
# finds the disc it booted from by its disk GUID.
xorriso -as mkisofs -R -r -J -b Boot/Limine-BIOS-CD.BIN \
-no-emul-boot -boot-load-size 4 -boot-info-table \
--efi-boot Boot/Limine-UEFI-CD.BIN \
-no-emul-boot -boot-load-size 4 -boot-info-table -hfsplus \
-apm-block-size 2048 --efi-boot Boot/Limine-UEFI-CD.BIN \
-efi-boot-part --efi-boot-image --protective-msdos-label \
-append_partition 4 21686148-6449-6E6F-744E-656564454649 bios_boot.img \
-appended_part_as_gpt \
"$TMPISODIR" -o ZealOS-limine.iso

rm bios_boot.img

./limine/limine bios-install ZealOS-limine.iso --no-gpt-to-mbr-isohybrid-conversion

if [ "$TESTING" = true ]; then
if [ ! -d "ovmf" ]; then
if [ ! -d "edk2-ovmf-bins" ]; then
echo "Downloading OVMF..."
mkdir ovmf
cd ovmf
curl -o OVMF-X64.zip https://efi.akeo.ie/OVMF/OVMF-X64.zip
7z x OVMF-X64.zip
cd ..
curl -fL -o edk2-ovmf-bins.tar.gz https://github.com/osdev0/edk2-ovmf-stable-bins/releases/latest/download/edk2-ovmf-bins.tar.gz
gunzip < edk2-ovmf-bins.tar.gz | tar -xf -
rm -f edk2-ovmf-bins.tar.gz
fi
echo "Testing limine-zealbooter-xorriso isohybrid boot in UEFI mode ..."
"$QEMU_BIN_PATH/qemu-system-x86_64" -machine q35 $KVM -m 1G -rtc base=localtime -bios ovmf/OVMF.fd -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS
"$QEMU_BIN_PATH/qemu-system-x86_64" -machine q35 $KVM -m 1G -rtc base=localtime -drive if=pflash,unit=0,format=raw,file=edk2-ovmf-bins/ovmf-code-x86_64.fd,readonly=on -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS
echo "Testing limine-zealbooter-xorriso isohybrid boot in BIOS mode ..."
"$QEMU_BIN_PATH/qemu-system-x86_64" -machine q35 $KVM -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS
echo "Testing native ZealC MyDistro legacy ISO in BIOS mode ..."
Expand Down
85 changes: 75 additions & 10 deletions src/System/Boot/LimineMHDIns.ZC
Original file line number Diff line number Diff line change
Expand Up @@ -67,36 +67,101 @@ Bool LimineCFGMake(U8 drv_let)
return TRUE;
}

#define LIMINE_MBR_GAP_BLKS 63 // MBR + post-MBR gap, limine bios-install refuses partitions starting inside it
#define LIMINE_STAGE2_LOC 0x1000 // byte offset limine bios-install puts stage 2 at, a multiple of any sector size

Bool LimineMBRCheck(CMasterBoot *mbr)
{
I64 i;
Bool any_active = FALSE;

for (i = 0; i < 4; i++)
if (mbr->p[i].type && mbr->p[i].offset < LIMINE_MBR_GAP_BLKS)
{
"\n" ST_ERR_ST "A partition's start sector is less than %d.\n", LIMINE_MBR_GAP_BLKS;
return FALSE;
}

for (i = 0; i < 4; i++)
{
if (mbr->p[i].active != 0x00 && mbr->p[i].active != 0x80)
break;
if (mbr->p[i].active)
any_active = TRUE;
}

if (i < 4 || mbr->signature != 0xAA55)
{
"\n" ST_ERR_ST "Could not determine if the disk has a valid partition table.\n";
return FALSE;
}

if (!any_active)
{
"No active partition found, setting partition 1 as active.\n";
mbr->p[0].active = 0x80;
}

return TRUE;
}

Bool LimineMHDIns(U8 drv_let)
{
U8 *limine = binary_limine_hdd_bin_data;
U16 limine_size = sizeof(binary_limine_hdd_bin_data);
U64 *limine_stage2 = limine + 0x1A4;
CBlkDev *bd = Letter2BlkDev(drv_let);
CMasterBoot old_mbr, *new_mbr = limine;
U8 *limine = binary_limine_hdd_bin_data, *blks;
U16 limine_size = sizeof(binary_limine_hdd_bin_data);
U64 *limine_stage2;
CBlkDev *bd = Letter2BlkDev(drv_let);
CMasterBoot old_mbr, *new_mbr;

if (limine_size == 0)
{
"\n" ST_ERR_ST "Limine HDD MBR binary bytes not found. Must first #include it, then recompile this file.\n";
return FALSE;
}

if (limine_size - BLK_SIZE > LIMINE_MBR_GAP_BLKS * BLK_SIZE - LIMINE_STAGE2_LOC)
{
"\n" ST_ERR_ST "Limine HDD stage 2 does not fit in the post-MBR gap.\n";
return FALSE;
}

'\n';

*limine_stage2 = 0x200;
blks = MAlloc(LIMINE_MBR_GAP_BLKS * BLK_SIZE);
new_mbr = blks;
limine_stage2 = blks + 0x1A4; // where the Limine MBR code looks for stage 2

BlkDevLock(bd);
AHCIAtaBlksRead(bd, blks, 0, LIMINE_MBR_GAP_BLKS); // read old MBR and post-MBR gap currently on disk
BlkDevUnlock(bd);

AHCIAtaBlksRead(bd, &old_mbr, 0, 1); // read old MBR currently on disk
MemCopy(new_mbr->p, old_mbr.p, sizeof(CMasterBoot.p)); // copy old MBR partition table to new Limine MBR
if (!LimineMBRCheck(new_mbr))
{
Free(blks);
return FALSE;
}

// read the whole MBR + post-MBR-gap that Limine wants to overwrite, save all of that as an OldMBR.BIN
BootMHDOldRead(drv_let, drv_let, 63);
BootMHDOldRead(drv_let, drv_let, LIMINE_MBR_GAP_BLKS);

AHCIAtaBlksWrite(bd, limine, 0, 63); // write Limine to MBR and post-MBR gap
MemCopy(&old_mbr, blks, BLK_SIZE);
MemCopy(new_mbr, limine, BLK_SIZE);
MemCopy(blks + LIMINE_STAGE2_LOC, limine + BLK_SIZE, limine_size - BLK_SIZE);
*limine_stage2 = LIMINE_STAGE2_LOC;

MemCopy(new_mbr->code + 218, old_mbr.code + 218, 6); // keep the disk timestamp
new_mbr->media_id = old_mbr.media_id;
new_mbr->zero = old_mbr.zero;
MemCopy(new_mbr->p, old_mbr.p, sizeof(CMasterBoot.p)); // copy old MBR partition table to new Limine MBR

BlkDevLock(bd);
AHCIAtaBlksWrite(bd, blks, 0, 1); // write Limine to MBR
AHCIAtaBlksWrite(bd, blks + LIMINE_STAGE2_LOC, LIMINE_STAGE2_LOC / BLK_SIZE,
CeilU64(limine_size - BLK_SIZE, BLK_SIZE) / BLK_SIZE); // write stage 2 to post-MBR gap
BlkDevUnlock(bd);

Free(blks);

LimineCFGMake(drv_let);

"\nLimine BSD2-licensed HDD MBR Boot Loader installed.\n\n";
Expand Down
23 changes: 18 additions & 5 deletions zealbooter/GNUmakefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# Nuke built-in rules.
.SUFFIXES:

# Delete the target of a failed recipe.
.DELETE_ON_ERROR:

# This is the name that our final executable will have.
# Change as needed.
override OUTPUT := kernel
Expand Down Expand Up @@ -82,9 +85,10 @@ override CPPFLAGS := \
-MP

# Internal nasm flags that should not be changed by the user.
override NASMFLAGS += \
override NASMFLAGS := \
-f elf64 \
$(patsubst -g,-g -F dwarf,$(NASMFLAGS)) \
-i src/ \
-Wall

# Internal linker flags that should not be changed by the user.
Expand All @@ -93,17 +97,26 @@ override LDFLAGS += \
-nostdlib \
-static \
-z max-page-size=0x1000 \
-z noexecstack \
--gc-sections \
-T linker.ld

# Check if the linker supports -no-pie and enable it if it does.
override LD_HAS_NO_PIE := $(shell ! $(LD) --help 2>/dev/null | grep -qE '(^|[[:space:]])--?no-pie([[:space:]]|$$)'; echo $$?)

ifeq ($(LD_HAS_NO_PIE),1)
override LDFLAGS += \
-no-pie
endif

# Use "find" to glob all *.c, *.S, and *.asm files in the tree and obtain the
# object and header dependency file names.
override SRCFILES := $(shell find -L src -type f 2>/dev/null | LC_ALL=C sort)
override CFILES := $(filter %.c,$(SRCFILES))
override ASFILES := $(filter %.S,$(SRCFILES))
override NASMFILES := $(filter %.asm,$(SRCFILES))
override OBJ := $(addprefix obj/,$(CFILES:.c=.c.o) $(ASFILES:.S=.S.o) $(NASMFILES:.asm=.asm.o))
override HEADER_DEPS := $(addprefix obj/,$(CFILES:.c=.c.d) $(ASFILES:.S=.S.d))
override HEADER_DEPS := $(addprefix obj/,$(CFILES:.c=.c.d) $(ASFILES:.S=.S.d) $(NASMFILES:.asm=.asm.d))

# Default target. This must come first, before header dependencies.
.PHONY: all
Expand All @@ -113,7 +126,7 @@ all: bin/$(OUTPUT)
-include $(HEADER_DEPS)

src/limine.h:
curl -Lo $@ https://github.com/limine-bootloader/limine-protocol/raw/c4616df2572d77c60020bdefa617dd9bdcc6566a/include/limine.h || cp ../build/limine/limine.h src/limine.h || echo "ERROR"
curl -fL -o $@ https://github.com/Limine-Bootloader/limine-protocol/raw/da65184e91f80fcb397270121b1e2515a11e01ee/include/limine.h

# Link rules for the final executable.
bin/$(OUTPUT): GNUmakefile linker.ld $(OBJ)
Expand All @@ -133,7 +146,7 @@ obj/%.S.o: %.S GNUmakefile src/limine.h
# Compilation rules for *.asm (nasm) files.
obj/%.asm.o: %.asm GNUmakefile
mkdir -p "$(dir $@)"
nasm $(NASMFLAGS) $< -o $@
nasm $(NASMFLAGS) -MD $(@:.o=.d) -MP $< -o $@

# Remove object files and the final executable.
.PHONY: clean
Expand All @@ -143,4 +156,4 @@ clean:
# Remove everything built and generated including downloaded dependencies.
.PHONY: distclean
distclean: clean
rm -f src/limine.h
rm -rf .cache compile_commands.json src/limine.h
10 changes: 1 addition & 9 deletions zealbooter/src/lib.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,7 @@
#define __LIB_H__

#include <stdint.h>
#include <memcpy.h>
#include <memset.h>
#include <memmove.h>
#include <memcmp.h>
#include <strcpy.h>
#include <strncpy.h>
#include <strcmp.h>
#include <strncmp.h>
#include <strlen.h>
#include <memory.h>
#include <print.h>

uint64_t div_roundup_u64(uint64_t a, uint64_t b);
Expand Down
26 changes: 0 additions & 26 deletions zealbooter/src/lib/memcmp.c

This file was deleted.

6 changes: 0 additions & 6 deletions zealbooter/src/lib/memcmp.h

This file was deleted.

21 changes: 0 additions & 21 deletions zealbooter/src/lib/memcpy.c

This file was deleted.

Loading
Loading