1
0
mirror of https://github.com/rcore-os/rCore.git synced 2024-11-27 10:13:28 +04:00
rCore/kernel/Makefile
WangRunji 047f4ffdcc cherry-pick jiegec's work (#3) from lab8-rv32: virtio drivers, network stack
Read and parse dtb upon boot

Implement virtio net device detection

Negotiate feature bits for virtio-net

Read MAC address from virtio-net device and detect virtqueues

Receiving from virtio net device is working for the first time

Implement driver interface and interrupt handling routines

Rearrange drivers into upper directory

Implement initial support for processing arp request and reply packet

Refactor MAC address and IPv4 address into structs, and implement ICMP echo reply

Fix typos

Implement initial support for virtio gpu driver

Complete first working version of virtio gpu driver with mandelbrot example

Use smoltcp and implement a udp and tcp server on top of it

Cleanup virtio net code
2019-01-23 22:28:45 +08:00

288 lines
6.2 KiB
Makefile

# Commands:
# make build Build
# make run Build and run in QEMU
# make justrun Run the last build
# make doc Generate docs
# make asm Open the deassemble file of the last build
# make header Open 'objdump -h' of the last build
# make addr2line Use addr2line to recover line info in backtrace
# make clean Clean
#
# Options:
# arch = x86_64 | riscv32 | riscv64 | aarch64
# d = int | in_asm | ... QEMU debug info
# mode = debug | release
# LOG = off | error | warn | info | debug | trace
# SFSIMG = <sfsimg> SFS image path of user programs
# smp = 1 | 2 | ... SMP core number
# graphic = on | off enable/disable qemu graphical output
# board = none Running on QEMU
# | k210 Only available on riscv64, build without bbl, run on K210
# | raspi3 Only available on aarch64, run on Raspberry Pi 3 Model B/B+
# m_mode Only available on riscv32, build for M-Mode, without MMU
arch ?= riscv32
board ?= none
mode ?= debug
LOG ?= debug
graphic ?= off
smp ?= 4
m_mode ?=
target := $(arch)
kernel := target/$(target)/$(mode)/rcore
bin := target/$(target)/$(mode)/kernel.bin
bootimage := target/$(target)/bootimage.bin
bbl_path := $(PWD)/../riscv-pk
user_dir := ../user
### export environments ###
export ARCH = $(arch)
export SMP = $(smp)
#export SFSIMG = $(user_dir)/build/user-$(arch).img
ifeq ($(arch), x86_64)
export SFSIMG = $(user_dir)/img/ucore-i386.img
else
export SFSIMG = $(user_dir)/img/ucore-$(arch).img
endif
ifeq ($(arch), aarch64)
board := raspi3
endif
ifeq ($(board), k210)
m_mode := 1
endif
# crate 'process' use this to set interrupt (MIE or SIE)
export M_MODE = $(m_mode)
ifeq ($(arch), aarch64)
graphic ?= on
else
graphic ?= off
endif
### qemu options ###
qemu_opts := \
-smp cores=$(smp)
ifeq ($(arch), x86_64)
qemu_opts += \
-drive format=raw,file=$(bootimage) \
-drive format=raw,file=$(SFSIMG),media=disk,cache=writeback \
-serial mon:stdio \
-device isa-debug-exit
else ifeq ($(arch), riscv32)
qemu_opts += \
-machine virt \
-kernel $(bin)
ifdef m_mode
qemu_opts += -cpu rv32imacu-nommu
endif
else ifeq ($(arch), riscv64)
qemu_opts += \
-machine virt \
-kernel $(bin)
ifdef m_mode
qemu_opts += -cpu rv64imacu-nommu
endif
else ifeq ($(arch), aarch64)
qemu_opts += \
-machine $(board) \
-serial null -serial mon:stdio \
-kernel $(bin)
endif
ifneq ($(graphic), on)
qemu_opts += -nographic
endif
ifdef d
qemu_opts += -d $(d)
endif
ifeq ($(graphic), off)
qemu_opts += -nographic
else
qemu_opts += -serial stdio
endif
### build args ###
ifneq ($(graphic), on)
features += nographic
endif
ifeq ($(board), raspi3)
# qemu only has generic timer
# TODO: configure system/generic timer automatically
raspi3_timer ?= generic
ifeq ($(raspi3_timer), generic)
features += raspi3_use_generic_timer
endif
endif
ifdef m_mode
features += no_mmu m_mode
bbl_m_mode := --enable-boot-machine
endif
ifneq ($(board), none)
features += board_$(board)
endif
build_args := --target targets/$(target).json --features "$(features)"
ifeq ($(mode), release)
build_args += --release
endif
### prefix ###
ifeq ($(arch), x86_64)
ifeq ($(uname), Darwin)
prefix := x86_64-elf-
endif
else ifeq ($(arch), riscv32)
prefix := riscv64-unknown-elf-
else ifeq ($(arch), riscv64)
prefix := riscv64-unknown-elf-
else ifeq ($(arch), aarch64)
prefix ?= aarch64-none-elf-
ifeq (,$(shell which $(prefix)ld))
prefix := aarch64-elf-
endif
endif
ld := $(prefix)ld
objdump := $(prefix)objdump
objcopy := $(prefix)objcopy
cc := $(prefix)gcc
as := $(prefix)as
gdb := gdb
export CC=$(cc)
.PHONY: all clean run build asm doc justrun debug kernel sfsimg install runnet
all: kernel
clean:
@cargo clean
@cd $(user_dir) && make clean
doc:
@cargo rustdoc -- --document-private-items
run: build justrun
runnet: build justrunnet
runui: build justrunui
justrun:
@qemu-system-$(arch) $(qemu_opts)
justrunnet: build
@sudo qemu-system-$(arch) $(qemu_opts) \
-netdev type=tap,id=net0,script=no,downscript=no \
-device virtio-net-device,netdev=net0 \
justrunui: build
@qemu-system-$(arch) $(qemu_opts) \
-device virtio-gpu-device \
debug: $(kernel) $(bin)
@qemu-system-$(arch) $(qemu_opts) -s -S &
@sleep 1
@$(gdb) $(kernel) -x ../tools/gdbinit
build: $(bin)
asm:
@$(objdump) -dS $(kernel) | less
header:
@$(objdump) -h $(kernel)
sym:
@$(objdump) -t $(kernel) | less
$(bin): kernel
ifeq ($(arch), riscv32)
@mkdir -p target/$(target)/bbl && \
cd target/$(target)/bbl && \
$(bbl_path)/configure \
$(bbl_m_mode) \
--with-arch=rv32imac \
--disable-fp-emulation \
--host=riscv64-unknown-elf \
--with-payload=$(abspath $(kernel)) && \
make -j32 && \
cp bbl $(abspath $@)
else ifeq ($(arch), riscv64)
ifeq ($(board), k210)
@$(objcopy) $(kernel) --strip-all -O binary $@
else
@mkdir -p target/$(target)/bbl && \
cd target/$(target)/bbl && \
$(bbl_path)/configure \
$(bbl_m_mode) \
--with-arch=rv64imac \
--disable-fp-emulation \
--host=riscv64-unknown-elf \
--with-payload=$(abspath $(kernel)) && \
make -j32 && \
cp bbl $(abspath $@)
endif
else ifeq ($(arch), aarch64)
@$(objcopy) $(kernel) --strip-all -O binary $@
endif
kernel:
ifeq ($(arch), x86_64)
@bootimage build $(build_args)
else ifeq ($(arch), riscv32)
@-patch -p0 -N -b \
$(shell rustc --print sysroot)/lib/rustlib/src/rust/src/libcore/sync/atomic.rs \
src/arch/riscv32/atomic.patch
@cargo xbuild $(build_args)
else ifeq ($(arch), riscv64)
@./build-rv64
else ifeq ($(arch), aarch64)
@cargo xbuild $(build_args)
endif
### user programs ###
sfsimg:
@cd $(user_dir) && make sfsimg
### install ###
ifeq ($(board), raspi3)
sd_card ?=
ifeq ($(shell uname), Darwin)
sd_card := /Volumes/boot
else ifeq ($(shell uname), Linux)
sd_card := /media/$(shell whoami)/boot
endif
ifdef sd_card
.PHONY:
install: $(bin)
cp $(bin) $(sd_card)/kernel8.img
sudo umount $(sd_card)
endif
endif
ifeq ($(board), k210)
.PHONY:
install: $(bin)
## baudrate no more than 600000
@python3 ../tools/k210/kflash.py $(bin) -b 600000
endif
.PHONY:
addr2line:
@python3 ../tools/addr2line.py $(prefix)addr2line $(arch)