diff --git a/.github/workflows/build_rpi3.yml b/.github/workflows/build_rpi3.yml index ce034f15..51f2afc7 100644 --- a/.github/workflows/build_rpi3.yml +++ b/.github/workflows/build_rpi3.yml @@ -38,7 +38,7 @@ jobs: - name: Set up Ruby run: | gem install bundler - bundle install --retry 3 --with development + bundle install --retry 3 --without uart - name: Make run: | bundle exec ruby utils/devtool.rb make rpi3 diff --git a/.github/workflows/build_rpi4.yml b/.github/workflows/build_rpi4.yml index 52d8bc93..7b929e38 100644 --- a/.github/workflows/build_rpi4.yml +++ b/.github/workflows/build_rpi4.yml @@ -38,7 +38,7 @@ jobs: - name: Set up Ruby run: | gem install bundler - bundle install --retry 3 --with development + bundle install --retry 3 --without uart - name: Make run: | bundle exec ruby utils/devtool.rb make rpi4 diff --git a/.github/workflows/sanity.yml b/.github/workflows/sanity.yml index f9c2787f..0308539d 100644 --- a/.github/workflows/sanity.yml +++ b/.github/workflows/sanity.yml @@ -28,7 +28,7 @@ jobs: - name: Set up Ruby run: | gem install bundler - bundle install --retry 3 --with development + bundle install --retry 3 --without uart - name: Setup misspell run: | curl -L -o ./install-misspell.sh https://git.io/misspell diff --git a/.github/workflows/test_integration.yml b/.github/workflows/test_integration.yml index 0de08a47..4d4e3f2c 100644 --- a/.github/workflows/test_integration.yml +++ b/.github/workflows/test_integration.yml @@ -38,7 +38,7 @@ jobs: - name: Set up Ruby run: | gem install bundler - bundle install --retry 3 --with development + bundle install --retry 3 --without uart - name: Make all run: | bundle exec ruby utils/devtool.rb test_integration diff --git a/.github/workflows/test_unit.yml b/.github/workflows/test_unit.yml index d7bdfd70..e50eda57 100644 --- a/.github/workflows/test_unit.yml +++ b/.github/workflows/test_unit.yml @@ -38,7 +38,7 @@ jobs: - name: Set up Ruby run: | gem install bundler - bundle install --retry 3 --with development + bundle install --retry 3 --without uart - name: Make all run: | bundle exec ruby utils/devtool.rb test_unit diff --git a/.rubocop.yml b/.rubocop.yml index f9b4e7af..09604aea 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -15,5 +15,8 @@ Layout/IndentationWidth: Layout/LineLength: Max: 100 +Metrics/ClassLength: + Enabled: false + Metrics/MethodLength: Max: 20 diff --git a/01_wait_forever/Makefile b/01_wait_forever/Makefile index e5278748..1c2be3c7 100644 --- a/01_wait_forever/Makefile +++ b/01_wait_forever/Makefile @@ -9,45 +9,44 @@ endif # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -d in_asm - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -d in_asm - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary + -- \ + --strip-all \ + -O binary -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm @@ -69,8 +68,9 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif clippy: diff --git a/01_wait_forever/README.md b/01_wait_forever/README.md index e2ec9292..e8994cb3 100644 --- a/01_wait_forever/README.md +++ b/01_wait_forever/README.md @@ -35,7 +35,7 @@ Project skeleton is set up; Code just halts all CPU cores executing the kernel c In the project folder, invoke QEMU and observe the CPU core spinning on `wfe`: ```console -make qemu +» make qemu [...] IN: 0x00080000: d503205f wfe diff --git a/02_runtime_init/Makefile b/02_runtime_init/Makefile index e5278748..1c2be3c7 100644 --- a/02_runtime_init/Makefile +++ b/02_runtime_init/Makefile @@ -9,45 +9,44 @@ endif # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -d in_asm - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -d in_asm - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary + -- \ + --strip-all \ + -O binary -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm @@ -69,8 +68,9 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif clippy: diff --git a/03_hacky_hello_world/Makefile b/03_hacky_hello_world/Makefile index 6eb21611..1c2be3c7 100644 --- a/03_hacky_hello_world/Makefile +++ b/03_hacky_hello_world/Makefile @@ -9,45 +9,44 @@ endif # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary + -- \ + --strip-all \ + -O binary -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm @@ -69,8 +68,9 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif clippy: diff --git a/03_hacky_hello_world/README.md b/03_hacky_hello_world/README.md index d7422f12..f2bfc016 100644 --- a/03_hacky_hello_world/README.md +++ b/03_hacky_hello_world/README.md @@ -18,7 +18,7 @@ QEMU is no longer running in assembly mode. It will from now on show the output of the `console`. ```console -make qemu +» make qemu [...] Hello from Rust! Kernel panic: Stopping here. @@ -27,28 +27,6 @@ Kernel panic: Stopping here. ## Diff to previous ```diff -diff -uNr 02_runtime_init/Makefile 03_hacky_hello_world/Makefile ---- 02_runtime_init/Makefile -+++ 03_hacky_hello_world/Makefile -@@ -13,7 +13,7 @@ - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 - QEMU_MACHINE_TYPE = raspi3 -- QEMU_MISC_ARGS = -d in_asm -+ QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 - else ifeq ($(BSP),rpi4) -@@ -21,7 +21,7 @@ - OUTPUT = kernel8.img - # QEMU_BINARY = qemu-system-aarch64 - # QEMU_MACHINE_TYPE = --# QEMU_MISC_ARGS = -d in_asm -+# QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 - endif - diff -uNr 02_runtime_init/src/bsp/rpi.rs 03_hacky_hello_world/src/bsp/rpi.rs --- 02_runtime_init/src/bsp/rpi.rs +++ 03_hacky_hello_world/src/bsp/rpi.rs diff --git a/04_zero_overhead_abstraction/Makefile b/04_zero_overhead_abstraction/Makefile index 6eb21611..1c2be3c7 100644 --- a/04_zero_overhead_abstraction/Makefile +++ b/04_zero_overhead_abstraction/Makefile @@ -9,45 +9,44 @@ endif # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary + -- \ + --strip-all \ + -O binary -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm @@ -69,8 +68,9 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif clippy: diff --git a/05_safe_globals/Makefile b/05_safe_globals/Makefile index 6eb21611..1c2be3c7 100644 --- a/05_safe_globals/Makefile +++ b/05_safe_globals/Makefile @@ -9,45 +9,44 @@ endif # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary + -- \ + --strip-all \ + -O binary -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm @@ -69,8 +68,9 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif clippy: diff --git a/05_safe_globals/README.md b/05_safe_globals/README.md index d8ebb302..6bc1cb8c 100644 --- a/05_safe_globals/README.md +++ b/05_safe_globals/README.md @@ -42,7 +42,7 @@ you can check out implemntations in the [spin crate] or the [parking lot crate]. ### Test it ```console -make qemu +» make qemu [...] [0] Hello from pure Rust! [1] Chars written: 26 diff --git a/06_drivers_gpio_uart/Makefile b/06_drivers_gpio_uart/Makefile index 6eb21611..1c2be3c7 100644 --- a/06_drivers_gpio_uart/Makefile +++ b/06_drivers_gpio_uart/Makefile @@ -9,45 +9,44 @@ endif # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary + -- \ + --strip-all \ + -O binary -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) .PHONY: all doc qemu clippy clean readelf objdump nm @@ -69,8 +68,9 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif clippy: diff --git a/07_uart_chainloader/Makefile b/07_uart_chainloader/Makefile index 3fefe038..d9d8292d 100644 --- a/07_uart_chainloader/Makefile +++ b/07_uart_chainloader/Makefile @@ -7,54 +7,56 @@ ifndef BSP BSP = rpi3 endif +# Default to /dev/ttyUSB0 +ifndef DEV_SERIAL + DEV_SERIAL = /dev/ttyUSB0 +endif + # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 -C relocation-model=pic + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 -C relocation-model=pic CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi3.img else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 -C relocation-model=pic + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 -C relocation-model=pic CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi4.img endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary - -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_ARG_TTY = --privileged -v /dev:/dev - -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel -DOCKER_EXEC_RASPBOOT = raspbootcom -DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 -# DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 + -- \ + --strip-all \ + -O binary + +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils +DOCKER_ARG_TTY = --privileged -v /dev:/dev +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) +DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb .PHONY: all doc qemu qemuasm chainboot clippy clean readelf objdump nm @@ -79,18 +81,20 @@ qemuasm: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) qemuasm: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) -d in_asm + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) -d in_asm endif chainboot: - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - $(CHAINBOOT_DEMO_PAYLOAD) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + $(CHAINBOOT_DEMO_PAYLOAD) clippy: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" cargo xclippy --target=$(TARGET) --features bsp_$(BSP) diff --git a/07_uart_chainloader/README.md b/07_uart_chainloader/README.md index 70cf7bbe..273dc97b 100644 --- a/07_uart_chainloader/README.md +++ b/07_uart_chainloader/README.md @@ -22,9 +22,12 @@ You can try it with this tutorial already: 5. Observe the loader fetching a kernel over `UART`: ```console -make chainboot +» make chainboot [...] -### Listening on /dev/ttyUSB0 +Minipush 1.0 + +[MP] ⏳ Waiting for /dev/ttyUSB0 +[MP] ✅ Connected __ __ _ _ _ _ | \/ (_)_ _ (_) | ___ __ _ __| | | |\/| | | ' \| | |__/ _ \/ _` / _` | @@ -32,9 +35,8 @@ make chainboot Raspberry Pi 3 -[ML] Requestibinary -### sending kernel demo_payload_rpi3.img [7840 byte] -### finished sending +[ML] Requesting binary +[MP] ⏩ Pushing 7856 KiB =======================================🦀 100% 0 KiB/s Time: 00:00:00 [ML] Loaded! Executing the payload now [0] Booting on: Raspberry Pi 3 @@ -83,44 +85,53 @@ Binary files 06_drivers_gpio_uart/demo_payload_rpi4.img and 07_uart_chainloader/ diff -uNr 06_drivers_gpio_uart/Makefile 07_uart_chainloader/Makefile --- 06_drivers_gpio_uart/Makefile +++ 07_uart_chainloader/Makefile -@@ -15,7 +15,8 @@ +@@ -7,6 +7,11 @@ + BSP = rpi3 + endif + ++# Default to /dev/ttyUSB0 ++ifndef DEV_SERIAL ++ DEV_SERIAL = /dev/ttyUSB0 ++endif ++ + # BSP-specific arguments + ifeq ($(BSP),rpi3) + TARGET = aarch64-unknown-none-softfloat +@@ -15,7 +20,8 @@ QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld -- RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 -+ RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 -C relocation-model=pic + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld +- RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 ++ RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 -C relocation-model=pic + CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi3.img else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -@@ -23,7 +24,8 @@ - # QEMU_MACHINE_TYPE = - # QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld -- RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 -+ RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 -C relocation-model=pic + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img +@@ -23,7 +29,8 @@ + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld +- RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 ++ RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 -C relocation-model=pic + CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi4.img endif - RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -@@ -47,9 +49,14 @@ - - DOCKER_CMD = docker run -it --rm - DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work --DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel -+DOCKER_ARG_TTY = --privileged -v /dev:/dev + RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +@@ -46,9 +53,12 @@ + DOCKER_IMAGE = rustembedded/osdev-utils + DOCKER_CMD = docker run -it --rm + DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work ++DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils ++DOCKER_ARG_TTY = --privileged -v /dev:/dev + DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) ++DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb -.PHONY: all doc qemu clippy clean readelf objdump nm -+DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel -+DOCKER_EXEC_RASPBOOT = raspbootcom -+DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 -+# DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 -+ +.PHONY: all doc qemu qemuasm chainboot clippy clean readelf objdump nm all: clean $(OUTPUT) -@@ -67,12 +74,24 @@ +@@ -66,13 +76,26 @@ ifeq ($(QEMU_MACHINE_TYPE),) qemu: @echo "This board is not yet supported for QEMU." @@ -129,18 +140,20 @@ diff -uNr 06_drivers_gpio_uart/Makefile 07_uart_chainloader/Makefile + @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) + +qemuasm: all -+ $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ -+ $(DOCKER_EXEC_QEMU) $(OUTPUT) -d in_asm ++ @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ ++ $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ ++ -kernel $(OUTPUT) -d in_asm endif +chainboot: -+ $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ -+ $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ -+ $(CHAINBOOT_DEMO_PAYLOAD) ++ @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ ++ $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ ++ $(CHAINBOOT_DEMO_PAYLOAD) + clippy: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" cargo xclippy --target=$(TARGET) --features bsp_$(BSP) @@ -321,7 +334,7 @@ diff -uNr 06_drivers_gpio_uart/src/main.rs 07_uart_chainloader/src/main.rs + // protocol. + bsp::console().clear(); + -+ // Notify raspbootcom to send the binary. ++ // Notify `Minipush` to send the binary. + for _ in 0..3 { + bsp::console().write_char(3 as char); } diff --git a/07_uart_chainloader/src/main.rs b/07_uart_chainloader/src/main.rs index 70034c13..060115ee 100644 --- a/07_uart_chainloader/src/main.rs +++ b/07_uart_chainloader/src/main.rs @@ -83,7 +83,7 @@ fn kernel_main() -> ! { // protocol. bsp::console().clear(); - // Notify raspbootcom to send the binary. + // Notify `Minipush` to send the binary. for _ in 0..3 { bsp::console().write_char(3 as char); } diff --git a/08_timestamps/Makefile b/08_timestamps/Makefile index b1e16720..2f56a01b 100644 --- a/08_timestamps/Makefile +++ b/08_timestamps/Makefile @@ -7,52 +7,54 @@ ifndef BSP BSP = rpi3 endif +# Default to /dev/ttyUSB0 +ifndef DEV_SERIAL + DEV_SERIAL = /dev/ttyUSB0 +endif + # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary - -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_ARG_TTY = --privileged -v /dev:/dev - -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel -DOCKER_EXEC_RASPBOOT = raspbootcom -DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 -# DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 + -- \ + --strip-all \ + -O binary + +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils +DOCKER_ARG_TTY = --privileged -v /dev:/dev +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) +DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb .PHONY: all doc qemu chainboot clippy clean readelf objdump nm @@ -74,14 +76,15 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif chainboot: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + $(OUTPUT) clippy: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" cargo xclippy --target=$(TARGET) --features bsp_$(BSP) diff --git a/08_timestamps/README.md b/08_timestamps/README.md index d1aa0d64..3e4215c4 100644 --- a/08_timestamps/README.md +++ b/08_timestamps/README.md @@ -9,9 +9,12 @@ use it to annotate prints with timestamps; A `warn!()` macro is added. Check it out via chainboot (added in previous tutorial): ```console -make chainboot +» make chainboot [...] -### Listening on /dev/ttyUSB0 +Minipush 1.0 + +[MP] ⏳ Waiting for /dev/ttyUSB0 +[MP] ✅ Connected __ __ _ _ _ _ | \/ (_)_ _ (_) | ___ __ _ __| | | |\/| | | ' \| | |__/ _ \/ _` / _` | @@ -20,19 +23,18 @@ make chainboot Raspberry Pi 3 [ML] Requesting binary -### sending kernel kernel8.img [13872 byte] -### finished sending +[MP] ⏩ Pushing 13152 KiB ======================================🦀 100% 0 KiB/s Time: 00:00:00 [ML] Loaded! Executing the payload now -[ 1.233286] Booting on: Raspberry Pi 3 -[ 1.236282] Architectural timer resolution: 52 ns -[ 1.241023] Drivers loaded: -[ 1.243833] 1. GPIO -[ 1.246467] 2. PL011Uart -[W 1.249453] Spin duration smaller than architecturally supported, skipping -[ 1.256390] Spinning for 1 second -[ 2.259728] Spinning for 1 second -[ 3.262286] Spinning for 1 second +[ 1.169048] Booting on: Raspberry Pi 3 +[ 1.171247] Architectural timer resolution: 52 ns +[ 1.175849] Drivers loaded: +[ 1.178540] 1. GPIO +[ 1.181058] 2. PL011Uart +[W 1.184011] Spin duration smaller than architecturally supported, skipping +[ 1.190783] Spinning for 1 second +[ 2.193996] Spinning for 1 second +[ 3.195732] Spinning for 1 second ``` ## Diff to previous @@ -43,36 +45,36 @@ Binary files 07_uart_chainloader/demo_payload_rpi4.img and 08_timestamps/demo_pa diff -uNr 07_uart_chainloader/Makefile 08_timestamps/Makefile --- 07_uart_chainloader/Makefile +++ 08_timestamps/Makefile -@@ -15,8 +15,7 @@ +@@ -20,8 +20,7 @@ QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld -- RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 -C relocation-model=pic + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld +- RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 -C relocation-model=pic - CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi3.img -+ RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 ++ RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -@@ -24,8 +23,7 @@ - # QEMU_MACHINE_TYPE = - # QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld -- RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 -C relocation-model=pic + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img +@@ -29,8 +28,7 @@ + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld +- RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 -C relocation-model=pic - CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi4.img -+ RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 ++ RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif - RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) -@@ -56,7 +54,7 @@ - DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 - # DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 + RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +@@ -58,7 +56,7 @@ + DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) + DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb -.PHONY: all doc qemu qemuasm chainboot clippy clean readelf objdump nm +.PHONY: all doc qemu chainboot clippy clean readelf objdump nm all: clean $(OUTPUT) -@@ -74,23 +72,16 @@ +@@ -76,25 +74,17 @@ ifeq ($(QEMU_MACHINE_TYPE),) qemu: @echo "This board is not yet supported for QEMU." @@ -81,20 +83,22 @@ diff -uNr 07_uart_chainloader/Makefile 08_timestamps/Makefile - @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) - -qemuasm: all -- $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ -- $(DOCKER_EXEC_QEMU) $(OUTPUT) -d in_asm +- @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ +- $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ +- -kernel $(OUTPUT) -d in_asm endif -chainboot: +chainboot: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ -- $(CHAINBOOT_DEMO_PAYLOAD) -+ $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ +- $(CHAINBOOT_DEMO_PAYLOAD) ++ $(OUTPUT) clippy: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" cargo xclippy --target=$(TARGET) --features bsp_$(BSP) @@ -368,7 +372,7 @@ diff -uNr 07_uart_chainloader/src/main.rs 08_timestamps/src/main.rs - // protocol. - bsp::console().clear(); - -- // Notify raspbootcom to send the binary. +- // Notify `Minipush` to send the binary. - for _ in 0..3 { - bsp::console().write_char(3 as char); - } diff --git a/09_hw_debug_JTAG/Makefile b/09_hw_debug_JTAG/Makefile index 32639a0d..688b1796 100644 --- a/09_hw_debug_JTAG/Makefile +++ b/09_hw_debug_JTAG/Makefile @@ -7,58 +7,60 @@ ifndef BSP BSP = rpi3 endif +# Default to /dev/ttyUSB0 +ifndef DEV_SERIAL + DEV_SERIAL = /dev/ttyUSB0 +endif + # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi3.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi3.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi4.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi4.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary - -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_ARG_TTY = --privileged -v /dev:/dev -DOCKER_ARG_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag -DOCKER_ARG_NET = --network host - -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel -DOCKER_EXEC_RASPBOOT = raspbootcom -DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 -# DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 + -- \ + --strip-all \ + -O binary + +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils +DOCKER_ARG_DIR_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag +DOCKER_ARG_TTY = --privileged -v /dev:/dev +DOCKER_ARG_NET = --network host +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) +DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm @@ -80,29 +82,30 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif chainboot: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + $(OUTPUT) jtagboot: - $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_JTAG) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - /jtag/$(JTAG_BOOT_IMAGE) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_JTAG) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + /jtag/$(JTAG_BOOT_IMAGE) openocd: - $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - openocd $(OPENOCD_ARG) + @$(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + openocd $(OPENOCD_ARG) define gen_gdb - RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XRUSTC_CMD) $1 + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC) $1" $(XRUSTC_CMD) cp $(CARGO_OUTPUT) kernel_for_jtag - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - gdb-multiarch -q kernel_for_jtag + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + gdb-multiarch -q kernel_for_jtag endef gdb: clean $(SOURCES) diff --git a/09_hw_debug_JTAG/README.md b/09_hw_debug_JTAG/README.md index 17325b18..d5e7f789 100644 --- a/09_hw_debug_JTAG/README.md +++ b/09_hw_debug_JTAG/README.md @@ -151,10 +151,11 @@ The helper binary is maintained separately in this repository's [X1_JTAG_boot](. folder, and is a modified version of the kernel we used in our tutorials so far. ```console -make jtagboot -[...] -Raspbootcom V1.0 -### Listening on /dev/ttyUSB0 +» make jtagboot +Minipush 1.0 + +[MP] ⏳ Waiting for /dev/ttyUSB0 +[MP] ✅ Connected __ __ _ _ _ _ | \/ (_)_ _ (_) | ___ __ _ __| | | |\/| | | ' \| | |__/ _ \/ _` / _` | @@ -162,12 +163,11 @@ Raspbootcom V1.0 Raspberry Pi 3 -[ML] Reqbinary -### sending kernel /jtag/jtag_boot_rpi3.img [8960 byte] -### finished sending +[ML] Requesting binary +[MP] ⏩ Pushing 8248 KiB =======================================🦀 100% 0 KiB/s Time: 00:00:00 [ML] Loaded! Executing the payload now -[ 0.805909] Parking CPU core. Please connect over JTAG now. +[ 0.742123] Parking CPU core. Please connect over JTAG now. ``` It is important to keep the USB serial connected and the terminal with the `jtagboot` open and @@ -302,59 +302,57 @@ Thanks to [@naotaco](https://github.com/naotaco) for laying the groundwork for t diff -uNr 08_timestamps/Makefile 09_hw_debug_JTAG/Makefile --- 08_timestamps/Makefile +++ 09_hw_debug_JTAG/Makefile -@@ -14,6 +14,8 @@ - QEMU_BINARY = qemu-system-aarch64 +@@ -19,6 +19,8 @@ + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none -+ OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg -+ JTAG_BOOT_IMAGE = jtag_boot_rpi3.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none ++ OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg ++ JTAG_BOOT_IMAGE = jtag_boot_rpi3.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) -@@ -22,6 +24,8 @@ - # QEMU_BINARY = qemu-system-aarch64 - # QEMU_MACHINE_TYPE = - # QEMU_MISC_ARGS = -serial stdio -display none -+ OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg -+ JTAG_BOOT_IMAGE = jtag_boot_rpi4.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 +@@ -27,6 +29,8 @@ + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none ++ OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg ++ JTAG_BOOT_IMAGE = jtag_boot_rpi4.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -@@ -48,13 +52,15 @@ - DOCKER_CMD = docker run -it --rm - DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work - DOCKER_ARG_TTY = --privileged -v /dev:/dev -+DOCKER_ARG_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag -+DOCKER_ARG_NET = --network host - - DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel - DOCKER_EXEC_RASPBOOT = raspbootcom - DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 - # DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 +@@ -52,11 +56,13 @@ + DOCKER_CMD = docker run -it --rm + DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work + DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils ++DOCKER_ARG_DIR_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag + DOCKER_ARG_TTY = --privileged -v /dev:/dev ++DOCKER_ARG_NET = --network host + DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) + DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb -.PHONY: all doc qemu chainboot clippy clean readelf objdump nm +.PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm all: clean $(OUTPUT) -@@ -83,6 +89,28 @@ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - $(OUTPUT) +@@ -86,6 +92,28 @@ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + $(OUTPUT) +jtagboot: -+ $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_JTAG) $(CONTAINER_UTILS) \ -+ $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ -+ /jtag/$(JTAG_BOOT_IMAGE) ++ @$(DOCKER_CMD) $(DOCKER_ARG_DIR_JTAG) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ ++ $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ ++ /jtag/$(JTAG_BOOT_IMAGE) + +openocd: -+ $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ -+ openocd $(OPENOCD_ARG) ++ @$(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ ++ openocd $(OPENOCD_ARG) + +define gen_gdb -+ RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XRUSTC_CMD) $1 ++ RUSTFLAGS="$(RUSTFLAGS_PEDANTIC) $1" $(XRUSTC_CMD) + cp $(CARGO_OUTPUT) kernel_for_jtag -+ $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ -+ gdb-multiarch -q kernel_for_jtag ++ @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ ++ gdb-multiarch -q kernel_for_jtag +endef + +gdb: clean $(SOURCES) diff --git a/10_privilege_level/Makefile b/10_privilege_level/Makefile index 32639a0d..688b1796 100644 --- a/10_privilege_level/Makefile +++ b/10_privilege_level/Makefile @@ -7,58 +7,60 @@ ifndef BSP BSP = rpi3 endif +# Default to /dev/ttyUSB0 +ifndef DEV_SERIAL + DEV_SERIAL = /dev/ttyUSB0 +endif + # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi3.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi3.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi4.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi4.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary - -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_ARG_TTY = --privileged -v /dev:/dev -DOCKER_ARG_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag -DOCKER_ARG_NET = --network host - -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel -DOCKER_EXEC_RASPBOOT = raspbootcom -DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 -# DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 + -- \ + --strip-all \ + -O binary + +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils +DOCKER_ARG_DIR_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag +DOCKER_ARG_TTY = --privileged -v /dev:/dev +DOCKER_ARG_NET = --network host +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) +DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm @@ -80,29 +82,30 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif chainboot: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + $(OUTPUT) jtagboot: - $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_JTAG) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - /jtag/$(JTAG_BOOT_IMAGE) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_JTAG) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + /jtag/$(JTAG_BOOT_IMAGE) openocd: - $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - openocd $(OPENOCD_ARG) + @$(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + openocd $(OPENOCD_ARG) define gen_gdb - RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XRUSTC_CMD) $1 + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC) $1" $(XRUSTC_CMD) cp $(CARGO_OUTPUT) kernel_for_jtag - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - gdb-multiarch -q kernel_for_jtag + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + gdb-multiarch -q kernel_for_jtag endef gdb: clean $(SOURCES) diff --git a/10_privilege_level/README.md b/10_privilege_level/README.md index 57a6d448..ea87a792 100644 --- a/10_privilege_level/README.md +++ b/10_privilege_level/README.md @@ -188,9 +188,12 @@ Looks good! Thanks zero-overhead abstractions in the In `main.rs`, we additionally inspect if the mask bits in `SPSR_EL2` made it to `EL1` as well: ```console -make chainbot +» make chainboot [...] -### Listening on /dev/ttyUSB0 +Minipush 1.0 + +[MP] ⏳ Waiting for /dev/ttyUSB0 +[MP] ✅ Connected __ __ _ _ _ _ | \/ (_)_ _ (_) | ___ __ _ __| | | |\/| | | ' \| | |__/ _ \/ _` / _` | @@ -199,23 +202,22 @@ make chainbot Raspberry Pi 3 [ML] Requesting binary -### sending kernel kernel8.img [16480 byte] -### finished sending +[MP] ⏩ Pushing 15840 KiB ======================================🦀 100% 0 KiB/s Time: 00:00:00 [ML] Loaded! Executing the payload now -[ 1.459973] Booting on: Raspberry Pi 3 -[ 1.462256] Current privilege level: EL1 -[ 1.466163] Exception handling state: -[ 1.469810] Debug: Masked -[ 1.473023] SError: Masked -[ 1.476235] IRQ: Masked -[ 1.479447] FIQ: Masked -[ 1.482661] Architectural timer resolution: 52 ns -[ 1.487349] Drivers loaded: -[ 1.490127] 1. GPIO -[ 1.492731] 2. PL011Uart -[ 1.495770] Timer test, spinning for 1 second -[ 2.500114] Echoing input now +[ 1.402763] Booting on: Raspberry Pi 3 +[ 1.404961] Current privilege level: EL1 +[ 1.408781] Exception handling state: +[ 1.412341] Debug: Masked +[ 1.415466] SError: Masked +[ 1.418592] IRQ: Masked +[ 1.421717] FIQ: Masked +[ 1.424844] Architectural timer resolution: 52 ns +[ 1.429445] Drivers loaded: +[ 1.432136] 1. GPIO +[ 1.434654] 2. PL011Uart +[ 1.437606] Timer test, spinning for 1 second +[ 2.441862] Echoing input now ``` ## Diff to previous diff --git a/11_virtual_memory/Makefile b/11_virtual_memory/Makefile index 32639a0d..688b1796 100644 --- a/11_virtual_memory/Makefile +++ b/11_virtual_memory/Makefile @@ -7,58 +7,60 @@ ifndef BSP BSP = rpi3 endif +# Default to /dev/ttyUSB0 +ifndef DEV_SERIAL + DEV_SERIAL = /dev/ttyUSB0 +endif + # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi3.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi3.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi4.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi4.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary - -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_ARG_TTY = --privileged -v /dev:/dev -DOCKER_ARG_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag -DOCKER_ARG_NET = --network host - -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel -DOCKER_EXEC_RASPBOOT = raspbootcom -DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 -# DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 + -- \ + --strip-all \ + -O binary + +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils +DOCKER_ARG_DIR_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag +DOCKER_ARG_TTY = --privileged -v /dev:/dev +DOCKER_ARG_NET = --network host +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) +DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm @@ -80,29 +82,30 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif chainboot: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + $(OUTPUT) jtagboot: - $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_JTAG) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - /jtag/$(JTAG_BOOT_IMAGE) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_JTAG) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + /jtag/$(JTAG_BOOT_IMAGE) openocd: - $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - openocd $(OPENOCD_ARG) + @$(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + openocd $(OPENOCD_ARG) define gen_gdb - RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XRUSTC_CMD) $1 + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC) $1" $(XRUSTC_CMD) cp $(CARGO_OUTPUT) kernel_for_jtag - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - gdb-multiarch -q kernel_for_jtag + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + gdb-multiarch -q kernel_for_jtag endef gdb: clean $(SOURCES) diff --git a/11_virtual_memory/README.md b/11_virtual_memory/README.md index 479f65c6..8b4734ab 100644 --- a/11_virtual_memory/README.md +++ b/11_virtual_memory/README.md @@ -242,9 +242,12 @@ abstractions, it boils down to two assembly instructions: ## Test it ```console -make chainbot +» make chainboot [...] -### Listening on /dev/ttyUSB0 +Minipush 1.0 + +[MP] ⏳ Waiting for /dev/ttyUSB0 +[MP] ✅ Connected __ __ _ _ _ _ | \/ (_)_ _ (_) | ___ __ _ __| | | |\/| | | ' \| | |__/ _ \/ _` / _` | @@ -253,28 +256,27 @@ make chainbot Raspberry Pi 3 [ML] Requesting binary -### sending kernel kernel8.img [65560 byte] -### finished sending +[MP] ⏩ Pushing 65568 KiB =====================================🦀 100% 12 KiB/s Time: 00:00:05 [ML] Loaded! Executing the payload now -[ 5.791515] Booting on: Raspberry Pi 3 -[ 5.793767] MMU online. Special regions: -[ 5.797674] 0x00080000 - 0x0008ffff | 64 KiB | C RO PX | Kernel code and RO data -[ 5.805922] 0x1fff0000 - 0x1fffffff | 64 KiB | Dev RW PXN | Remapped Device MMIO -[ 5.813910] 0x3f000000 - 0x3fffffff | 16 MiB | Dev RW PXN | Device MMIO -[ 5.821117] Current privilege level: EL1 -[ 5.825024] Exception handling state: -[ 5.828670] Debug: Masked -[ 5.831883] SError: Masked -[ 5.835095] IRQ: Masked -[ 5.838308] FIQ: Masked -[ 5.841520] Architectural timer resolution: 52 ns -[ 5.846209] Drivers loaded: -[ 5.848987] 1. GPIO -[ 5.851592] 2. PL011Uart -[ 5.854630] Timer test, spinning for 1 second +[ 5.793345] Booting on: Raspberry Pi 3 +[ 5.795510] MMU online. Special regions: +[ 5.799330] 0x00080000 - 0x0008ffff | 64 KiB | C RO PX | Kernel code and RO data +[ 5.807491] 0x1fff0000 - 0x1fffffff | 64 KiB | Dev RW PXN | Remapped Device MMIO +[ 5.815392] 0x3f000000 - 0x3fffffff | 16 MiB | Dev RW PXN | Device MMIO +[ 5.822512] Current privilege level: EL1 +[ 5.826332] Exception handling state: +[ 5.829892] Debug: Masked +[ 5.833018] SError: Masked +[ 5.836143] IRQ: Masked +[ 5.839269] FIQ: Masked +[ 5.842395] Architectural timer resolution: 52 ns +[ 5.846996] Drivers loaded: +[ 5.849688] 1. GPIO +[ 5.852206] 2. PL011Uart +[ 5.855158] Timer test, spinning for 1 second [ !!! ] Writing through the remapped UART at 0x1FFF_1000 -[ 6.863133] Echoing input now +[ 6.863485] Echoing input now ``` ## Diff to previous diff --git a/12_cpu_exceptions_part1/Makefile b/12_cpu_exceptions_part1/Makefile index 32639a0d..688b1796 100644 --- a/12_cpu_exceptions_part1/Makefile +++ b/12_cpu_exceptions_part1/Makefile @@ -7,58 +7,60 @@ ifndef BSP BSP = rpi3 endif +# Default to /dev/ttyUSB0 +ifndef DEV_SERIAL + DEV_SERIAL = /dev/ttyUSB0 +endif + # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi3.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi3.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi4.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi4.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary - -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_ARG_TTY = --privileged -v /dev:/dev -DOCKER_ARG_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag -DOCKER_ARG_NET = --network host - -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel -DOCKER_EXEC_RASPBOOT = raspbootcom -DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 -# DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 + -- \ + --strip-all \ + -O binary + +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils +DOCKER_ARG_DIR_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag +DOCKER_ARG_TTY = --privileged -v /dev:/dev +DOCKER_ARG_NET = --network host +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) +DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm @@ -80,29 +82,30 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif chainboot: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + $(OUTPUT) jtagboot: - $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_JTAG) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - /jtag/$(JTAG_BOOT_IMAGE) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_JTAG) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + /jtag/$(JTAG_BOOT_IMAGE) openocd: - $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - openocd $(OPENOCD_ARG) + @$(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + openocd $(OPENOCD_ARG) define gen_gdb - RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XRUSTC_CMD) $1 + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC) $1" $(XRUSTC_CMD) cp $(CARGO_OUTPUT) kernel_for_jtag - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - gdb-multiarch -q kernel_for_jtag + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + gdb-multiarch -q kernel_for_jtag endef gdb: clean $(SOURCES) diff --git a/12_cpu_exceptions_part1/README.md b/12_cpu_exceptions_part1/README.md index 2d1f229e..5735a902 100644 --- a/12_cpu_exceptions_part1/README.md +++ b/12_cpu_exceptions_part1/README.md @@ -391,9 +391,12 @@ catch, eventually triggering the `panic!` call from the default handler. Emphasis on the events at timestamps > `6.xxxxxx`. ```console -make chainboot +» make chainboot [...] -### Listening on /dev/ttyUSB0 +Minipush 1.0 + +[MP] ⏳ Waiting for /dev/ttyUSB0 +[MP] ✅ Connected __ __ _ _ _ _ | \/ (_)_ _ (_) | ___ __ _ __| | | |\/| | | ' \| | |__/ _ \/ _` / _` | @@ -402,33 +405,33 @@ make chainboot Raspberry Pi 3 [ML] Requesting binary -### sending kernel kernel8.img [65560 byte] -### finished sending +[MP] ⏩ Pushing 65568 KiB =====================================🦀 100% 12 KiB/s Time: 00:00:05 [ML] Loaded! Executing the payload now -[ 5.780890] Booting on: Raspberry Pi 3 -[ 5.783142] MMU online. Special regions: -[ 5.787050] 0x00080000 - 0x0008ffff | 64 KiB | C RO PX | Kernel code and RO data -[ 5.803285] 0x3f000000 - 0x3fffffff | 16 MiB | Dev RW PXN | Device MMIO -[ 5.810492] Current privilege level: EL1 -[ 5.814399] Exception handling state: -[ 5.818045] Debug: Masked -[ 5.821258] SError: Masked -[ 5.824470] IRQ: Masked -[ 5.827683] FIQ: Masked -[ 5.830895] Architectural timer resolution: 52 ns -[ 5.835584] Drivers loaded: -[ 5.838362] 1. GPIO -[ 5.840967] 2. PL011Uart -[ 5.844006] Timer test, spinning for 1 second -[ 6.848348] -[ 6.848352] Trying to write to address 8 GiB... -[ 6.852856] ************************************************ -[ 6.858499] Whoa! We recovered from a synchronous exception! -[ 6.864142] ************************************************ -[ 6.869786] -[ 6.871262] Let's try again -[ 6.874040] Trying to write to address 9 GiB... +[ 5.779137] Booting on: Raspberry Pi 3 +[ 5.781302] MMU online. Special regions: +[ 5.785123] 0x00080000 - 0x0008ffff | 64 KiB | C RO PX | Kernel code and RO data +[ 5.793284] 0x3f000000 - 0x3fffffff | 16 MiB | Dev RW PXN | Device MMIO +[ 5.800404] Current privilege level: EL1 +[ 5.804224] Exception handling state: +[ 5.807783] Debug: Masked +[ 5.810909] SError: Masked +[ 5.814035] IRQ: Masked +[ 5.817160] FIQ: Masked +[ 5.820286] Architectural timer resolution: 52 ns +[ 5.824888] Drivers loaded: +[ 5.827579] 1. GPIO +[ 5.830097] 2. PL011Uart +[ 5.833049] Timer test, spinning for 1 second +[ 6.837304] +[ 6.837308] Trying to write to address 8 GiB... +[ 6.841638] ************************************************ +[ 6.847194] Whoa! We recovered from a synchronous exception! +[ 6.852751] ************************************************ +[ 6.858308] +[ 6.859697] Let's try again +[ 6.862388] Trying to write to address 9 GiB... + Kernel panic: CPU Exception! @@ -436,7 +439,7 @@ FAR_EL1: 0x0000000240000000 ESR_EL1: 0x96000004 Exception Class (EC) : 0x25 - Data Abort, current EL Instr Specific Syndrome (ISS): 0x4 -ELR_EL1: 0x0000000000080e0c +ELR_EL1: 0x0000000000080e50 SPSR_EL1: 0x600003c5 Flags: Negative (N): Not set @@ -452,21 +455,21 @@ SPSR_EL1: 0x600003c5 General purpose register: x0 : 0x0000000000000000 x1 : 0x000000000008594e - x2 : 0x0000000000000026 x3 : 0x0000000000000000 - x4 : 0x000000000007fc6d x5 : 0x0000000000000002 - x6 : 0x0000000000000000 x7 : 0x679198042b2b0209 - x8 : 0x0000000240000000 x9 : 0x000000000000000d - x10: 0x000000000000000a x11: 0x000000003f201000 - x12: 0x0000000000000019 x13: 0x000000000000000a + x2 : 0x0000000000000026 x3 : 0x0000000000082b3c + x4 : 0x000000000007fc5c x5 : 0x0000000000000003 + x6 : 0x0000000000000000 x7 : 0x3f91980500000000 + x8 : 0x0000000240000000 x9 : 0x000000000008594e + x10: 0x0000000000000414 x11: 0x000000003f201000 + x12: 0x0000000000000019 x13: 0x000000000007fc5d x14: 0x000000000007fda8 x15: 0x0000000000000040 x16: 0x0000000000000000 x17: 0x0000000000000040 - x18: 0x9a07782900000008 x19: 0x0000000000090008 + x18: 0x9e077028302d0802 x19: 0x0000000000090008 x20: 0x000000003b9aca00 x21: 0x00000000000003e8 - x22: 0x0000000000083064 x23: 0x00000000000831d8 + x22: 0x0000000000083074 x23: 0x00000000000831e8 x24: 0x00000000000f4240 x25: 0x00000000000852a8 x26: 0x0000000000085738 x27: 0x0000000000085818 - x28: 0x00000000000831d8 x29: 0x0000000000085588 - lr : 0x0000000000080e00 + x28: 0x00000000000831e8 x29: 0x0000000000085588 + lr : 0x0000000000080e44 ``` ## Diff to previous diff --git a/13_integrated_testing/Makefile b/13_integrated_testing/Makefile index 6f03e985..1d7c1525 100644 --- a/13_integrated_testing/Makefile +++ b/13_integrated_testing/Makefile @@ -7,29 +7,34 @@ ifndef BSP BSP = rpi3 endif +# Default to /dev/ttyUSB0 +ifndef DEV_SERIAL + DEV_SERIAL = /dev/ttyUSB0 +endif + # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 QEMU_RELEASE_ARGS = -serial stdio -display none - QEMU_TEST_ARGS = $(QEMU_RELEASE_ARGS) -semihosting - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi3.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_TEST_ARGS = $(QEMU_RELEASE_ARGS) -semihosting + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi3.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_RELEASE_ARGS = -serial stdio -display none -# QEMU_TEST_ARGS = $(QEMU_RELEASE_ARGS) -semihosting - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi4.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + # QEMU_TEST_ARGS = $(QEMU_RELEASE_ARGS) -semihosting + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi4.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif # Testing-specific arguments @@ -43,38 +48,34 @@ endif QEMU_MISSING_STRING = "This board is not yet supported for QEMU." -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) X_CMD_ARGS = --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release - + --features bsp_$(BSP) \ + --release XRUSTC_CMD = cargo xrustc $(X_CMD_ARGS) -XTEST_CMD = cargo xtest $(X_CMD_ARGS) +XTEST_CMD = cargo xtest $(X_CMD_ARGS) CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary - -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD_TEST = docker run -i --rm -DOCKER_CMD_USER = $(DOCKER_CMD_TEST) -t -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_ARG_TTY = --privileged -v /dev:/dev -DOCKER_ARG_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag -DOCKER_ARG_NET = --network host - -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) -DOCKER_EXEC_RASPBOOT = raspbootcom -DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 -# DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 + -- \ + --strip-all \ + -O binary + +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD_TEST = docker run -i --rm +DOCKER_CMD_USER = $(DOCKER_CMD_TEST) -t +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils +DOCKER_ARG_DIR_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag +DOCKER_ARG_TTY = --privileged -v /dev:/dev +DOCKER_ARG_NET = --network host +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) +DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb .PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm test @@ -99,17 +100,17 @@ test: @echo $(QEMU_MISSING_STRING) else qemu: all - $(DOCKER_CMD_USER) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ - -kernel $(OUTPUT) + @$(DOCKER_CMD_USER) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) define KERNEL_TEST_RUNNER #!/usr/bin/env bash $(OBJCOPY_CMD) $$1 $$1.img TEST_BINARY=$$(echo $$1.img | sed -e 's/.*target/target/g') - $(DOCKER_CMD_TEST) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - ruby tests/runner.rb $(DOCKER_EXEC_QEMU) $(QEMU_TEST_ARGS) -kernel $$TEST_BINARY + $(DOCKER_CMD_TEST) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + ruby tests/runner.rb $(DOCKER_EXEC_QEMU) $(QEMU_TEST_ARGS) -kernel $$TEST_BINARY endef export KERNEL_TEST_RUNNER @@ -121,24 +122,24 @@ test: $(SOURCES) endif chainboot: all - $(DOCKER_CMD_USER) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - $(OUTPUT) + @$(DOCKER_CMD_USER) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + $(OUTPUT) jtagboot: - $(DOCKER_CMD_USER) $(DOCKER_ARG_TTY) $(DOCKER_ARG_JTAG) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - /jtag/$(JTAG_BOOT_IMAGE) + @$(DOCKER_CMD_USER) $(DOCKER_ARG_DIR_JTAG) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + /jtag/$(JTAG_BOOT_IMAGE) openocd: - $(DOCKER_CMD_USER) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - openocd $(OPENOCD_ARG) + @$(DOCKER_CMD_USER) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + openocd $(OPENOCD_ARG) define gen_gdb - RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XRUSTC_CMD) $1 + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC) $1" $(XRUSTC_CMD) cp $(CARGO_OUTPUT) kernel_for_jtag - $(DOCKER_CMD_USER) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - gdb-multiarch -q kernel_for_jtag + @$(DOCKER_CMD_USER) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + gdb-multiarch -q kernel_for_jtag endef gdb: clean $(SOURCES) diff --git a/13_integrated_testing/README.md b/13_integrated_testing/README.md index efd2b418..3ed8fd76 100644 --- a/13_integrated_testing/README.md +++ b/13_integrated_testing/README.md @@ -346,8 +346,8 @@ define KERNEL_TEST_RUNNER $(OBJCOPY_CMD) $$1 $$1.img TEST_BINARY=$$(echo $$1.img | sed -e 's/.*target/target/g') - $(DOCKER_CMD_TEST) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - ruby tests/runner.rb $(DOCKER_EXEC_QEMU) $(QEMU_TEST_ARGS) -kernel $$TEST_BINARY + $(DOCKER_CMD_TEST) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + ruby tests/runner.rb $(DOCKER_EXEC_QEMU) $(QEMU_TEST_ARGS) -kernel $$TEST_BINARY endef export KERNEL_TEST_RUNNER @@ -356,7 +356,6 @@ test: $(SOURCES) @echo "$$KERNEL_TEST_RUNNER" > target/kernel_test_runner.sh @chmod +x target/kernel_test_runner.sh RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XTEST_CMD) $(TEST_ARG) -endif ``` It first does the standard `objcopy` step to strip the `ELF` down to a raw binary. Just like in all @@ -690,28 +689,27 @@ Believe it or not, that is all. There are three ways you can run tests: - For example, `TEST=01_interface_sanity_timer make test` ```console -make test - -RUSTFLAGS="-C link-arg=-Tsrc/bsp/rpi/link.ld -C target-cpu=cortex-a53 -D warnings -D missing_docs" - cargo xtest --target=aarch64-unknown-none-softfloat --features bsp_rpi3 --release - Compiling kernel v0.1.0 (/opt/rust-raspi3-OS-tutorials/13_integrated_testing) - Finished release [optimized] target(s) in 0.74s - Running target/aarch64-unknown-none-softfloat/release/deps/libkernel-a8441de115ec3a67 +» make test +[...] +RUSTFLAGS="-C link-arg=-Tsrc/bsp/rpi/link.ld -C target-cpu=cortex-a53 -D warnings -D missing_docs" cargo xtest --target=aarch64-unknown-none-softfloat --features bsp_rpi3 --release + Finished release [optimized] target(s) in 0.01s + Running target/aarch64-unknown-none-softfloat/release/deps/libkernel-e34f3f4734d1b219 ------------------------------------------------------------------- - 🦀 Running 4 tests + 🦀 Running 5 tests ------------------------------------------------------------------- 1. test_runner_executes_in_kernel_mode.......................[ok] 2. bss_section_is_sane.......................................[ok] - 3. virt_mem_layout_has_no_overlaps...........................[ok] - 4. zero_volatile_works.......................................[ok] + 3. virt_mem_layout_sections_are_64KiB_aligned................[ok] + 4. virt_mem_layout_has_no_overlaps...........................[ok] + 5. zero_volatile_works.......................................[ok] ------------------------------------------------------------------- ✅ Success: libkernel ------------------------------------------------------------------- - Running target/aarch64-unknown-none-softfloat/release/deps/00_interface_sanity_console-e0e4e8cc44addccc + Running target/aarch64-unknown-none-softfloat/release/deps/00_interface_sanity_console-fd36bc6543537769 ------------------------------------------------------------------- 🦀 Running 3 console-based tests ------------------------------------------------------------------- @@ -725,7 +723,7 @@ RUSTFLAGS="-C link-arg=-Tsrc/bsp/rpi/link.ld -C target-cpu=cortex-a53 -D warning ------------------------------------------------------------------- - Running target/aarch64-unknown-none-softfloat/release/deps/01_interface_sanity_timer-a8599d689482115e + Running target/aarch64-unknown-none-softfloat/release/deps/01_interface_sanity_timer-9ddd4857e51af91d ------------------------------------------------------------------- 🦀 Running 3 tests ------------------------------------------------------------------- @@ -739,12 +737,13 @@ RUSTFLAGS="-C link-arg=-Tsrc/bsp/rpi/link.ld -C target-cpu=cortex-a53 -D warning ------------------------------------------------------------------- - Running target/aarch64-unknown-none-softfloat/release/deps/02_arch_exception_handling-f2ad3f66018143ba + Running target/aarch64-unknown-none-softfloat/release/deps/02_arch_exception_handling-8e8e460dd9041f11 ------------------------------------------------------------------- 🦀 Testing synchronous exception handling by causing a page fault ------------------------------------------------------------------- Writing beyond mapped area to address 9 GiB... + Kernel panic: CPU Exception! @@ -813,27 +812,23 @@ diff -uNr 12_cpu_exceptions_part1/Cargo.toml 13_integrated_testing/Cargo.toml diff -uNr 12_cpu_exceptions_part1/Makefile 13_integrated_testing/Makefile --- 12_cpu_exceptions_part1/Makefile +++ 13_integrated_testing/Makefile -@@ -13,7 +13,8 @@ - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 +@@ -19,6 +19,7 @@ + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 -- QEMU_MISC_ARGS = -serial stdio -display none -+ QEMU_RELEASE_ARGS = -serial stdio -display none -+ QEMU_TEST_ARGS = $(QEMU_RELEASE_ARGS) -semihosting - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi3.img - LINKER_FILE = src/bsp/rpi/link.ld -@@ -23,23 +24,37 @@ - OUTPUT = kernel8.img - # QEMU_BINARY = qemu-system-aarch64 - # QEMU_MACHINE_TYPE = --# QEMU_MISC_ARGS = -serial stdio -display none -+# QEMU_RELEASE_ARGS = -serial stdio -display none -+# QEMU_TEST_ARGS = $(QEMU_RELEASE_ARGS) -semihosting - OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg - JTAG_BOOT_IMAGE = jtag_boot_rpi4.img - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + QEMU_RELEASE_ARGS = -serial stdio -display none ++ QEMU_TEST_ARGS = $(QEMU_RELEASE_ARGS) -semihosting + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi3.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi3.img + LINKER_FILE = src/bsp/rpi/link.ld +@@ -29,21 +30,34 @@ + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none ++ # QEMU_TEST_ARGS = $(QEMU_RELEASE_ARGS) -semihosting + OPENOCD_ARG = -f /openocd/tcl/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /openocd/rpi4.cfg + JTAG_BOOT_IMAGE = jtag_boot_rpi4.img + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif +# Testing-specific arguments @@ -847,47 +842,42 @@ diff -uNr 12_cpu_exceptions_part1/Makefile 13_integrated_testing/Makefile + +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." + - RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) + RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) --XRUSTC_CMD = cargo xrustc \ -- --target=$(TARGET) \ +-XRUSTC_CMD = cargo xrustc \ +- --target=$(TARGET) \ +- --features bsp_$(BSP) \ +X_CMD_ARGS = --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release - ++ --features bsp_$(BSP) \ + --release +XRUSTC_CMD = cargo xrustc $(X_CMD_ARGS) -+XTEST_CMD = cargo xtest $(X_CMD_ARGS) -+ - CARGO_OUTPUT = target/$(TARGET)/release/kernel ++XTEST_CMD = cargo xtest $(X_CMD_ARGS) - OBJCOPY_CMD = cargo objcopy \ -@@ -49,18 +64,19 @@ - - CONTAINER_UTILS = rustembedded/osdev-utils + CARGO_OUTPUT = target/$(TARGET)/release/kernel --DOCKER_CMD = docker run -it --rm -+DOCKER_CMD_TEST = docker run -i --rm -+DOCKER_CMD_USER = $(DOCKER_CMD_TEST) -t - DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work - DOCKER_ARG_TTY = --privileged -v /dev:/dev - DOCKER_ARG_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag - DOCKER_ARG_NET = --network host +@@ -53,7 +67,8 @@ + -O binary --DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel -+DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) - DOCKER_EXEC_RASPBOOT = raspbootcom - DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 - # DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 + DOCKER_IMAGE = rustembedded/osdev-utils +-DOCKER_CMD = docker run -it --rm ++DOCKER_CMD_TEST = docker run -i --rm ++DOCKER_CMD_USER = $(DOCKER_CMD_TEST) -t + DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work + DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils + DOCKER_ARG_DIR_JTAG = -v $(shell pwd)/../X1_JTAG_boot:/jtag +@@ -62,7 +77,7 @@ + DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) + DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb -.PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm +.PHONY: all doc qemu chainboot jtagboot openocd gdb gdb-opt0 clippy clean readelf objdump nm test all: clean $(OUTPUT) -@@ -73,35 +89,55 @@ +@@ -75,36 +90,55 @@ doc: cargo xdoc --target=$(TARGET) --features bsp_$(BSP) --document-private-items @@ -903,19 +893,19 @@ diff -uNr 12_cpu_exceptions_part1/Makefile 13_integrated_testing/Makefile + @echo $(QEMU_MISSING_STRING) else qemu: all -- $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ -- $(DOCKER_EXEC_QEMU) $(OUTPUT) -+ $(DOCKER_CMD_USER) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ -+ $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ -+ -kernel $(OUTPUT) +- @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ +- $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ ++ @$(DOCKER_CMD_USER) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ ++ $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) + +define KERNEL_TEST_RUNNER + #!/usr/bin/env bash + + $(OBJCOPY_CMD) $$1 $$1.img + TEST_BINARY=$$(echo $$1.img | sed -e 's/.*target/target/g') -+ $(DOCKER_CMD_TEST) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ -+ ruby tests/runner.rb $(DOCKER_EXEC_QEMU) $(QEMU_TEST_ARGS) -kernel $$TEST_BINARY ++ $(DOCKER_CMD_TEST) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ ++ ruby tests/runner.rb $(DOCKER_EXEC_QEMU) $(QEMU_TEST_ARGS) -kernel $$TEST_BINARY +endef + +export KERNEL_TEST_RUNNER @@ -927,28 +917,30 @@ diff -uNr 12_cpu_exceptions_part1/Makefile 13_integrated_testing/Makefile endif chainboot: all -- $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ -+ $(DOCKER_CMD_USER) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - $(OUTPUT) +- @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ +- $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ ++ @$(DOCKER_CMD_USER) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ ++ $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + $(OUTPUT) jtagboot: -- $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_JTAG) $(CONTAINER_UTILS) \ -+ $(DOCKER_CMD_USER) $(DOCKER_ARG_TTY) $(DOCKER_ARG_JTAG) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - /jtag/$(JTAG_BOOT_IMAGE) +- @$(DOCKER_CMD) $(DOCKER_ARG_DIR_JTAG) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ +- $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ ++ @$(DOCKER_CMD_USER) $(DOCKER_ARG_DIR_JTAG) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ ++ $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + /jtag/$(JTAG_BOOT_IMAGE) openocd: -- $(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ -+ $(DOCKER_CMD_USER) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - openocd $(OPENOCD_ARG) +- @$(DOCKER_CMD) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ ++ @$(DOCKER_CMD_USER) $(DOCKER_ARG_TTY) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + openocd $(OPENOCD_ARG) define gen_gdb - RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XRUSTC_CMD) $1 + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC) $1" $(XRUSTC_CMD) cp $(CARGO_OUTPUT) kernel_for_jtag -- $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ -+ $(DOCKER_CMD_USER) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_NET) $(CONTAINER_UTILS) \ - gdb-multiarch -q kernel_for_jtag +- @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ ++ @$(DOCKER_CMD_USER) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) \ + gdb-multiarch -q kernel_for_jtag endef diff --git a/Gemfile b/Gemfile index 237ef4be..b007c391 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,13 @@ source 'https://rubygems.org' +gem 'colorize' + +group :uart do + gem 'ruby-progressbar' + gem 'serialport' +end + group :development do - gem 'colorize' gem 'rubocop', require: false end diff --git a/X1_JTAG_boot/Makefile b/X1_JTAG_boot/Makefile index 1c486290..2f56a01b 100644 --- a/X1_JTAG_boot/Makefile +++ b/X1_JTAG_boot/Makefile @@ -7,59 +7,61 @@ ifndef BSP BSP = rpi3 endif +# Default to /dev/ttyUSB0 +ifndef DEV_SERIAL + DEV_SERIAL = /dev/ttyUSB0 +endif + # BSP-specific arguments ifeq ($(BSP),rpi3) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img - QEMU_BINARY = qemu-system-aarch64 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + QEMU_BINARY = qemu-system-aarch64 QEMU_MACHINE_TYPE = raspi3 - QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 + QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a53 else ifeq ($(BSP),rpi4) - TARGET = aarch64-unknown-none-softfloat - OUTPUT = kernel8.img -# QEMU_BINARY = qemu-system-aarch64 -# QEMU_MACHINE_TYPE = -# QEMU_MISC_ARGS = -serial stdio -display none - LINKER_FILE = src/bsp/rpi/link.ld - RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 + TARGET = aarch64-unknown-none-softfloat + OUTPUT = kernel8.img + # QEMU_BINARY = qemu-system-aarch64 + # QEMU_MACHINE_TYPE = + # QEMU_RELEASE_ARGS = -serial stdio -display none + LINKER_FILE = src/bsp/rpi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 endif -RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) -XRUSTC_CMD = cargo xrustc \ - --target=$(TARGET) \ - --features bsp_$(BSP) \ - --release +XRUSTC_CMD = cargo xrustc \ + --target=$(TARGET) \ + --features bsp_$(BSP) \ + --release CARGO_OUTPUT = target/$(TARGET)/release/kernel OBJCOPY_CMD = cargo objcopy \ - -- \ - --strip-all \ - -O binary - -CONTAINER_UTILS = rustembedded/osdev-utils - -DOCKER_CMD = docker run -it --rm -DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_ARG_TTY = --privileged -v /dev:/dev - -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel -DOCKER_EXEC_RASPBOOT = raspbootcom -DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyUSB0 -# DOCKER_EXEC_RASPBOOT_DEV = /dev/ttyACM0 + -- \ + --strip-all \ + -O binary + +DOCKER_IMAGE = rustembedded/osdev-utils +DOCKER_CMD = docker run -it --rm +DOCKER_ARG_DIR_TUT = -v $(shell pwd):/work -w /work +DOCKER_ARG_DIR_UTILS = -v $(shell pwd)/../utils:/utils +DOCKER_ARG_TTY = --privileged -v /dev:/dev +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) +DOCKER_EXEC_MINIPUSH = ruby /utils/minipush.rb .PHONY: all doc qemu chainboot clippy clean readelf objdump nm all: clean $(OUTPUT) $(CARGO_OUTPUT): $(SOURCES) - RUSTFLAGS="$(RUSTFLAGS)" $(XRUSTC_CMD) + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XRUSTC_CMD) $(OUTPUT): $(CARGO_OUTPUT) cp $< . @@ -74,14 +76,15 @@ qemu: @echo "This board is not yet supported for QEMU." else qemu: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(CONTAINER_UTILS) \ - $(DOCKER_EXEC_QEMU) $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_IMAGE) \ + $(DOCKER_EXEC_QEMU) $(QEMU_RELEASE_ARGS) \ + -kernel $(OUTPUT) endif chainboot: all - $(DOCKER_CMD) $(DOCKER_ARG_CURDIR) $(DOCKER_ARG_TTY) \ - $(CONTAINER_UTILS) $(DOCKER_EXEC_RASPBOOT) $(DOCKER_EXEC_RASPBOOT_DEV) \ - $(OUTPUT) + @$(DOCKER_CMD) $(DOCKER_ARG_DIR_TUT) $(DOCKER_ARG_DIR_UTILS) $(DOCKER_ARG_TTY) \ + $(DOCKER_IMAGE) $(DOCKER_EXEC_MINIPUSH) $(DEV_SERIAL) \ + $(OUTPUT) clippy: RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" cargo xclippy --target=$(TARGET) --features bsp_$(BSP) @@ -93,7 +96,7 @@ readelf: readelf -a kernel objdump: - cargo objdump --target $(TARGET) -- -disassemble -print-imm-hex kernel + cargo objdump --target $(TARGET) -- -disassemble -no-show-raw-insn -print-imm-hex kernel nm: - cargo nm --target $(TARGET) -- kernel | sort + cargo nm --target $(TARGET) -- -print-size kernel | sort diff --git a/docker/rustembedded-osdev-utils/Dockerfile b/docker/rustembedded-osdev-utils/Dockerfile index 996b5422..dd8eab8f 100644 --- a/docker/rustembedded-osdev-utils/Dockerfile +++ b/docker/rustembedded-osdev-utils/Dockerfile @@ -7,32 +7,39 @@ FROM ubuntu:19.10 ARG VCS_REF LABEL org.label-schema.vcs-ref=$VCS_REF \ - org.label-schema.vcs-url="https://github.com/rust-embedded/rust-raspi3-OS-tutorials" + org.label-schema.vcs-url="https://github.com/rust-embedded/rust-raspi3-OS-tutorials" LABEL maintainer="The resources team , Andre Richter " -RUN set -ex; \ - tempPkgs=' \ - automake \ - build-essential \ - git \ - libtool \ - pkg-config \ - wget \ - '; \ - apt-get update; \ - apt-get install -q -y --no-install-recommends \ - $tempPkgs \ +# Ruby gems +COPY Gemfile . + +RUN set -ex; \ + tempPkgs=' \ + automake \ + build-essential \ + git \ + libtool \ + pkg-config \ + wget \ + '; \ + apt-get update; \ + apt-get install -q -y --no-install-recommends \ + $tempPkgs \ # persistent packages - ca-certificates \ - gdb-multiarch \ - libpixman-1-dev \ - libglib2.0-dev \ - libusb-1.0.0-dev \ - locales \ - python \ - ruby \ - ; \ + ca-certificates \ + gdb-multiarch \ + libpixman-1-dev \ + libglib2.0-dev \ + libusb-1.0.0-dev \ + locales \ + python \ + ruby \ + ruby-dev \ + ; \ + # Ruby dependencies + gem install bundler; \ + bundle install --retry 3 --without development; \ # QEMU git clone git://git.qemu.org/qemu.git; \ cd qemu; \ @@ -44,13 +51,6 @@ RUN set -ex; \ make install; \ cd ..; \ rm -rf qemu; \ - # Raspbootcom - git clone --depth 1 https://github.com/andre-richter/raspbootin.git; \ - cd raspbootin/raspbootcom; \ - make; \ - cp raspbootcom /usr/bin; \ - cd ../..; \ - rm -rf raspbootin; \ # Openocd git clone --depth 1 https://git.code.sf.net/p/openocd/code openocd; \ cd openocd; \ @@ -59,11 +59,11 @@ RUN set -ex; \ make; \ make install; \ # GDB - wget -P ~ git.io/.gdbinit; \ + wget -P ~ git.io/.gdbinit; \ # Cleanup - apt-get purge -y --auto-remove $tempPkgs; \ - apt-get autoremove -q -y; \ - apt-get clean -q -y; \ + apt-get purge -y --auto-remove $tempPkgs; \ + apt-get autoremove -q -y; \ + apt-get clean -q -y; \ rm -rf /var/lib/apt/lists/* # Locales diff --git a/docker/rustembedded-osdev-utils/Makefile b/docker/rustembedded-osdev-utils/Makefile index 2b83b811..4b9f70f5 100644 --- a/docker/rustembedded-osdev-utils/Makefile +++ b/docker/rustembedded-osdev-utils/Makefile @@ -5,5 +5,7 @@ default: docker_build docker_build: + cp ../../Gemfile . docker build -t rustembedded/osdev-utils \ --build-arg VCS_REF=`git rev-parse --short HEAD` . + rm Gemfile diff --git a/utils/minipush.rb b/utils/minipush.rb new file mode 100755 index 00000000..ba00b39c --- /dev/null +++ b/utils/minipush.rb @@ -0,0 +1,195 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# SPDX-License-Identifier: MIT OR Apache-2.0 +# +# Copyright (c) 2020 Andre Richter + +require 'rubygems' +require 'bundler/setup' +require 'io/console' +require 'colorize' +require 'ruby-progressbar' +require 'serialport' +require 'timeout' + +class ConnectionError < StandardError; end +class ProtocolError < StandardError; end + +# The main class +class MiniPush + def initialize(serial_name, binary_image) + @target_serial_name = serial_name + @target_serial = nil + @binary_size = File.size(binary_image) + @binary_image = File.binread(binary_image) + @host_console = IO.console + end + + private + + def serial_connected? + File.exist?(@target_serial_name) + end + + def wait_for_serial + loop do + break if serial_connected? + + print "\r[MP] ⏳ Waiting for #{@target_serial_name}" + sleep(1) + end + end + + def open_serial + wait_for_serial + + @target_serial = SerialPort.new(@target_serial_name, 115_200, 8, 1, SerialPort::NONE) + + # Ensure all output is immediately flushed to the device. + @target_serial.sync = true + rescue Errno::EACCES => e + puts + puts '[MP] 🚫 ' + e.message + " - Maybe try with 'sudo'" + exit + else + puts + puts '[MP] ✅ Connected' + end + + # The three characters signaling the request token are expected to arrive as the last three + # characters _at the end_ of a character stream (e.g. after a header print from Miniload). + def wait_for_binary_request + Timeout.timeout(7) do + loop do + received = @target_serial.readpartial(4096) + + raise ConnectionError if received.nil? + + if received.chars.last(3) == ["\u{3}", "\u{3}", "\u{3}"] + # Print the last chunk minus the request token. + print received[0..-4] + return + end + + print received + end + end + end + + def send_size + @target_serial.print([@binary_size].pack('L<')) + raise ProtocolError if @target_serial.read(2) != 'OK' + end + + def send_binary + pb = ProgressBar.create( + total: @binary_size, + format: '[MP] ⏩ Pushing %c KiB %b🦀%i %p%% %r KiB/s %a', + rate_scale: ->(rate) { rate / 1024 }, + length: 92 + ) + + # Send in 512 byte chunks. + while pb.progress < pb.total + part = @binary_image.slice(pb.progress, 512) + pb.progress += @target_serial.write(part) + end + end + + def terminal + @host_console.raw! + + Thread.abort_on_exception = true + Thread.report_on_exception = false + + # Receive from target and print on host console. + target_to_host = Thread.new do + loop do + char = @target_serial.getc + + raise ConnectionError if char.nil? + + # onlcr + @host_console.putc("\r") if char == "\n" + @host_console.putc(char) + end + end + + # Transmit host console input to target. + loop do + c = @host_console.getc + + # CTRL + C in raw mode was pressed + if c == "\u{3}" + target_to_host.kill + break + end + + @target_serial.putc(c) + end + end + + def connetion_reset + @target_serial&.close + @target_serial = nil + @host_console.cooked! + end + + # When the serial lost power or was removed during R/W operation. + def handle_reconnect + connetion_reset + + puts + puts '[MP] ⚡ ' + 'Connection Error: Reinsert the USB serial again'.light_red + end + + # When the serial is still powered. + def handle_protocol_error + connetion_reset + + puts + puts '[MP] ⚡ ' + 'Protocol Error: Remove and insert the USB serial again'.light_red + sleep(1) while serial_connected? + end + + def handle_unexpected(error) + connetion_reset + + puts + puts '[MP] ⚡ ' + "Unexpected Error: #{error.inspect}".light_red + end + + public + + def run + open_serial + wait_for_binary_request + send_size + send_binary + terminal + rescue ConnectionError, EOFError, Errno::EIO + handle_reconnect + retry + rescue ProtocolError, Timeout::Error + handle_protocol_error + retry + rescue StandardError => e + handle_unexpected(e) + ensure + connetion_reset + puts + puts '[MP] Bye 👋' + end +end + +puts 'Minipush 1.0'.cyan +puts + +# CTRL + C handler. Only here to suppress Ruby's default exception print. +trap('INT') do + # The `ensure` block from `MiniPush::run` will run after exit, restoring console state. + exit +end + +MiniPush.new(ARGV[0], ARGV[1]).run diff --git a/utils/raspboot.bash b/utils/raspboot.bash deleted file mode 100755 index ede1a8e9..00000000 --- a/utils/raspboot.bash +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -# SPDX-License-Identifier: MIT OR Apache-2.0 -# -# Copyright (c) 2018-2020 Andre Richter - -CONTAINER_UTILS="rustembedded/osdev-utils" - -DOCKER_CMD="docker run -it --rm" -DOCKER_ARG_CURDIR="-v $(pwd):/work -w /work" -DOCKER_ARG_TTY="--privileged -v /dev:/dev" -DOCKER_EXEC_RASPBOOT="raspbootcom /dev/ttyUSB0" - -$DOCKER_CMD \ - $DOCKER_ARG_CURDIR \ - $DOCKER_ARG_TTY \ - $CONTAINER_UTILS \ - $DOCKER_EXEC_RASPBOOT \ - kernel8.img