# Building TARGET := riscv64gc-unknown-none-elf MODE := release KERNEL_ELF := target/$(TARGET)/$(MODE)/os KERNEL_BIN := $(KERNEL_ELF).bin DISASM_TMP := target/$(TARGET)/$(MODE)/asm FS_IMG := ../user/target/$(TARGET)/$(MODE)/fs.img APPS := ../user/src/bin/* # BOARD BOARD := qemu SBI ?= rustsbi BOOTLOADER := ../bootloader/$(SBI)-$(BOARD).bin # GUI GUI ?= off ifeq ($(GUI), off) GUI_OPTION := -display none endif # Building mode argument ifeq ($(MODE), release) MODE_ARG := --release endif # KERNEL ENTRY KERNEL_ENTRY_PA := 0x80200000 # Binutils OBJDUMP := rust-objdump --arch-name=riscv64 OBJCOPY := rust-objcopy --binary-architecture=riscv64 # Disassembly DISASM ?= -x # Run usertests or usershell TEST ?= build: env $(KERNEL_BIN) fs-img env: (rustup target list | grep "riscv64gc-unknown-none-elf (installed)") || rustup target add $(TARGET) cargo install cargo-binutils rustup component add rust-src rustup component add llvm-tools-preview $(KERNEL_BIN): kernel @$(OBJCOPY) $(KERNEL_ELF) --strip-all -O binary $@ fs-img: $(APPS) @cd ../user && make build TEST=$(TEST) @rm -f $(FS_IMG) @cd ../easy-fs-fuse && cargo run --release -- -s ../user/src/bin/ -t ../user/target/riscv64gc-unknown-none-elf/release/ $(APPS): kernel: @echo Platform: $(BOARD) @cp src/linker-$(BOARD).ld src/linker.ld @cargo build --release @rm src/linker.ld clean: @cargo clean disasm: kernel @$(OBJDUMP) $(DISASM) $(KERNEL_ELF) | less disasm-vim: kernel @$(OBJDUMP) $(DISASM) $(KERNEL_ELF) > $(DISASM_TMP) @nvim $(DISASM_TMP) @rm $(DISASM_TMP) run: run-inner run-inner-none: build @qemu-system-riscv64 \ -M 128m \ -machine virt \ -bios none \ $(GUI_OPTION) \ -kernel $(KERNEL_ELF) \ -drive file=$(FS_IMG),if=none,format=raw,id=x0 \ -device virtio-blk-device,drive=x0 \ # -device virtio-gpu-device \ -device virtio-keyboard-device \ -device virtio-mouse-device \ -device virtio-net-device,netdev=net0 \ -netdev user,id=net0,hostfwd=udp::6200-:2000 \ -serial stdio run-inner: build @qemu-system-riscv64 \ -M 128m \ -machine virt \ -bios $(BOOTLOADER) \ $(GUI_OPTION) \ -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY_PA) \ -drive file=$(FS_IMG),if=none,format=raw,id=x0 \ -device virtio-blk-device,drive=x0 \ -device virtio-gpu-device \ -device virtio-keyboard-device \ -device virtio-mouse-device \ -device virtio-net-device,netdev=net0 \ -netdev user,id=net0,hostfwd=udp::6200-:2000 \ -serial stdio fdt: @qemu-system-riscv64 -M 128m -machine virt,dumpdtb=virt.out fdtdump virt.out debug: build @tmux new-session -d \ "qemu-system-riscv64 -machine virt -nographic -bios $(BOOTLOADER) -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY_PA) -s -S" && \ tmux split-window -h "riscv64-unknown-elf-gdb -ex 'file $(KERNEL_ELF)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234'" && \ tmux -2 attach-session -d gdbserver: build @qemu-system-riscv64 -machine virt -nographic -bios $(BOOTLOADER) -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY_PA) -s -S gdbclient: @riscv64-unknown-elf-gdb -ex 'file $(KERNEL_ELF)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234' .PHONY: build env kernel clean disasm disasm-vim run-inner fs-img gdbserver gdbclient fdt