From d79436a1170e4d5ffde77416313587f320c8e590 Mon Sep 17 00:00:00 2001 From: Miquel Sabaté Solà Date: Mon, 18 Nov 2024 15:56:37 +0100 Subject: usr: Bootstrap the initramfs for the kernel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce a sample `foo` program which already calls the `write_and_block` system call which is yet to be implemented by this kernel. Moreover, the same CPIO format is used for the initramfs as with Linux, so we can pass it with QEMU without worries. Signed-off-by: Miquel Sabaté Solà --- Makefile | 49 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) (limited to 'Makefile') diff --git a/Makefile b/Makefile index df82342..6799281 100644 --- a/Makefile +++ b/Makefile @@ -18,15 +18,19 @@ endif # no `-mcpu`, no `-mtune`, no funny business. CC = $(CROSS_COMPILE)gcc$(CC_SUFFIX) +AS = $(CROSS_COMPILE)as$(CC_SUFFIX) LD = $(CROSS_COMPILE)ld QEMU ?= qemu-system-riscv64 ISA ?= rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb -CCFLAGS = -march=$(ISA) -Iinclude/ -mabi=lp64d +ASFLAGS = -march=$(ISA) -mabi=lp64d +CCFLAGS = $(ASFLAGS) -Iinclude/ CCFLAGS += -Werror -Wpedantic -Wall -Wextra -Wcast-align -Wcast-qual -Winit-self \ -Wmissing-include-dirs -Wredundant-decls -Wshadow -Wsign-conversion \ - -Wswitch-default -Wundef -Wunreachable-code -Wmissing-noreturn -LDFLAGS = -Iinclude/ -static -nostdlib -melf64lriscv -z noexecstack + -Wswitch-default -Wundef -Wunreachable-code -Wmissing-noreturn \ + -nostdinc -nostdlib -std=gnu17 +LDFLAGS = -Iinclude/ -static -melf64lriscv -z noexecstack +USRFLAGS = -static -melf64lriscv ## # Optional parameters for QEMU and gdb. @@ -42,26 +46,29 @@ GDB_EXTRA_FLAGS ?= DEBUG = ifeq ($(strip $(DEBUG)),) CCFLAGS += -O3 + QEMU_FLAGS += -nographic else CCFLAGS += -g QEMU_FLAGS += -s -S endif ## -# Paths. +# Paths SRC = $(wildcard kernel/head.S kernel/*.c) OBJ = $(patsubst %.c,%.o,$(patsubst %.S,%.o,$(SRC))) LINKER = kernel/fbos.ld KRNL = fbos +USR = usr/bin/foo +INIT = usr/initramfs.cpio LDFLAGS += -T $(LINKER) ## -# Targets +# Kernel .PHONY: all -all: clean $(KRNL) +all: clean $(KRNL) usr .PHONY: $(KRNL) $(KRNL): $(OBJ) $(LINKER).S @@ -78,12 +85,34 @@ $(KRNL): $(OBJ) $(LINKER).S $(E) " CC " $(*F) $(Q) $(CC) $(CCFLAGS) -c $< -o $@ +## +# User space + +.PHONY: usr +usr: $(USR) + $(E) " CPIO " $(INIT) + $(Q) find usr/bin/ -type f -executable | cpio -o --quiet -H newc > $(INIT) + +usr/src/%.o: usr/src/%.S + $(E) " AS " $(basename $@) + $(Q) $(AS) $(ASFLAGS) -c $< -o $@ + +usr/bin/%: usr/src/%.o + $(E) " LD " $@ + $(Q) $(LD) $(USRFLAGS) $< -o $@ + +# HACK: do not remove object files from usr/src/. +.SECONDARY: + +## +# Hacking + .PHONY: qemu -qemu: $(KRNL) +qemu: $(KRNL) usr ifeq ($(strip $(QEMU_BIOS)),) - $(Q) $(QEMU) $(QEMU_FLAGS) -machine virt -kernel $(KRNL) -nographic + $(Q) $(QEMU) $(QEMU_FLAGS) -machine virt -kernel $(KRNL) -initrd $(INIT) else - $(Q) $(QEMU) $(QEMU_FLAGS) -machine virt -bios $(QEMU_BIOS) -kernel $(KRNL) -nographic + $(Q) $(QEMU) $(QEMU_FLAGS) -machine virt -bios $(QEMU_BIOS) -kernel $(KRNL) -initrd $(INIT) endif .PHONY: gdb @@ -92,7 +121,7 @@ gdb: .PHONY: clean clean: - $(Q) rm -f $(OBJ) $(KRNL) $(LINKER) + $(Q) rm -f $(OBJ) $(KRNL) $(LINKER) $(USR) usr/src/*.o $(INIT) .PHONY: lint lint: -- cgit v1.2.3