-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
222 lines (180 loc) · 4.99 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# Building variables
DOCKER_NAME = phoenix
BOARD := qemu
NET ?=n # 是否启用VirtioNet设备,如果不开启则使用本地Loopback设备
export TARGET = riscv64gc-unknown-none-elf
export MODE = release
export LOG = error
export Phoenix_IP=$(IP)
export Phoenix_GW=$(GW)
# Tools
OBJDUMP = rust-objdump --arch-name=riscv64
OBJCOPY = rust-objcopy --binary-architecture=riscv64
QEMU = qemu-system-riscv64
RISCV_GDB ?= riscv64-unknown-elf-gdb
PAGER ?= less
# Target files
TARGET_DIR := ./target/$(TARGET)/$(MODE)
VENDOR_DIR := ./third-party/vendor
KERNEL_ELF := $(TARGET_DIR)/kernel
KERNEL_BIN := $(KERNEL_ELF).bin
KERNEL_ASM := $(KERNEL_ELF).asm
USER_APPS_DIR := ./user/src/bin
USER_APPS := $(wildcard $(USER_APPS_DIR)/*.rs)
USER_ELFS := $(patsubst $(USER_APPS_DIR)/%.rs, $(TARGET_DIR)/%, $(USER_APPS))
USER_BINS := $(patsubst $(USER_APPS_DIR)/%.rs, $(TARGET_DIR)/%.bin, $(USER_APPS))
FS_IMG_DIR := .
FS_IMG := $(FS_IMG_DIR)/sdcard.img
TEST := 24/final
# FS := fat32
FS := ext4
SDCARD := n
TEST_DIR := ./testcase/$(TEST)
# TEST_DIR := ./testcase/24/preliminary/
# Crate features
export STRACE :=
export SMP :=
export PREEMPT :=
export DEBUG :=
export FINAL2 :=
# Args
DISASM_ARGS = -d
BOOTLOADER := default
CPUS := 2
QEMU_ARGS :=
QEMU_ARGS += -m 128M
QEMU_ARGS += -machine virt
QEMU_ARGS += -nographic
QEMU_ARGS += -smp $(CPUS)
QEMU_ARGS += -kernel $(KERNEL_BIN)
QEMU_ARGS += -bios $(BOOTLOADER)
QEMU_ARGS += -drive file=$(FS_IMG),if=none,format=raw,id=x0
QEMU_ARGS += -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0
# Net
IP ?= 10.0.2.15
GW ?= 10.0.2.2
ifeq ($(NET),y)
$(info "enabled qemu net device")
# 指定该网络设备使用 net0 这个网络后端,使用用户模式网络。
# 设置端口转发,将主机的 TCP 端口 5555 和 UDP 端口 5555 分别转发到虚拟机的 TCP端口 5555 和 UDP 端口 5555。
QEMU_ARGS += -device virtio-net-device,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::5555-:5555,hostfwd=udp::5555-:5555
QEMU_ARGS += -d guest_errors\
-d unimp
endif
DOCKER_RUN_ARGS := run
DOCKER_RUN_ARGS += --rm
DOCKER_RUN_ARGS += -it
DOCKER_RUN_ARGS += --privileged
DOCKER_RUN_ARGS += --network="host"
DOCKER_RUN_ARGS += -v $(PWD):/mnt
DOCKER_RUN_ARGS += -v /dev:/dev
DOCKER_RUN_ARGS += -w /mnt
DOCKER_RUN_ARGS += $(DOCKER_NAME)
DOCKER_RUN_ARGS += bash
# File targets
$(KERNEL_ASM): $(KERNEL_ELF)
@$(OBJDUMP) $(DISASM_ARGS) $(KERNEL_ELF) > $(KERNEL_ASM)
@echo "Updated: $(KERNEL_ASM)"
# Phony targets
PHONY := all
all: build run MODE=release
PHONY += build_docker
build_docker:
docker build --network="host" -t ${DOCKER_NAME} .
PHONY += docker
docker:
docker $(DOCKER_RUN_ARGS)
PHONY += env
env:
@(cargo install --list | grep "cargo-binutils" > /dev/null 2>&1) || cargo install cargo-binutils
@cargo vendor $(VENDOR_DIR)
PHONY += fmt
fmt:
@cargo fmt
PHONY += build
build: fmt user fs-img kernel
PHONY += kernel
kernel:
@echo "building kernel..."
@echo Platform: $(BOARD)
@cd kernel && make build
@$(OBJCOPY) $(KERNEL_ELF) --strip-all -O binary $(KERNEL_BIN)
@echo "building kernel finished"
PHONY += user
user:
@echo "building user..."
@cd user && make build
@$(foreach elf, $(USER_ELFS), $(OBJCOPY) $(elf) --strip-all -O binary $(patsubst $(TARGET_DIR)/%, $(TARGET_DIR)/%.bin, $(elf));)
@cp ./testcase/22/busybox $(TARGET_DIR)/busybox
@echo "building user finished"
PHONY += fs-img
fs-img:
@echo "building fs-img..."
ifeq ($(SDCARD), n)
@rm -f $(FS_IMG)
endif
@mkdir -p $(FS_IMG_DIR)
@mkdir -p mnt
ifeq ($(FS), fat32)
ifeq ($(SDCARD), n)
dd if=/dev/zero of=$(FS_IMG) count=1363148 bs=1K
endif
@mkfs.vfat -F 32 -s 8 $(FS_IMG)
@echo "making fatfs image by using $(TEST_DIR)"
@mount -t vfat -o user,umask=000,utf8=1 --source $(FS_IMG) --target mnt
else
ifeq ($(SDCARD), n)
dd if=/dev/zero of=$(FS_IMG) count=2048 bs=1M
endif
# @mkfs.ext4 $(FS_IMG)
@mkfs.ext4 -F -O ^metadata_csum_seed $(FS_IMG)
@echo "making ext4 image by using $(TEST_DIR)"
@mount $(FS_IMG) mnt
endif
@cp -r $(TEST_DIR)/* mnt
@cp -r $(USER_ELFS) mnt
@umount mnt
@rm -rf mnt
@chmod 777 $(FS_IMG)
@echo "building fs-img finished"
PHONY += qemu
qemu:
@echo "start to run kernel in qemu..."
$(QEMU) $(QEMU_ARGS)
PHONY += dumpdtb
dumpdtb:
$(QEMU) $(QEMU_ARGS) -machine dumpdtb=riscv64-virt.dtb
dtc -I dtb -O dts -o riscv64-virt.dts riscv64-virt.dtb
PHONY += run
run: qemu
PHONY += brun
brun: fmt clean-cargo user kernel run
PHONY += clean
clean:
@cargo clean
@rm -rf $(FS_IMG)
PHONY += clean-cargo
clean-cargo:
@cargo clean
PHONY += disasm
disasm: $(KERNEL_ASM)
@$(PAGER) $(KERNEL_ASM)
PHONY += trace
trace:
addr2line -fipe $(KERNEL_ELF) | rustfilt
PHONY += drun
drun: fmt clean-cargo user kernel
$(QEMU) $(QEMU_ARGS) -s -S
PHONY += debug
debug:
$(QEMU) $(QEMU_ARGS) -s -S
PHONY += gdb
gdb:
$(RISCV_GDB) -ex 'file $(KERNEL_ELF)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234'
PHONY += zImage
zImage: kernel
gzip -f $(KERNEL_BIN)
mkimage -A riscv -O linux -C gzip -T kernel -a 0x80200000 -e 0x80200000 -n Phoenix -d $(KERNEL_BIN).gz zImage
sudo cp zImage /srv/tftp/
.PHONY: $(PHONY)