misc: Initial Makefile rework

This commit is contained in:
mintsuki 2021-03-08 00:50:23 +01:00
parent 62b042a2fe
commit a8626d6fdd
9 changed files with 115 additions and 84 deletions

View File

@ -3,13 +3,12 @@ OBJCOPY = objcopy
CFLAGS = -O2 -pipe -Wall -Wextra
PREFIX = /usr/local
DESTDIR =
TARGET = bios
PATH := $(shell pwd)/toolchain/bin:$(PATH)
.PHONY: all clean install tinf-clean bootloader bootloader-clean distclean stage23 stage23-clean decompressor decompressor-clean toolchain test.hdd echfs-test ext2-test fat32-test iso9660-test
.PHONY: all clean install distclean limine-bios limine-uefi limine-bios-clean limine-uefi-clean stage23-bios stage23-bios-clean stage23-uefi stage23-uefi-clean decompressor decompressor-clean toolchain test.hdd echfs-test ext2-test fat32-test iso9660-test
all: bin/limine-install
all: limine-uefi | limine-bios bin/limine-install
bin/limine-install: limine-install.c limine-hdd.o
$(CC) $(CFLAGS) -std=c11 limine-hdd.o limine-install.c -o $@
@ -17,51 +16,56 @@ bin/limine-install: limine-install.c limine-hdd.o
limine-hdd.o: bin/limine-hdd.bin
$(OBJCOPY) -B i8086 -I binary -O default bin/limine-hdd.bin $@
clean:
clean: limine-bios-clean limine-uefi-clean
rm -f limine-hdd.o
install: all
install -d $(DESTDIR)$(PREFIX)/bin
install -s limine-install $(DESTDIR)$(PREFIX)/bin/
install -s bin/limine-install $(DESTDIR)$(PREFIX)/bin/
install -d $(DESTDIR)$(PREFIX)/share
install -m 644 bin/limine.sys $(DESTDIR)$(PREFIX)/share/
install -m 644 bin/limine-cd.bin $(DESTDIR)$(PREFIX)/share/
install -m 644 bin/limine-pxe.bin $(DESTDIR)$(PREFIX)/share/
install -m 644 bin/BOOTX64.EFI $(DESTDIR)$(PREFIX)/share/
ifeq ($(TARGET), bios)
bootloader: | decompressor stage23
limine-bios: stage23-bios decompressor
mkdir -p bin
cd stage1/hdd && nasm bootsect.asm -fbin -o ../../bin/limine-hdd.bin
cd stage1/cd && nasm bootsect.asm -fbin -o ../../bin/limine-cd.bin
cd stage1/pxe && nasm bootsect.asm -fbin -o ../../bin/limine-pxe.bin
cp stage23/limine.sys ./bin/
else ifeq ($(TARGET), uefi)
bootloader: | gnu-efi stage23
cp build/stage23-bios/limine.sys ./bin/
limine-uefi: | gnu-efi stage23-uefi
mkdir -p bin
cp stage23/BOOTX64.EFI ./bin/
endif
cp build/stage23-uefi/BOOTX64.EFI ./bin/
bootloader-clean: stage23-clean decompressor-clean
limine-bios-clean: stage23-bios-clean decompressor-clean
distclean: clean bootloader-clean test-clean
rm -rf bin stivale toolchain ovmf gnu-efi
limine-uefi-clean: stage23-uefi-clean
distclean: clean test-clean
rm -rf bin build stivale toolchain ovmf gnu-efi
stivale:
git clone https://github.com/stivale/stivale.git
stage23: stivale
cd tinf && rm -rf *.o *.d
$(MAKE) -C stage23 all TARGET=$(TARGET)
stage23-uefi: stivale
$(MAKE) -C stage23 all TARGET=uefi BUILDDIR="`pwd`/build/stage23-uefi"
stage23-clean:
$(MAKE) -C stage23 clean
stage23-uefi-clean:
$(MAKE) -C stage23 clean TARGET=uefi BUILDDIR="`pwd`/build/stage23-uefi"
stage23-bios: stivale
$(MAKE) -C stage23 all TARGET=bios BUILDDIR="`pwd`/build/stage23-bios"
stage23-bios-clean:
$(MAKE) -C stage23 clean TARGET=bios BUILDDIR="`pwd`/build/stage23-bios"
decompressor:
cd tinf && rm -rf *.o *.d
$(MAKE) -C decompressor all
$(MAKE) -C decompressor all BUILDDIR="`pwd`/build/decompressor"
decompressor-clean:
$(MAKE) -C decompressor clean
$(MAKE) -C decompressor clean BUILDDIR="`pwd`/build/decompressor"
test-clean:
$(MAKE) -C test clean

View File

@ -1,6 +1,7 @@
CC = i386-elf-gcc
LD = i386-elf-gcc
OBJCOPY = i386-elf-objcopy
BUILDDIR = .
CFLAGS = -flto -Os -pipe -Wall -Wextra -Werror
@ -12,11 +13,7 @@ INTERNAL_CFLAGS = \
-fomit-frame-pointer \
-Wno-address-of-packed-member \
-masm=intel \
-mno-80387 \
-mno-mmx \
-mno-3dnow \
-mno-sse \
-mno-sse2 \
-mgeneral-regs-only \
-MMD \
-I.
@ -35,22 +32,25 @@ INTERNAL_LDFLAGS = \
C_FILES := $(shell find -L ./ -type f -name '*.c' | sort)
ASM_FILES := $(shell find -L ./ -type f -name '*.asm' | sort)
OBJ := $(ASM_FILES:.asm=.o) $(C_FILES:.c=.o)
HEADER_DEPS := $(C_FILES:.c=.d)
OBJ := $(addprefix $(BUILDDIR)/, $(ASM_FILES:.asm=.o) $(C_FILES:.c=.o))
HEADER_DEPS := $(addprefix $(BUILDDIR)/, $(C_FILES:.c=.d))
all: decompressor.bin
all: | builddir $(BUILDDIR)/decompressor.bin
decompressor.bin: $(OBJ)
$(LD) $(OBJ) $(LDFLAGS) $(INTERNAL_LDFLAGS) -o decompressor.elf
$(OBJCOPY) -O binary decompressor.elf decompressor.bin
builddir:
for i in $(OBJ); do mkdir -p `dirname $$i`; done
$(BUILDDIR)/decompressor.bin: $(OBJ)
$(LD) $(OBJ) $(LDFLAGS) $(INTERNAL_LDFLAGS) -o $(BUILDDIR)/decompressor.elf
$(OBJCOPY) -O binary $(BUILDDIR)/decompressor.elf $@
-include $(HEADER_DEPS)
%.o: %.c
$(addprefix $(BUILDDIR)/, %.o): %.c
$(CC) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
%.o: %.asm
$(addprefix $(BUILDDIR)/, %.o): %.asm
nasm $< -f elf32 -o $@
clean:
rm -f decompressor.bin decompressor.elf $(OBJ) $(HEADER_DEPS)
rm -rf $(BUILDDIR)

View File

@ -103,12 +103,12 @@ pmode:
; Align stage2 to 2K ON DISK
ALIGN2K
DEC_LBA_OFFSET equ ($-$$)/2048
incbin '../../decompressor/decompressor.bin'
incbin '../../build/decompressor/decompressor.bin'
ALIGN2K
STAGE2_START equ $-$$
STAGE2_LBA_OFFSET equ STAGE2_START/2048
DEC_LBA_COUNT equ STAGE2_LBA_OFFSET - DEC_LBA_OFFSET
incbin '../../stage23/stage2.bin.gz'
incbin '../../build/stage23-bios/stage2.bin.gz'
STAGE2_SIZE equ ($-$$) - STAGE2_START
STAGE2_LBA_COUNT equ (2047 + $-$$)/2048

View File

@ -126,9 +126,9 @@ dw 0xaa55
; ********************* Stage 2 *********************
decompressor:
incbin '../../decompressor/decompressor.bin'
incbin '../../build/decompressor/decompressor.bin'
align 16
stage2:
incbin '../../stage23/stage2.bin.gz'
incbin '../../build/stage23-bios/stage2.bin.gz'
.size: equ $ - stage2

View File

@ -55,10 +55,10 @@ err:
; ********************* Stage 2 *********************
decompressor:
incbin '../../decompressor/decompressor.bin'
incbin '../../build/decompressor/decompressor.bin'
align 16
stage2:
incbin '../../stage23/stage2.bin.gz'
incbin '../../build/stage23-bios/stage2.bin.gz'
.size: equ $ - stage2
.fullsize: equ $ - decompressor

View File

@ -1,4 +1,5 @@
TARGET = bios
BUILDDIR = .
ifeq ($(TARGET), bios)
TOOLCHAIN=i386-elf
@ -72,7 +73,7 @@ ifeq ($(TARGET), bios)
-static-libgcc
endif
.PHONY: all clean
.PHONY: all clean builddir
C_FILES := $(shell find -L ./ -type f -name '*.c' | sort)
ifeq ($(TARGET), bios)
@ -81,84 +82,101 @@ endif
ifeq ($(TARGET), uefi)
ASM_FILES := lib/do_32.asm
endif
OBJ := $(ASM_FILES:.asm=.o) $(C_FILES:.c=.o)
HEADER_DEPS := $(C_FILES:.c=.d)
OBJ := $(addprefix $(BUILDDIR)/, $(ASM_FILES:.asm=.o) $(C_FILES:.c=.o))
HEADER_DEPS := $(addprefix $(BUILDDIR)/, $(C_FILES:.c=.d))
ifeq ($(TARGET), bios)
all: limine_dbg.elf limine.sys stage2.bin stage2.bin.gz
all: | builddir everything
.PHONY: everything
everything: $(BUILDDIR)/limine_dbg.elf $(BUILDDIR)/limine.sys $(BUILDDIR)/stage2.bin $(BUILDDIR)/stage2.bin.gz
else ifeq ($(TARGET), uefi)
all: BOOTX64.EFI
all: | builddir $(BUILDDIR)/BOOTX64.EFI
endif
BOOTX64.EFI: limine_efi.elf
$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .rel.* -j .rela.* -j .reloc --target efi-app-x86_64 --subsystem=10 limine_efi.elf $@
builddir:
for i in $(OBJ); do mkdir -p `dirname $$i`; done
stage2.bin.gz: stage2.bin
gzip -n -9 < stage2.bin > stage2.bin.gz
$(BUILDDIR)/sys/smp_trampoline.bin: sys/smp_trampoline.real
nasm $< -f bin -o $@
stage2.bin: limine.sys
dd if=limine.sys bs=$$(( 0x$$($(READELF) -S limine.elf | grep .stage3.text | sed 's/^.*] //' | awk '{print $$3}' | sed 's/^0*//') - 0x8000 )) count=1 of=$@
$(BUILDDIR)/sys/smp_trampoline.o: $(BUILDDIR)/sys/smp_trampoline.bin
cd "`dirname $<`" && \
$(OBJCOPY) -B i8086 -I binary -O default "`basename $<`" $@
limine.map.o: limine_nomap.elf
./gensyms.sh $(OBJDUMP) limine_nomap.elf limine
$(BUILDDIR)/font.o: font.bin
cd "`dirname $<`" && \
$(OBJCOPY) -B i8086 -I binary -O default "`basename $<`" $@
limine.sys: limine.elf
ifeq ($(TARGET), bios)
$(BUILDDIR)/stage2.bin.gz: $(BUILDDIR)/stage2.bin
gzip -n -9 < $< > $@
$(BUILDDIR)/stage2.bin: $(BUILDDIR)/limine.sys
dd if=$< bs=$$(( 0x$$($(READELF) -S $(BUILDDIR)/limine.elf | grep .stage3.text | sed 's/^.*] //' | awk '{print $$3}' | sed 's/^0*//') - 0x8000 )) count=1 of=$@
$(BUILDDIR)/limine.map.o: $(BUILDDIR)/limine_nomap.elf
GENSYMS="`pwd`/gensyms.sh" && \
cd "`dirname $<`" && \
"$$GENSYMS" $(OBJDUMP) $< limine
$(BUILDDIR)/limine.sys: $(BUILDDIR)/limine.elf
$(OBJCOPY) -O binary $< $@
limine_nomap.elf: $(OBJ) font.o sys/smp_trampoline.o
$(CC) $(OBJ) font.o sys/smp_trampoline.o $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_nomap.ld -o $@
$(CC) $(OBJ) font.o sys/smp_trampoline.o $(LDFLAGS) $(INTERNAL_LDFLAGS) -Wl,--gc-sections -Tlinker_stage2only.ld -o limine_stage2only.elf || \
$(BUILDDIR)/limine_nomap.elf: $(OBJ) $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o
$(CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_nomap.ld -o $@
$(CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Wl,--gc-sections -Tlinker_stage2only.ld -o limine_stage2only.elf || \
( echo "This error means that stage 2 was trying to use stage 3 symbols before loading stage 3" && \
false )
limine_dbg.elf: $(OBJ) font.o sys/smp_trampoline.o
$(CC) $(OBJ) font.o sys/smp_trampoline.o $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_dbg.ld -o $@
$(BUILDDIR)/limine.elf: $(OBJ) $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o $(BUILDDIR)/limine.map.o
$(CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker.ld -o $@
sys/smp_trampoline.o: sys/smp_trampoline.bin
$(OBJCOPY) -B i8086 -I binary -O default sys/smp_trampoline.bin $@
$(BUILDDIR)/limine_dbg.elf: $(OBJ) $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o
$(CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_dbg.ld -o $@
sys/smp_trampoline.bin: sys/smp_trampoline.real
nasm $< -f bin -o $@
endif
font.o: font.bin
$(OBJCOPY) -B i8086 -I binary -O default font.bin $@
ifeq ($(TARGET), uefi)
limine.elf: $(OBJ) font.o sys/smp_trampoline.o limine.map.o
$(CC) $(OBJ) font.o sys/smp_trampoline.o limine.map.o $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker.ld -o $@
$(BUILDDIR)/BOOTX64.EFI: $(BUILDDIR)/limine_efi.elf
$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .rel.* -j .rela.* -j .reloc --target efi-app-x86_64 --subsystem=10 $< $@
limine_efi.elf: $(OBJ) font.o sys/smp_trampoline.o
$(BUILDDIR)/limine_efi.elf: $(OBJ) $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o
$(LD) -shared -Bsymbolic \
-T../gnu-efi/gnuefi/elf_x86_64_efi.lds \
../gnu-efi/gnuefi/crt0-efi-x86_64.o \
../gnu-efi/gnuefi/libgnuefi.a \
../gnu-efi/lib/x86_64/efi_stub.o \
$(OBJ) font.o sys/smp_trampoline.o -o $@
$^ -o $@
endif
-include $(HEADER_DEPS)
%.o: %.c
$(addprefix $(BUILDDIR)/, %.o): %.c
$(CC) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
ifeq ($(TARGET), bios)
%.s2.o: %.s2.c
$(addprefix $(BUILDDIR)/, %.s2.o): %.s2.c
$(CC) $(S2CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
endif
ifeq ($(TARGET), uefi)
%.32.o: %.32.c
$(addprefix $(BUILDDIR)/, %.32.o): %.32.c
$(CC32) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@.32
$(OBJCOPY) -I elf32-i386 -O elf64-x86-64 $@.32 $@
rm $@.32
endif
ifeq ($(TARGET), bios)
%.o: %.asm
$(addprefix $(BUILDDIR)/, %.o): %.asm
nasm $< -F dwarf -g -f elf32 -o $@
endif
ifeq ($(TARGET), uefi)
%.o: %.asm
$(addprefix $(BUILDDIR)/, %.o): %.asm
nasm $< -F dwarf -g -f elf64 -o $@
endif
clean:
rm -f limine.elf limine_efi.elf limine_dbg.elf limine_nomap.elf limine_stage2only.elf font.o limine.map.o limine.sys stage2.bin stage2.bin.gz BOOTX64.EFI sys/smp_trampoline.bin sys/smp_trampoline.o $(OBJ) $(HEADER_DEPS)
rm -rf $(BUILDDIR)

View File

@ -5,7 +5,13 @@
struct gdtr {
uint16_t limit;
#if defined (uefi)
uint64_t ptr;
#endif
#if defined (bios)
uint32_t ptr;
uint32_t pad;
#endif
} __attribute__((packed));
struct gdt_desc {

View File

@ -61,5 +61,8 @@ static struct gdt_desc gdt_descs[] = {
struct gdtr gdt = {
sizeof(gdt_descs) - 1,
(uintptr_t)gdt_descs
(uintptr_t)gdt_descs,
#if defined (bios)
0
#endif
};

View File

@ -45,8 +45,8 @@ static void delay(uint32_t cycles) {
inb(0x80);
}
extern symbol _binary_sys_smp_trampoline_bin_start;
extern symbol _binary_sys_smp_trampoline_bin_end;
extern symbol _binary_smp_trampoline_bin_start;
extern symbol _binary_smp_trampoline_bin_end;
struct trampoline_passed_info {
uint8_t smp_tpl_booted_flag;
@ -62,15 +62,15 @@ static bool smp_start_ap(uint32_t lapic_id, struct gdtr *gdtr,
struct smp_information *info_struct,
bool longmode, bool lv5, uint32_t pagemap,
bool x2apic) {
size_t trampoline_size = (size_t)_binary_sys_smp_trampoline_bin_end
- (size_t)_binary_sys_smp_trampoline_bin_start;
size_t trampoline_size = (size_t)_binary_smp_trampoline_bin_end
- (size_t)_binary_smp_trampoline_bin_start;
// Prepare the trampoline
static void *trampoline = NULL;
if (trampoline == NULL) {
trampoline = conv_mem_alloc_aligned(trampoline_size, 4096);
memcpy(trampoline, _binary_sys_smp_trampoline_bin_start, trampoline_size);
memcpy(trampoline, _binary_smp_trampoline_bin_start, trampoline_size);
}
static struct trampoline_passed_info *passed_info = NULL;