# Building
TARGET := riscv64gc-unknown-none-elf
MODE := release
KERNEL_ELF := target/$( TARGET) /$( MODE) /os
KERNEL_BIN := $( KERNEL_ELF) .bin
KERNEL_ENTRY_PA := 0x80020000
DISASM_TMP := target/$( TARGET) /$( MODE) /asm
FS_IMG := ../user/target/$( TARGET) /$( MODE) /fs.img
SDCARD := /dev/sdb
# BOARD
BOARD ?= qemu
SBI ?= rustsbi
BOOTLOADER := ../bootloader/$( SBI) -$( BOARD) .bin
# Run K210
K210-SERIALPORT = /dev/ttyUSB0
K210-BURNER = ../tools/kflash.py
# Binutils
OBJDUMP := rust-objdump --arch-name= riscv64
OBJCOPY := rust-objcopy --binary-architecture= riscv64
# Disassembly
DISASM ?= -x
build : $( KERNEL_BIN ) $( FS_IMG )
sdcard : $( FS_IMG )
@sudo dd if = /dev/zero of = $( SDCARD) bs = 1M count = 16
@sudo dd if = $( FS_IMG) of = $( SDCARD)
$(KERNEL_BIN) : kernel
@$( OBJCOPY) $( KERNEL_ELF) --strip-all -O binary $@
$(FS_IMG) :
@echo "hello, world!"
@cd ../easy-fs && cargo run --release
kernel :
@cd ../user && make build
@cargo build --release --features " board_ $( BOARD) "
clean :
@cargo clean
disasm : kernel
@$( OBJDUMP) $( DISASM) $( KERNEL_ELF) | less
disasm-vim : kernel
@$( OBJDUMP) $( DISASM) $( KERNEL_ELF) > $( DISASM_TMP)
@vim $( DISASM_TMP)
@rm $( DISASM_TMP)
run : run -inner
run-inner : build
i f e q ( $( BOARD ) , q e m u )
@qemu-system-riscv64 \
-machine virt \
-nographic \
-bios $( BOOTLOADER) \
-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,bus= virtio-mmio-bus.0
e l s e
@cp $( BOOTLOADER) $( BOOTLOADER) .copy
@dd if = $( KERNEL_BIN) of = $( BOOTLOADER) .copy bs = 128K seek = 1
@mv $( BOOTLOADER) .copy $( KERNEL_BIN)
@sudo chmod 777 $( K210-SERIALPORT)
python3 $( K210-BURNER) -p $( K210-SERIALPORT) -b 1500000 $( KERNEL_BIN)
miniterm --eol LF --dtr 0 --rts 0 --filter direct $( K210-SERIALPORT) 115200
e n d i f
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
.PHONY : build kernel clean disasm disasm -vim run -inner