-
lifeisphy authored4a914e4b
# platform := k210
platform := qemu
mode := debug
# mode := release
K=kernel
U=xv6-user
T=target
OBJS =
ifeq ($(platform), k210)
OBJS += $K/entry_k210.o
else
OBJS += $K/entry_qemu.o
endif
OBJS += \
$K/printf.o \
$K/kalloc.o \
$K/intr.o \
$K/spinlock.o \
$K/string.o \
$K/main.o \
$K/vm.o \
$K/proc.o \
$K/swtch.o \
$K/trampoline.o \
$K/trap.o \
$K/syscall.o \
$K/sysproc.o \
$K/bio.o \
$K/sleeplock.o \
$K/file.o \
$K/pipe.o \
$K/exec.o \
$K/sysfile.o \
$K/kernelvec.o \
$K/timer.o \
$K/disk.o \
$K/fat32.o \
$K/plic.o \
$K/console.o \
$K/systime.o
ifeq ($(platform), k210)
OBJS += \
$K/spi.o \
$K/gpiohs.o \
$K/fpioa.o \
$K/utils.o \
$K/sdcard.o \
$K/dmac.o \
$K/sysctl.o \
else
OBJS += \
$K/virtio_disk.o \
#$K/uart.o \
endif
QEMU = qemu-system-riscv64
ifeq ($(platform), k210)
RUSTSBI = ./bootloader/SBI/sbi-k210
else
RUSTSBI = ./bootloader/SBI/sbi-qemu
endif
# TOOLPREFIX := riscv64-unknown-elf-
TOOLPREFIX := riscv64-linux-gnu-
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
CC = $(TOOLPREFIX)gcc
AS = $(TOOLPREFIX)gas
LD = $(TOOLPREFIX)ld
OBJCOPY = $(TOOLPREFIX)objcopy
OBJDUMP = $(TOOLPREFIX)objdump
CFLAGS = -Wall -Werror -O -fno-omit-frame-pointer -ggdb -g -gdwarf-2
CFLAGS += -MD
CFLAGS += -mcmodel=medany
CFLAGS += -ffreestanding -fno-common -nostdlib -mno-relax
CFLAGS += -I.
CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
ifeq ($(mode), debug)
CFLAGS += -DDEBUG
endif
ifeq ($(platform), qemu)
CFLAGS += -D QEMU
endif
LDFLAGS = -z max-page-size=4096
ifeq ($(platform), k210)
linker = ./linker/k210.ld
endif
ifeq ($(platform), qemu)
linker = ./linker/qemu.ld
endif
# Compile Kernel
$T/kernel: $(OBJS) $(linker) $U/initcode
if [ ! -d "./target" ]; then mkdir target; fi
$(LD) $(LDFLAGS) -T $(linker) -o $T/kernel $(OBJS)
$(OBJDUMP) -S $T/kernel > $T/kernel.asm
$(OBJDUMP) -t $T/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $T/kernel.sym
build: kernel/include/initcode.h $T/kernel userprogs
# Compile RustSBI
RUSTSBI:
ifeq ($(platform), k210)
cd ./bootloader/SBI/rustsbi-k210 && cargo build && cp ./target/riscv64gc-unknown-none-elf/debug/rustsbi-k210 ../sbi-k210
$(OBJDUMP) -S ./bootloader/SBI/sbi-k210 > $T/rustsbi-k210.asm
else
cd ./bootloader/SBI/rustsbi-qemu && cargo build && cp ./target/riscv64gc-unknown-none-elf/debug/rustsbi-qemu ../sbi-qemu
$(OBJDUMP) -S ./bootloader/SBI/sbi-qemu > $T/rustsbi-qemu.asm
endif
rustsbi-clean:
cd ./bootloader/SBI/rustsbi-k210 && cargo clean
cd ./bootloader/SBI/rustsbi-qemu && cargo clean
image = $T/kernel.bin
k210 = $T/k210.bin
k210-serialport := /dev/ttyUSB0
ifndef CPUS
CPUS := 2
endif
QEMUOPTS = -machine virt -kernel $T/kernel -m 32M -nographic
# use multi-core
QEMUOPTS += -smp $(CPUS)
# QEMUOPTS += -bios $(RUSTSBI)
# import virtual disk image
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
QEMUOPTS += -drive file=sdcard.img,if=none,format=raw,id=x0
QEMUOPTS += -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0
run: build
ifeq ($(platform), k210)
$(OBJCOPY) $T/kernel --strip-all -O binary $(image)
$(OBJCOPY) $(RUSTSBI) --strip-all -O binary $(k210)
dd if=$(image) of=$(k210) bs=128k seek=1
$(OBJDUMP) -D -b binary -m riscv $(k210) > $T/k210.asm
chmod 777 $(k210-serialport)
python3 ./tools/kflash.py -p $(k210-serialport) -b 1500000 -t $(k210)
else
$(QEMU) $(QEMUOPTS)
endif
$U/initcode: $U/initcode.S
$(CC) $(CFLAGS) -march=rv64g -nostdinc -I. -Ikernel -c $U/initcode.S -o $U/initcode.o
$(LD) $(LDFLAGS) -N -e start -Ttext 0 -o $U/initcode.out $U/initcode.o
$(OBJCOPY) -S -O binary $U/initcode.out $U/initcode
$(OBJDUMP) -S $U/initcode.o > $U/initcode.asm
tags: $(OBJS) _init
etags *.S *.c
ULIB = $U/ulib.o $U/usys.o $U/printf.o $U/umalloc.o
_%: %.o $(ULIB)
$(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $@ $^
$(OBJDUMP) -S $@ > $*.asm
$(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $*.sym
# 产生syscall文件
$U/usys.S : $U/usys.pl
perl $U/usys.pl > $U/usys.S
$U/usys.o : $U/usys.S
$(CC) $(CFLAGS) -c -o $U/usys.o $U/usys.S
$U/_forktest: $U/forktest.o $(ULIB)
# forktest has less library code linked in - needs to be small
# in order to be able to max out the proc table.
$(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $U/_forktest $U/forktest.o $U/ulib.o $U/usys.o
$(OBJDUMP) -S $U/_forktest > $U/forktest.asm
# Prevent deletion of intermediate files, e.g. cat.o, after first build, so
# that disk image changes after first build are persistent until clean. More
# details:
# http://www.gnu.org/software/make/manual/html_node/Chained-Rules.html
# .PRECIOUS: %.o
UPROGS=\
$U/_init\
$U/_sh\
$U/_cat\
$U/_echo\
$U/_grep\
$U/_ls\
$U/_kill\
$U/_mkdir\
$U/_xargs\
$U/_sleep\
$U/_find\
$U/_rm\
$U/_wc\
$U/_test\
$U/_usertests\
$U/_strace\
$U/_mv\
# $U/_forktest\
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
# $U/_ln\
# $U/_stressfs\
# $U/_grind\
# $U/_zombie\
userprogs: $(UPROGS)
dst=/mnt
# Make fs image
# NEWPROG_DIR = ./tests/testsuits-for-oskernel/riscv-syscalls-testing/user/build/riscv64
# t:
# for file in `ls $(NEWPROG_DIR)/*`; do \
# cp $$file $${file#$U/test__}; done
mount:
mount sdcard.img $(dst)
umount:
umount $(dst)
fs: $(UPROGS)
if [ ! -f "sdcard.img" ]; then \
echo "making fs image..."; \
dd if=/dev/zero of=sdcard.img bs=512k count=512; \
mkfs.vfat -F 32 sdcard.img; fi
mount sdcard.img $(dst)
if [ ! -d "$(dst)/bin" ]; then mkdir $(dst)/bin; fi
cp README $(dst)/README
./tools/move_testsuits.sh
for file in $$( ls $U/_* ); do \
cp $$file $(dst)/$${file#$U/_};\
cp $$file $(dst)/bin/$${file#$U/_}; done
umount $(dst)
# @for file in $$( ls ./tests/testsuits-for-oskernel/riscv-syscalls-testing/user/riscv64/* ); do \
# cp $$file $(dst)/$${file}; \
# cp $$file $(dst)/bin/$${file}; done
# @for file in $$( ls $U/test__* ); do \
# cp $$file $(dst)/$${file#$U/test__};done
$K/include/initcode.h: $U/_init
riscv64-linux-gnu-objcopy -S -O binary $U/_init oo
od -v -t x1 -An oo | sed -E 's/ (.{2})/0x\1,/g' > $K/include/initcode.h
rm -rf oo
# all 是平台上运行的命令,需要把kernel-qemu移到根目录下,因为后续平台的qemu-gdb只认根目录下的这个文件
all: build sdcard $K/include/initcode.h
mv $T/kernel $T/kernel-qemu
cp $T/kernel-qemu kernel-qemu
# Write mounted sdcard
sdcard: userprogs
if [ ! -d "$(dst)/bin" ]; then mkdir $(dst)/bin; fi
for file in $$( ls $U/_* ); do \
cp $$file $(dst)/bin/$${file#$U/_}; done
cp $U/_init $(dst)/init
cp $U/_sh $(dst)/sh
cp README $(dst)/README
# test_fs:
# make -C ./tests/testsuits-for-oskernel/riscv-syscalls-testing/user all CHAPTER=7
# mount sdcard.img $(dst)
# cp -r ./tests/testsuits-for-oskernel/riscv-syscalls-testing/user/riscv64 $(dsst)/bin
GDBPORT = $(shell expr `id -u` % 5000 + 25000)
.gdbinit: .gdbinit.tmpl-riscv
sed "s/:1234/:$(GDBPORT)/" < $^ > $@
GDB = riscv64-unknown-elf-gdb
QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \
then echo "-gdb tcp::$(GDBPORT)"; \
else echo "-s -p $(GDBPORT)"; fi)
gdb:
gdb-multiarch
qemu-gdb: $T/kernel .gdbinit sdcard.img
echo "*** Now run 'gdb' in another window." 1>&2
$(QEMU) $(QEMUOPTS) -S $(QEMUGDB)
281282283284285286287288289290291292293294295296297298299300301302303304
test_local: clean build
if [ ! -f "sdcard.img" ]; then \
echo "making fs image..."; \
dd if=/dev/zero of=sdcard.img bs=512k count=512; \
mkfs.vfat -F 32 sdcard.img; fi
make mount
./tools/move_testsuits.sh
make umount
./tools/run_test.sh
make run platform=qemu
clean:
rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \
*/*.o */*.d */*.asm */*.sym \
$T/* \
$U/initcode $U/initcode.out \
$K/kernel \
.gdbinit \
$U/usys.S \
$(UPROGS) \
kernel-qemu \
sdcard.img \
fs.img