Skip to content

Commit 2993c81

Browse files
committed
Add code for tutorial 11
1 parent 420f400 commit 2993c81

31 files changed

+4553
-4
lines changed
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"editor.formatOnSave": true,
3+
"rust.features": [
4+
"bsp_rpi3"
5+
],
6+
"rust.all_targets": false,
7+
"editor.rulers": [
8+
100
9+
],
10+
}

11_virtual_memory/Cargo.lock

+42
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

11_virtual_memory/Cargo.toml

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
[package]
2+
name = "kernel"
3+
version = "0.1.0"
4+
authors = ["Andre Richter <andre.o.richter@gmail.com>"]
5+
edition = "2018"
6+
7+
[package.metadata.cargo-xbuild]
8+
sysroot_path = "../xbuild_sysroot"
9+
10+
# The features section is used to select the target board.
11+
[features]
12+
default = []
13+
bsp_rpi3 = ["cortex-a", "register"]
14+
bsp_rpi4 = ["cortex-a", "register"]
15+
16+
[dependencies]
17+
r0 = "0.2.*"
18+
19+
# Optional dependencies
20+
cortex-a = { version = "2.*", optional = true }
21+
register = { version = "0.3.*", optional = true }

11_virtual_memory/Makefile

+127
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
## SPDX-License-Identifier: MIT
2+
##
3+
## Copyright (c) 2018-2019 Andre Richter <andre.o.richter@gmail.com>
4+
5+
# Default to the RPi3
6+
ifndef BSP
7+
BSP = rpi3
8+
endif
9+
10+
# BSP-specific arguments
11+
ifeq ($(BSP),rpi3)
12+
TARGET = aarch64-unknown-none-softfloat
13+
OUTPUT = kernel8.img
14+
QEMU_BINARY = qemu-system-aarch64
15+
QEMU_MACHINE_TYPE = raspi3
16+
QEMU_MISC_ARGS = -serial stdio
17+
OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg
18+
JTAG_BOOT_IMAGE = jtag_boot_rpi3.img
19+
LINKER_FILE = src/bsp/rpi/link.ld
20+
RUSTC_MISC_ARGS = -C target-cpu=cortex-a53
21+
else ifeq ($(BSP),rpi4)
22+
TARGET = aarch64-unknown-none-softfloat
23+
OUTPUT = kernel8.img
24+
# QEMU_BINARY = qemu-system-aarch64
25+
# QEMU_MACHINE_TYPE =
26+
# QEMU_MISC_ARGS = -serial stdio
27+
OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg
28+
JTAG_BOOT_IMAGE = jtag_boot_rpi4.img
29+
LINKER_FILE = src/bsp/rpi/link.ld
30+
RUSTC_MISC_ARGS = -C target-cpu=cortex-a72
31+
endif
32+
33+
SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld)
34+
35+
XRUSTC_CMD = cargo xrustc \
36+
--target=$(TARGET) \
37+
--features bsp_$(BSP) \
38+
--release \
39+
-- \
40+
-C link-arg=-T$(LINKER_FILE) \
41+
$(RUSTC_MISC_ARGS)
42+
43+
CARGO_OUTPUT = target/$(TARGET)/release/kernel
44+
45+
OBJCOPY_CMD = cargo objcopy \
46+
-- \
47+
--strip-all \
48+
-O binary
49+
50+
CONTAINER_UTILS = rustembedded/osdev-utils
51+
52+
DOCKER_CMD = docker run -it --rm
53+
DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work
54+
DOCKER_ARG_TTY = --privileged -v /dev:/dev
55+
DOCKER_ARG_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag
56+
DOCKER_ARG_NET = --network host
57+
58+
DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) -kernel $(OUTPUT)
59+
DOCKER_EXEC_RASPBOOT = raspbootcom
60+
DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0
61+
# DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0
62+
63+
.PHONY: all doc qemu chainboot clippy clean readelf objdump nm
64+
65+
all: clean $(OUTPUT)
66+
67+
$(CARGO_OUTPUT): $(SOURCES)
68+
RUSTFLAGS="-D warnings -D missing_docs" $(XRUSTC_CMD)
69+
70+
$(OUTPUT): $(CARGO_OUTPUT)
71+
cp $< .
72+
$(OBJCOPY_CMD) $< $(OUTPUT)
73+
74+
doc:
75+
cargo xdoc --target=$(TARGET) --features bsp_$(BSP) --document-private-items
76+
xdg-open target/$(TARGET)/doc/kernel/index.html
77+
78+
ifeq ($(QEMU_MACHINE_TYPE),)
79+
qemu:
80+
@echo "This board is not yet supported for QEMU."
81+
else
82+
qemu: all
83+
$(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \
84+
$(DOCKER_EXEC_QEMU) $(QEMU_MISC_ARGS)
85+
endif
86+
87+
chainboot: all
88+
$(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \
89+
$(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \
90+
$(OUTPUT)
91+
92+
jtagboot:
93+
$(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_JTAG) $(CONTAINER_UTILS) \
94+
$(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \
95+
/jtag/$(JTAG_BOOT_IMAGE)
96+
97+
openocd:
98+
$(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \
99+
openocd $(OPENOCD_ARG)
100+
101+
define gen_gdb
102+
RUSTFLAGS="-D warnings -D missing_docs" $(XRUSTC_CMD) $1
103+
cp $(CARGO_OUTPUT) kernel_for_jtag
104+
$(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \
105+
gdb-multiarch -q kernel_for_jtag
106+
endef
107+
108+
gdb: clean $(SOURCES)
109+
$(call gen_gdb,-C debuginfo=2)
110+
111+
gdb-opt0: clean $(SOURCES)
112+
$(call gen_gdb,-C debuginfo=2 -C opt-level=0)
113+
114+
clippy:
115+
cargo xclippy --target=$(TARGET) --features bsp_$(BSP)
116+
117+
clean:
118+
cargo clean
119+
120+
readelf:
121+
readelf -a kernel
122+
123+
objdump:
124+
cargo objdump --target $(TARGET) -- -disassemble -print-imm-hex kernel
125+
126+
nm:
127+
cargo nm --target $(TARGET) -- kernel | sort

0 commit comments

Comments
 (0)