:: commit 37701de02b50c2c6b927a64ab734399c507d0252

Mintsuki <mintsuki@protonmail.com> — 2026-04-14 21:50

parents: 18f08ed399

build: Simplify BIOS stage1 decompressor build system

It is now a single assembly file so it can be simplified.
diff --git a/.gitignore b/.gitignore
index 73732055..81f17d2e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,7 +31,6 @@
 /common/lib/stb_image.h
 /common/cc-runtime.s2.c
 /cc-runtime
-/decompressor/cc-runtime.c
 /libfdt
 /edk2-ovmf
 /bochsout.txt
@@ -55,6 +54,7 @@
 /common-uefi-riscv64
 /common-uefi-loongarch64
 /decompressor-build
+/tools-build
 /stage1.stamp
 
 
diff --git a/GNUmakefile.in b/GNUmakefile.in
index 7a075b07..fd0c24aa 100644
--- a/GNUmakefile.in
+++ b/GNUmakefile.in
@@ -124,7 +124,7 @@ limine:
 	$(MAKE) '$(call SHESCAPE,$(BINDIR))/limine'
 
 .PHONY: clean
-clean: limine-bios-clean limine-uefi-ia32-clean limine-uefi-x86-64-clean limine-uefi-aarch64-clean limine-uefi-riscv64-clean limine-uefi-loongarch64-clean
+clean: tools-clean limine-bios-clean limine-uefi-ia32-clean limine-uefi-x86-64-clean limine-uefi-aarch64-clean limine-uefi-riscv64-clean limine-uefi-loongarch64-clean
 	rm -rf '$(call SHESCAPE,$(BINDIR))' '$(call SHESCAPE,$(BUILDDIR))/stage1.stamp'
 
 .PHONY: install
@@ -187,7 +187,9 @@ uninstall:
 	rm -f '$(call SHESCAPE,$(DESTDIR)$(bindir))/limine'
 	rm -rf '$(call SHESCAPE,$(DESTDIR)$(datarootdir))/limine'
 
-$(call MKESCAPE,$(BUILDDIR))/stage1.stamp: $(STAGE1_FILES) $(call MKESCAPE,$(BUILDDIR))/decompressor-build/decompressor.bin $(call MKESCAPE,$(BUILDDIR))/common-bios/stage2.bin.limlz
+$(call MKESCAPE,$(BUILDDIR))/stage1.stamp: $(STAGE1_FILES) $(call MKESCAPE,$(BUILDDIR))/common-bios/stage2.bin.limlz
+	$(MKDIR_P) '$(call SHESCAPE,$(BUILDDIR))/decompressor-build'
+	cd '$(call SHESCAPE,$(SRCDIR))/stage1' && nasm decompressor.asm -Wall -w-unknown-warning -w-reloc $(WERROR_FLAG) -fbin -o '$(call SHESCAPE,$(BUILDDIR))/decompressor-build/decompressor.bin'
 	$(MKDIR_P) '$(call SHESCAPE,$(BINDIR))'
 	cd '$(call SHESCAPE,$(SRCDIR))/stage1/hdd' && nasm bootsect.asm -Wall -w-unknown-warning -w-reloc $(WERROR_FLAG) -fbin -DBUILDDIR="'"'$(call NASMESCAPE,$(BUILDDIR))'"'" -o '$(call SHESCAPE,$(BINDIR))/limine-bios-hdd.bin'
 ifneq ($(BUILD_BIOS_CD),no)
@@ -200,7 +202,7 @@ endif
 	touch '$(call SHESCAPE,$(BUILDDIR))/stage1.stamp'
 
 .PHONY: limine-bios
-limine-bios: common-bios decompressor
+limine-bios: common-bios
 	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/stage1.stamp'
 
 $(call MKESCAPE,$(BINDIR))/limine-uefi-cd.bin: $(if $(BUILD_UEFI_IA32),$(call MKESCAPE,$(BUILDDIR))/common-uefi-ia32/BOOTIA32.EFI) $(if $(BUILD_UEFI_X86_64),$(call MKESCAPE,$(BUILDDIR))/common-uefi-x86-64/BOOTX64.EFI) $(if $(BUILD_UEFI_AARCH64),$(call MKESCAPE,$(BUILDDIR))/common-uefi-aarch64/BOOTAA64.EFI) $(if $(BUILD_UEFI_RISCV64),$(call MKESCAPE,$(BUILDDIR))/common-uefi-riscv64/BOOTRISCV64.EFI) $(if $(BUILD_UEFI_LOONGARCH64),$(call MKESCAPE,$(BUILDDIR))/common-uefi-loongarch64/BOOTLOONGARCH64.EFI)
@@ -328,7 +330,7 @@ distclean: clean
 
 .PHONY: maintainer-clean
 maintainer-clean: distclean
-	cd '$(call SHESCAPE,$(SRCDIR))' && rm -rf flanterm common/lib/stb_image.h.nopatch common/lib/stb_image.h libfdt freestnd-c-hdrs cc-runtime common/cc-runtime.s2.c decompressor/cc-runtime.c limine-protocol picoefi configure timestamps build-aux *'~' autom4te.cache aclocal.m4 *.tar*
+	cd '$(call SHESCAPE,$(SRCDIR))' && rm -rf flanterm common/lib/stb_image.h.nopatch common/lib/stb_image.h libfdt freestnd-c-hdrs cc-runtime common/cc-runtime.s2.c limine-protocol picoefi configure timestamps build-aux *'~' autom4te.cache aclocal.m4 *.tar*
 
 .PHONY: common-uefi-x86-64
 common-uefi-x86-64:
@@ -381,27 +383,26 @@ common-uefi-ia32-clean:
 	rm -rf '$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32'
 
 .PHONY: common-bios
-common-bios: $(call MKESCAPE,$(BINDIR))/limlzpack
+common-bios: $(call MKESCAPE,$(BUILDDIR))/tools-build/limlzpack
 	$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' -f common.mk \
 		TARGET=bios \
 		BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-bios' \
-		LIMLZPACK='$(call SHESCAPE,$(BINDIR))/limlzpack'
+		LIMLZPACK='$(call SHESCAPE,$(BUILDDIR))/tools-build/limlzpack'
 
 .PHONY: common-bios-clean
 common-bios-clean:
 	rm -rf '$(call SHESCAPE,$(BUILDDIR))/common-bios'
 
-$(call MKESCAPE,$(BINDIR))/limlzpack: $(call MKESCAPE,$(SRCDIR))/tools/limlzpack.c
-	$(MKDIR_P) '$(call SHESCAPE,$(BINDIR))'
+$(call MKESCAPE,$(BUILDDIR))/tools-build/limlzpack: $(call MKESCAPE,$(SRCDIR))/tools/limlzpack.c
+	$(MKDIR_P) '$(call SHESCAPE,$(BUILDDIR))/tools-build'
 	$(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) -std=c99 -Wall -Wextra $(WERROR_FLAG) '$(call SHESCAPE,$<)' -o '$(call SHESCAPE,$@)'
 
-.PHONY: decompressor
-decompressor:
-	$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/decompressor' -f decompressor.mk \
-		BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/decompressor-build'
-
 .PHONY: decompressor-clean
 decompressor-clean:
 	rm -rf '$(call SHESCAPE,$(BUILDDIR))/decompressor-build'
 
+.PHONY: tools-clean
+tools-clean:
+	rm -rf '$(call SHESCAPE,$(BUILDDIR))/tools-build'
+
 -include test.mk
diff --git a/bootstrap b/bootstrap
index 591e6a0a..c15d6e8c 100755
--- a/bootstrap
+++ b/bootstrap
@@ -80,7 +80,6 @@ if ! test -f version; then
         cc-runtime \
         dae79833b57a01b9fd3e359ee31def69f5ae899b
     cp cc-runtime/src/cc-runtime.c common/cc-runtime.s2.c
-    cp cc-runtime/src/cc-runtime.c decompressor/cc-runtime.c
 
     clone_repo_commit \
         https://github.com/Limine-Bootloader/limine-protocol.git \
diff --git a/common/common.mk b/common/common.mk
index f44601ef..d56faf4a 100644
--- a/common/common.mk
+++ b/common/common.mk
@@ -324,7 +324,7 @@ endif
 
 ifeq ($(TARGET),bios)
 
-$(call MKESCAPE,$(BUILDDIR))/stage2.bin.limlz: $(call MKESCAPE,$(BUILDDIR))/stage2.bin $(LIMLZPACK)
+$(call MKESCAPE,$(BUILDDIR))/stage2.bin.limlz: $(call MKESCAPE,$(BUILDDIR))/stage2.bin
 	'$(call SHESCAPE,$(LIMLZPACK))' '$(call SHESCAPE,$<)' '$(call SHESCAPE,$@)'
 
 $(call MKESCAPE,$(BUILDDIR))/stage2.bin: $(call MKESCAPE,$(BUILDDIR))/limine-bios.sys
diff --git a/decompressor/decompressor.mk b/decompressor/decompressor.mk
deleted file mode 100644
index 1e6a3a43..00000000
--- a/decompressor/decompressor.mk
+++ /dev/null
@@ -1,83 +0,0 @@
-.SUFFIXES:
-
-override SPACE := $(subst ,, )
-
-override MKESCAPE = $(subst $(SPACE),\ ,$(1))
-override SHESCAPE = $(subst ','\'',$(1))
-override OBJESCAPE = $(subst .a ,.a' ',$(subst .o ,.o' ',$(call SHESCAPE,$(1))))
-
-override CC_FOR_TARGET_IS_CLANG := $(shell ! $(CC_FOR_TARGET) --version 2>/dev/null | $(GREP) -q '^Target: '; echo $$?)
-
-ifeq ($(CC_FOR_TARGET_IS_CLANG),1)
-    override CC_FOR_TARGET += \
-        -target i686-unknown-none-elf
-endif
-
-override CFLAGS_FOR_TARGET += \
-    -Os \
-    -Wall \
-    -Wextra \
-    -Wshadow \
-    -Wvla \
-    $(WERROR_FLAG) \
-    -std=gnu11 \
-    -nostdinc \
-    -ffreestanding \
-    -ffunction-sections \
-    -fdata-sections \
-    -fno-stack-protector \
-    -fno-stack-check \
-    -fomit-frame-pointer \
-    -fno-strict-aliasing \
-    -fno-lto \
-    -fno-PIC \
-    -m32 \
-    -march=i686 \
-    -mabi=sysv \
-    -mno-80387 \
-    -mno-mmx
-
-override CPPFLAGS_FOR_TARGET := \
-    -I . \
-    -isystem ../freestnd-c-hdrs/include \
-    $(CPPFLAGS_FOR_TARGET) \
-    -MMD \
-    -MP
-
-override LDFLAGS_FOR_TARGET += \
-    -m elf_i386 \
-    -nostdlib \
-    -z max-page-size=0x1000 \
-    --gc-sections \
-    -static \
-    -T linker.ld
-
-override NASMFLAGS_FOR_TARGET := \
-    -f elf32 \
-    $(patsubst -g,-g -F dwarf,$(NASMFLAGS_FOR_TARGET)) \
-    -Wall \
-    -w-unknown-warning \
-    -w-reloc \
-    $(WERROR_FLAG)
-
-override C_FILES := $(shell find . -type f -name '*.c' | LC_ALL=C sort)
-override ASM_FILES := $(shell find . -type f -name '*.asm' | LC_ALL=C sort)
-override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(ASM_FILES:.asm=.o) $(C_FILES:.c=.o))
-override HEADER_DEPS := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(C_FILES:.c=.d))
-
-.PHONY: all
-all: $(call MKESCAPE,$(BUILDDIR))/decompressor.bin
-
-$(call MKESCAPE,$(BUILDDIR))/decompressor.bin: $(OBJ)
-	$(LD_FOR_TARGET) $(LDFLAGS_FOR_TARGET) '$(call OBJESCAPE,$^)' -o '$(call SHESCAPE,$(BUILDDIR))/decompressor.elf'
-	$(OBJCOPY_FOR_TARGET) -O binary '$(call SHESCAPE,$(BUILDDIR))/decompressor.elf' '$(call SHESCAPE,$@)'
-
--include $(HEADER_DEPS)
-
-$(call MKESCAPE,$(BUILDDIR))/%.o: %.c
-	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	$(CC_FOR_TARGET) $(CFLAGS_FOR_TARGET) $(CPPFLAGS_FOR_TARGET) -c '$(call SHESCAPE,$<)' -o '$(call SHESCAPE,$@)'
-
-$(call MKESCAPE,$(BUILDDIR))/%.o: %.asm
-	$(MKDIR_P) "$$(dirname '$(call SHESCAPE,$@)')"
-	nasm '$(call SHESCAPE,$<)' $(NASMFLAGS_FOR_TARGET) -o '$(call SHESCAPE,$@)'
diff --git a/decompressor/linker.ld b/decompressor/linker.ld
deleted file mode 100644
index c6adcfac..00000000
--- a/decompressor/linker.ld
+++ /dev/null
@@ -1,39 +0,0 @@
-OUTPUT_FORMAT(elf32-i386)
-ENTRY(_start)
-
-PHDRS
-{
-    text  PT_LOAD    FLAGS(0x05);
-    rodata PT_LOAD   FLAGS(0x04);
-    data  PT_LOAD    FLAGS(0x06);
-}
-
-SECTIONS
-{
-    . = 0x70000;
-
-    .text : {
-        *(.entry)
-        *(.text .text.*)
-    } :text
-
-    .rodata : {
-        *(.rodata .rodata.*)
-    } :rodata
-
-    .data : {
-        *(.data .data.*)
-    } :data
-
-    .bss : {
-        bss_begin = .;
-        *(.bss .bss.*)
-        *(COMMON)
-        bss_end = .;
-    } :data
-
-    /DISCARD/ : {
-        *(.eh_frame*)
-        *(.note .note.*)
-    }
-}
diff --git a/decompressor/decompressor.asm b/stage1/decompressor.asm
similarity index 96%
rename from decompressor/decompressor.asm
rename to stage1/decompressor.asm
index 8082e47c..23448bc7 100644
--- a/decompressor/decompressor.asm
+++ b/stage1/decompressor.asm
@@ -22,10 +22,9 @@
 ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+org 0x70000
 bits 32
 
-section .entry progbits alloc exec nowrite align=16
-
 global _start
 _start:
     cld
@@ -131,9 +130,5 @@ _start:
     cli
     hlt
 
-section .rodata progbits alloc noexec nowrite align=1
-
 errmsg: db "limine integrity error"
 .len: equ $ - errmsg
-
-section .note.GNU-stack noalloc noexec nowrite progbits
tab: 248 wrap: offon