From 1d34a4e42e1eaa88c651d0ae50c05067efd5e643 Mon Sep 17 00:00:00 2001 From: Andre Richter Date: Mon, 6 Apr 2020 23:17:09 +0200 Subject: [PATCH] Add tutorial 14: Peripheral Interrupts --- .../.cargo/config | 2 + .../.vscode/settings.json | 13 + .../Cargo.lock | 175 + .../Cargo.toml | 49 + 14_exceptions_part2_peripheral_IRQs/Makefile | 166 + 14_exceptions_part2_peripheral_IRQs/README.md | 2940 +++++++++++++++++ 14_exceptions_part2_peripheral_IRQs/kernel | Bin 0 -> 163376 bytes .../kernel8.img | Bin 0 -> 67648 bytes .../src/_arch/aarch64/cpu.rs | 111 + .../src/_arch/aarch64/cpu/smp.rs | 22 + .../src/_arch/aarch64/exception.S | 138 + .../src/_arch/aarch64/exception.rs | 261 ++ .../_arch/aarch64/exception/asynchronous.rs | 140 + .../src/_arch/aarch64/memory/mmu.rs | 320 ++ .../src/_arch/aarch64/time.rs | 101 + .../src/bsp.rs | 41 + .../src/bsp/device_driver.rs | 16 + .../src/bsp/device_driver/arm.rs | 11 + .../src/bsp/device_driver/arm/gicv2.rs | 222 ++ .../src/bsp/device_driver/arm/gicv2/gicc.rs | 146 + .../src/bsp/device_driver/arm/gicv2/gicd.rs | 197 ++ .../src/bsp/device_driver/bcm.rs | 15 + .../src/bsp/device_driver/bcm/bcm2xxx_gpio.rs | 138 + .../bcm/bcm2xxx_interrupt_controller.rs | 131 + .../peripheral_ic.rs | 167 + .../device_driver/bcm/bcm2xxx_pl011_uart.rs | 495 +++ .../src/bsp/device_driver/common.rs | 35 + .../src/bsp/raspberrypi.rs | 56 + .../src/bsp/raspberrypi/console.rs | 40 + .../src/bsp/raspberrypi/cpu.rs | 18 + .../src/bsp/raspberrypi/driver.rs | 53 + .../src/bsp/raspberrypi/exception.rs | 7 + .../bsp/raspberrypi/exception/asynchronous.rs | 36 + .../src/bsp/raspberrypi/link.ld | 39 + .../src/bsp/raspberrypi/memory.rs | 46 + .../src/bsp/raspberrypi/memory/mmu.rs | 109 + .../src/console.rs | 54 + .../src/cpu.rs | 12 + .../src/cpu/smp.rs | 10 + .../src/driver.rs | 49 + .../src/exception.rs | 44 + .../src/exception/asynchronous.rs | 145 + .../src/lib.rs | 181 + .../src/main.rs | 97 + .../src/memory.rs | 52 + .../src/memory/mmu.rs | 203 ++ .../src/panic_wait.rs | 67 + .../src/print.rs | 110 + .../src/runtime_init.rs | 83 + .../src/state.rs | 83 + .../src/synchronization.rs | 150 + .../src/time.rs | 35 + .../test-macros/Cargo.toml | 14 + .../test-macros/src/lib.rs | 29 + .../test-types/Cargo.toml | 5 + .../test-types/src/lib.rs | 16 + .../tests/00_console_sanity.rb | 50 + .../tests/00_console_sanity.rs | 36 + .../tests/01_timer_sanity.rs | 50 + .../tests/02_exception_sync_page_fault.rs | 44 + .../tests/03_exception_irq_sanity.rs | 68 + .../tests/panic_exit_failure/mod.rs | 9 + .../tests/panic_exit_success/mod.rs | 9 + .../tests/runner.rb | 139 + doc/14_BCM_driver.drawio | 1 + doc/14_BCM_driver.png | Bin 0 -> 301850 bytes doc/14_GICv2_driver.drawio | 1 + doc/14_GICv2_driver.png | Bin 0 -> 258574 bytes doc/14_header.drawio | 1 + doc/14_header.png | Bin 0 -> 295219 bytes 70 files changed, 8303 insertions(+) create mode 100644 14_exceptions_part2_peripheral_IRQs/.cargo/config create mode 100644 14_exceptions_part2_peripheral_IRQs/.vscode/settings.json create mode 100644 14_exceptions_part2_peripheral_IRQs/Cargo.lock create mode 100644 14_exceptions_part2_peripheral_IRQs/Cargo.toml create mode 100644 14_exceptions_part2_peripheral_IRQs/Makefile create mode 100644 14_exceptions_part2_peripheral_IRQs/README.md create mode 100755 14_exceptions_part2_peripheral_IRQs/kernel create mode 100755 14_exceptions_part2_peripheral_IRQs/kernel8.img create mode 100644 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/cpu.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/cpu/smp.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception.S create mode 100644 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception/asynchronous.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/memory/mmu.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/time.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicc.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicd.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_gpio.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller/peripheral_ic.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_pl011_uart.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/common.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/console.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/cpu.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/driver.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception/asynchronous.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/link.ld create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/memory.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/memory/mmu.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/console.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/cpu.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/cpu/smp.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/driver.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/exception.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/exception/asynchronous.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/lib.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/main.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/memory.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/memory/mmu.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/panic_wait.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/print.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/runtime_init.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/state.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/synchronization.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/src/time.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/test-macros/Cargo.toml create mode 100644 14_exceptions_part2_peripheral_IRQs/test-macros/src/lib.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/test-types/Cargo.toml create mode 100644 14_exceptions_part2_peripheral_IRQs/test-types/src/lib.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/tests/00_console_sanity.rb create mode 100644 14_exceptions_part2_peripheral_IRQs/tests/00_console_sanity.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/tests/01_timer_sanity.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/tests/02_exception_sync_page_fault.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/tests/03_exception_irq_sanity.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/tests/panic_exit_failure/mod.rs create mode 100644 14_exceptions_part2_peripheral_IRQs/tests/panic_exit_success/mod.rs create mode 100755 14_exceptions_part2_peripheral_IRQs/tests/runner.rb create mode 100644 doc/14_BCM_driver.drawio create mode 100644 doc/14_BCM_driver.png create mode 100644 doc/14_GICv2_driver.drawio create mode 100644 doc/14_GICv2_driver.png create mode 100644 doc/14_header.drawio create mode 100644 doc/14_header.png diff --git a/14_exceptions_part2_peripheral_IRQs/.cargo/config b/14_exceptions_part2_peripheral_IRQs/.cargo/config new file mode 100644 index 00000000..e3476485 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/.cargo/config @@ -0,0 +1,2 @@ +[target.'cfg(target_os = "none")'] +runner = "target/kernel_test_runner.sh" diff --git a/14_exceptions_part2_peripheral_IRQs/.vscode/settings.json b/14_exceptions_part2_peripheral_IRQs/.vscode/settings.json new file mode 100644 index 00000000..c520a512 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "editor.formatOnSave": true, + "editor.rulers": [ + 100 + ], + "rust-analyzer.cargoFeatures.features": [ + "bsp_rpi3" + ], + "rust-analyzer.cargo-watch.allTargets": false, + "rust-analyzer.cargo-watch.arguments": [ + "--target=aarch64-unknown-none-softfloat" + ] +} diff --git a/14_exceptions_part2_peripheral_IRQs/Cargo.lock b/14_exceptions_part2_peripheral_IRQs/Cargo.lock new file mode 100644 index 00000000..114c0206 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/Cargo.lock @@ -0,0 +1,175 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "array-init" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bit_field" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cast" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cortex-a" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "register 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "kernel" +version = "0.1.0" +dependencies = [ + "cortex-a 2.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "qemu-exit 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "register 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "test-macros 0.1.0", + "test-types 0.1.0", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro2" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "qemu-exit" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "x86_64 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quote" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "register" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "tock-registers 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "syn" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "test-macros" +version = "0.1.0" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "test-types 0.1.0", +] + +[[package]] +name = "test-types" +version = "0.1.0" + +[[package]] +name = "tock-registers" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ux" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "x86_64" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "array-init 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bit_field 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ux 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[metadata] +"checksum array-init 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "23589ecb866b460d3a0f1278834750268c607e8e28a1b982c907219f3178cd72" +"checksum bit_field 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed8765909f9009617974ab6b7d332625b320b33c326b1e9321382ef1999b5d56" +"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +"checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" +"checksum cortex-a 2.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd807a12241940332c7c9f6aeaf3f7539d4213853d32445d17c97f3e7eebe118" +"checksum nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" +"checksum qemu-exit 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6eef8966dfa42074458b801f4ca70c0a070a84a500022584cc11d7a3c1fdb105" +"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +"checksum register 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e10c2ba523bc81270ecb9b6ca6704f42cd1efec89fddbfe0e520ad0e218f401" +"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238" +"checksum tock-registers 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70323afdb8082186c0986da0e10f6e4ed103d681c921c00597e98d9806dac20f" +"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +"checksum ux 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "88dfeb711b61ce620c0cb6fd9f8e3e678622f0c971da2a63c4b3e25e88ed012f" +"checksum x86_64 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1f27d9168654aee1b0c1b73746caeb4aa33248f8b8c8f6e100e697fcc2a794b2" diff --git a/14_exceptions_part2_peripheral_IRQs/Cargo.toml b/14_exceptions_part2_peripheral_IRQs/Cargo.toml new file mode 100644 index 00000000..93c4d204 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "kernel" +version = "0.1.0" +authors = ["Andre Richter "] +edition = "2018" + +[package.metadata.cargo-xbuild] +sysroot_path = "../xbuild_sysroot" + +# The features section is used to select the target board. +[features] +default = [] +bsp_rpi3 = ["cortex-a", "register"] +bsp_rpi4 = ["cortex-a", "register"] +qemu-quirks = [] + +[dependencies] +qemu-exit = "0.1.x" +test-types = { path = "test-types" } + +# Optional dependencies +cortex-a = { version = "2.9.x", optional = true } +register = { version = "0.5.x", features=["no_std_unit_tests"], optional = true } + +##-------------------------------------------------------------------------------------------------- +## Testing +##-------------------------------------------------------------------------------------------------- + +[dev-dependencies] +test-macros = { path = "test-macros" } + +# Unit tests are done in the library part of the kernel. +[lib] +name = "libkernel" +test = true + +# Disable unit tests for the kernel binary. +[[bin]] +name = "kernel" +test = false + +# List of tests without harness. +[[test]] +name = "00_console_sanity" +harness = false + +[[test]] +name = "02_exception_sync_page_fault" +harness = false diff --git a/14_exceptions_part2_peripheral_IRQs/Makefile b/14_exceptions_part2_peripheral_IRQs/Makefile new file mode 100644 index 00000000..a006eb87 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/Makefile @@ -0,0 +1,166 @@ +## SPDX-License-Identifier: MIT OR Apache-2.0 +## +## Copyright (c) 2018-2020 Andre Richter + +# Default to the RPi3 +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 + 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/raspberrypi/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/raspberrypi/link.ld + RUSTC_MISC_ARGS = -C target-cpu=cortex-a72 +endif + +# Testing-specific arguments +ifdef TEST + ifeq ($(TEST),unit) + TEST_ARG = --lib + else + TEST_ARG = --test $(TEST) + endif +endif + +QEMU_MISSING_STRING = "This board is not yet supported for QEMU." + +RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) +RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs +FEATURES = bsp_$(BSP) + +SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) + +X_CMD_ARGS = --target=$(TARGET) \ + --features $(FEATURES) \ + --release +XRUSTC_CMD = cargo xrustc $(X_CMD_ARGS) +XTEST_CMD = cargo xtest $(X_CMD_ARGS) + +CARGO_OUTPUT = target/$(TARGET)/release/kernel + +OBJCOPY_CMD = cargo objcopy \ + -- \ + --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 + +all: clean $(OUTPUT) + +$(CARGO_OUTPUT): $(SOURCES) + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XRUSTC_CMD) + +$(OUTPUT): $(CARGO_OUTPUT) + cp $< . + $(OBJCOPY_CMD) $< $(OUTPUT) + +doc: + cargo xdoc --target=$(TARGET) --features bsp_$(BSP) --document-private-items --open + +qemu: FEATURES += --features qemu-quirks +ifeq ($(QEMU_MACHINE_TYPE),) +qemu: + @echo $(QEMU_MISSING_STRING) + +test: + @echo $(QEMU_MISSING_STRING) +else +qemu: all + @$(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_DIR_TUT) $(DOCKER_IMAGE) \ + ruby tests/runner.rb $(DOCKER_EXEC_QEMU) $(QEMU_TEST_ARGS) -kernel $$TEST_BINARY +endef + +export KERNEL_TEST_RUNNER +test: FEATURES += --features qemu-quirks +test: $(SOURCES) + @mkdir -p target + @echo "$$KERNEL_TEST_RUNNER" > target/kernel_test_runner.sh + @chmod +x target/kernel_test_runner.sh + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" $(XTEST_CMD) $(TEST_ARG) +endif + +chainboot: all + @$(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_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) $(DOCKER_IMAGE) \ + openocd $(OPENOCD_ARG) + +define gen_gdb + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC) $1" $(XRUSTC_CMD) + cp $(CARGO_OUTPUT) 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) + $(call gen_gdb,-C debuginfo=2) + +gdb-opt0: clean $(SOURCES) + $(call gen_gdb,-C debuginfo=2 -C opt-level=0) + +clippy: + RUSTFLAGS="$(RUSTFLAGS_PEDANTIC)" cargo xclippy --target=$(TARGET) --features bsp_$(BSP) + +clean: + rm -rf target + +readelf: + readelf -a kernel + +objdump: + cargo objdump --target $(TARGET) -- -disassemble -no-show-raw-insn -print-imm-hex kernel + +nm: + cargo nm --target $(TARGET) -- -print-size kernel | sort diff --git a/14_exceptions_part2_peripheral_IRQs/README.md b/14_exceptions_part2_peripheral_IRQs/README.md new file mode 100644 index 00000000..03003fd3 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/README.md @@ -0,0 +1,2940 @@ +# Tutorial 14 - Exceptions Part 2: Peripheral IRQs + +## tl;dr + +- We write `device drivers` for the two interrupt controllers on the **Raspberry Pi 3** (Broadcom + custom controller) and **Pi 4** (ARM Generic Interrupt Controller v2, `GICv2`). +- Modularity is ensured by interfacing everything through a trait named `IRQManager`. +- Handling for our first peripheral IRQ is implemented: The `UART`'s receive IRQ - one IRQ per + received character. + + + +## Table of Contents + +- [Introduction](#introduction) +- [Different Controllers: A Usecase for Abstraction](#different-controllers-a-usecase-for-abstraction) +- [New Challenges: Reentrancy](#new-challenges-reentrancy) +- [Implementation](#implementation) + * [The Kernel's Interfaces for Interrupt Handling](#the-kernels-interfaces-for-interrupt-handling) + + [Uniquely Identifying an IRQ](#uniquely-identifying-an-irq) + - [The BCM IRQ Number Scheme](#the-bcm-irq-number-scheme) + - [The GICv2 IRQ Number Scheme](#the-gicv2-irq-number-scheme) + + [Registering IRQ Handlers](#registering-irq-handlers) + + [Handling Pending IRQs](#handling-pending-irqs) + * [Reentrancy: What to protect?](#reentrancy-what-to-protect) + * [The Interrupt Controller Device Drivers](#the-interrupt-controller-device-drivers) + + [The BCM Driver (Pi 3)](#the-bcm-driver-pi-3) + - [Peripheral Controller Register Access](#peripheral-controller-register-access) + - [The IRQ Handler Table](#the-irq-handler-table) + + [The GICv2 Driver (Pi 4)](#the-gicv2-driver-pi-4) + - [GICC Details](#gicc-details) + - [GICD Details](#gicd-details) +- [UART hack](#uart-hack) +- [Test it](#test-it) +- [Diff to previous](#diff-to-previous) + +## Introduction + +In [tutorial 12], we laid the groundwork for exception handling from the processor architecture +side. Handler stubs for the different exception types were set up, and a first glimpse at exception +handling was presented by causing a `synchronous` exception by means of a `page fault`. + +[tutorial 12]: ../12_exceptions_part1_groundwork + +In this tutorial, we will add a first level of support for one of the three types of `asynchronous` +exceptions that are defined for `AArch64`: `IRQs`. The overall goal for this tutorial is to get rid +of the busy-loop at the end of our current `kernel_main()` function, which actively polls the +`UART` for newly received characters. Instead, we will let the processor idle and wait for the +`UART`'s RX IRQ, which indicates that a new character was received. A respective `IRQ` service +routine, provided by the `UART` driver, will run in response to the `IRQ` and print the character. + +## Different Controllers: A Usecase for Abstraction + +One very exciting aspect of this tutorial is that the `Pi 3` and the `Pi 4` feature completely +different interrupt controllers. This is also a first in all of the tutorial series. Until now, both +Raspberrys did not need differentiation with respect to their devices. + +The `Pi 3` has a very simple custom controller made by Broadcom (BCM), the manufacturer of the Pi's +`System-on-Chip`. The `Pi 4` features an implementation of `ARM`'s Generic Interrupt Controller +version 2 (`GICv2`). Since ARM's GIC controllers are the prevalent interrupt controllers in ARM +application procesors, it is very beneficial to finally have it on the Raspberry Pi. It will enable +people to learn about one of the most common building blocks in ARM-based embedded computing. + +This also means that we can finally make full use of all the infrastructure for abstraction that we +prepared already. We will design an `IRQManager` interface trait and implement it in both controller +drivers. The generic part of our `kernel` code will only be exposed to this trait (compare to the +diagram in the [tl;dr] section). This common idiom of *program to an interface, not an +implementation* enables a clean abstraction and makes the code modular and pluggable. + +[tl;dr]: #tldr + +## New Challenges: Reentrancy + +Enabling interrupts also poses new challenges with respect to protecting certain code sections in +the kernel from being [re-entered]. Please read the linked article for background on that topic. + +[re-entered]: https://en.wikipedia.org/wiki/Reentrancy_(computing) + +Our `kernel` is still running on a single core. For this reason, we are still using our `NullLock` +pseudo-locks for `Critical Sections` or `shared resources`, instead of real `Spinlocks`. Hence, +interrupt handling at this point in time does not put us at risk of running into one of those +dreaded `deadlocks`, which is one of several side-effects that reentrancy can cause. For example, a +`deadlock` because of interrupts can happen happen when the executing CPU core has locked a +`Spinlock` at the beginning of a function, an IRQ happens, and the IRQ service routine is trying to +execute the same function. Since the lock is already locked, the core would spin forever waiting for +it to be released. + +There is no straight-forward way to tell if a function is `reentrantcy`-safe or not. It usually +needs careful manual checking to conclude. Even though it might be technically safe to `re-enter` a +function, sometimes you don't want that to happen for functional reasons. For example, printing of a +string should not be interrupted by a an interrupt service routine that starts printing another +string, so that the output mixes. In the course of this tutorial, we will check and see where we +want to protect against `reentrancy`. + +## Implementation + +Okay, let's start. The following sections cover the the implementation in a top-down fashion, +starting with the trait that interfaces all the `kernel` components to each other. + +### The Kernel's Interfaces for Interrupt Handling + +First, we design the `IRQManager` trait that interrupt controller drivers must implement. The +minimal set of functionality that we need for starters is: + +1. Registering an IRQ `handler` for a given IRQ `number`. +2. Enabling an IRQ (from the controller side). +3. Handling pending IRQs. +4. Printing the list of registered IRQ handlers. + +The trait is defined as `exception::asynchronous::interface::IRQManager`: + +```rust +pub trait IRQManager { + /// The IRQ number type depends on the implementation. + type IRQNumberType; + + /// Register a handler. + fn register_handler( + &self, + irq_number: Self::IRQNumberType, + descriptor: super::IRQDescriptor, + ) -> Result<(), &'static str>; + + /// Enable an interrupt in the controller. + fn enable(&self, irq_number: Self::IRQNumberType); + + /// Handle pending interrupts. + /// + /// This function is called directly from the CPU's IRQ exception vector. On AArch64, + /// this means that the respective CPU core has disabled exception handling. + /// This function can therefore not be preempted and runs start to finish. + /// + /// Takes an IRQContext token to ensure it can only be called from IRQ context. + #[allow(clippy::trivially_copy_pass_by_ref)] + fn handle_pending_irqs<'irq_context>( + &'irq_context self, + ic: &super::IRQContext<'irq_context>, + ); + + /// Print list of registered handlers. + fn print_handler(&self); +} +``` + +#### Uniquely Identifying an IRQ + +The first member of the trait is the [associated type] `IRQNumberType`. The following explains why +we make it customizable for the implementor and do not define the type as a plain integer right +away. + +Interrupts can generally be characterizied with the following properties: + +[associated type]: https://doc.rust-lang.org/book/ch19-03-advanced-traits.html#specifying-placeholder-types-in-trait-definitions-with-associated-types + +1. Software-generated vs hardware-generated. +2. Private vs shared. + +Different interrupt controllers take different approaches at categorizing and numbering IRQs that +have one or the other property. Often times, this leads to situations where a plain integer does not +suffice to uniquely identify an IRQ, and makes it necessary to encode additional information in the +used type. Letting the respective interrupt controller driver define `IRQManager::IRQNumberType` +itself addresses this issue. The rest of the `BSP` must then conditionally use this type. + +##### The BCM IRQ Number Scheme + +The `BCM` controller of the `Raspberry Pi 3`, for example, is composed of two functional parts: A +**local** controller and a **peripheral** controller. The BCM's **local controller** handles all +`private` IRQs, which means private SW-generated IRQs and IRQs of private HW devices. An example for +the latter would be the `ARMv8` timer. Each CPU core has its own private instance of it. The BCM's +**peripheral controller** handles all IRQs of `non-private` HW devices such as the `UART` (if those +IRQs can be declared as `shared` according to our taxonomy above is a different discussion, because +the BCM controller allows these HW interrupts to be routed to _only one CPU core at a time_). + +The IRQ numbers of the BCM **local controller** range from `0..11`. The numbers of the **peripheral +controller** range from `0..63`. This demonstrates why a primitive integer type would not be +sufficient to uniquely encode the IRQs, because their ranges overlap. In the driver for the `BCM` +controller, we therefore define the associated type as follows: + +```rust +pub type LocalIRQ = + exception::asynchronous::IRQNumber<{ InterruptController::MAX_LOCAL_IRQ_NUMBER }>; +pub type PeripheralIRQ = + exception::asynchronous::IRQNumber<{ InterruptController::MAX_PERIPHERAL_IRQ_NUMBER }>; + +/// Used for the associated type of trait [`exception::asynchronous::interface::IRQManager`]. +#[derive(Copy, Clone)] +pub enum IRQNumber { + Local(LocalIRQ), + Peripheral(PeripheralIRQ), +} +``` + +The type `exception::asynchronous::IRQNumber` is a newtype around an `usize` that uses a [const +generic] to ensure that the value of the encapsulated IRQ number is in the allowed range (e.g. +`0..MAX_LOCAL_IRQ_NUMBER` for `LocalIRQ`, with `MAX_LOCAL_IRQ_NUMBER == 11`). + +[const generic]: https://github.com/rust-lang/rfcs/blob/master/text/2000-const-generics.md + +##### The GICv2 IRQ Number Scheme + +The `GICv2` in the `Raspberry Pi 4`, on the other hand, uses a different scheme. IRQ numbers `0..31` +are for `private` IRQs. Those are further subdivided into `SW-generated` (SGIs, `0..15`) and +`HW-generated` (PPIs, Private Peripheral Interrupts, `16..31`). Numbers `32..1019` are for `shared +hardware-generated` interrupts (SPI, Shared Peripheral Interrupts). + +There are no overlaps, so this scheme enables us to actually have a plain integer as a unique +identifier for the IRQs. We define the type as follows: + +```rust +/// Used for the associated type of trait [`exception::asynchronous::interface::IRQManager`]. +pub type IRQNumber = exception::asynchronous::IRQNumber<{ GICv2::MAX_IRQ_NUMBER }>; +``` + +#### Registering IRQ Handlers + +To enable the controller driver to manage interrupt handling, it must know where to find respective +handlers, and it must know how to call them. For the latter, we define an `IRQHandler` trait in +`exception::asynchronous` that must be implemented by any SW entity that wants to handle IRQs: + +```rust +/// Implemented by types that handle IRQs. +pub trait IRQHandler { + /// Called when the corresponding interrupt is asserted. + fn handle(&self) -> Result<(), &'static str>; +} +``` + +The `PL011Uart` driver gets the honors for being our first driver to ever implement this trait. In +this tutorial, only receive (RX) interrupts are enabled, and there will be one RX IRQ fired for each +character that is received. In the handler, our standard scheme of echoing any received characters +back to the host is used: + +```rust +impl exception::asynchronous::interface::IRQHandler for PL011Uart { + fn handle(&self) -> Result<(), &'static str> { + let mut r = &self.inner; + r.lock(|inner| { + // Echo any received characters. + loop { + match inner.read_char_converting(false) { + None => break, + Some(c) => inner.write_char(c), + } + } + }); + + Ok(()) + } +} +``` + +Registering and enabling handlers in the interrupt controller is supposed to be done by the +respective drivers themselves. Therefore, we added a new function to the standard device driver +trait in `driver::interface::DeviceDriver` that must be implemented if IRQ handling is supported: + +```rust +/// Called by the kernel to register and enable the device's IRQ handlers, if any. +/// +/// Rust's type system will prevent a call to this function unless the calling instance +/// itself has static lifetime. +fn register_and_enable_irq_handler(&'static self) -> Result<(), &'static str> { + Ok(()) +} +``` + +Here is the implementation for the `PL011Uart`: + +```rust +fn register_and_enable_irq_handler(&'static self) -> Result<(), &'static str> { + use bsp::exception::asynchronous::irq_manager; + use exception::asynchronous::{interface::IRQManager, IRQDescriptor}; + + let descriptor = IRQDescriptor { + name: "BCM PL011 UART", + handler: self, + }; + + irq_manager().register_handler(self.irq_number, descriptor)?; + irq_manager().enable(self.irq_number); + + Ok(()) +} +``` + +The `bsp::exception::asynchronous::irq_manager()` function used here returns a reference to an +implementor of the `IRQManager` trait. Since the implementation is supposed to be done by the +platform's interrupt controller, this call will redirect to the `kernel`'s instance of either the +driver for the `BCM` controller (`Raspberry Pi 3`) or the driver for the `GICv2` (`Pi 4`). We will +look into the implementation of the `register_handler()` function from the driver's perspective +later. The gist here is that the calls on `irq_manager()` will make the platform's interrupt +controller aware that the `UART` driver (i) wants to handle its interrupt and (ii) which function it +provides to do so. + +Also note how `irq_number` is a member of the `PL011Uart` struct and not hardcoded. The reason is +that the `UART` driver code is agnostic about the **IRQ numbers** that are associated to it. This is +vendor-supplied information and as such typically part of the Board Support Package (`BSP`). It can +vary from `BSP` to `BSP`, same like the board's memory map, which provides the `UART`'s MMIO +register addresses. Therefore, we extend the instantiation of the `UART` driver accordingly, so that +the `BSP` now additionally provides the IRQ number as an argument: + +```rust +static PL011_UART: device_driver::PL011Uart = unsafe { + device_driver::PL011Uart::new( + memory::map::mmio::PL011_UART_BASE, + exception::asynchronous::irq_map::PL011_UART, + ) +}; +``` + +With all this in place, we can finally let drivers register and enable their IRQ handlers with the +interrupt controller, and unmask IRQ reception on the boot CPU core during the kernel init phase in +`main.rs`. After unmasking, IRQ handling is live: + +```rust +// Let device drivers register and enable their handlers with the interrupt controller. +for i in bsp::driver::driver_manager().all_device_drivers() { + if let Err(msg) = i.register_and_enable_irq_handler() { + warn!("Error registering IRQ handler: {}", msg); + } +} + +// Unmask interrupts on the boot CPU core. +exception::asynchronous::local_irq_unmask(); +``` + +#### Handling Pending IRQs + +Now that interrupts can happen, the `kernel` needs a way of requesting the interrupt controller +driver to handle pending interrupts. Therefore, implementors of the trait `IRQManager` must also +supply the following function: + +```rust +fn handle_pending_irqs<'irq_context>( + &'irq_context self, + ic: &super::IRQContext<'irq_context>, +); +``` + +An important aspect of this function signature is that we want to ensure that IRQ handling is only +possible from IRQ context. Part of the reason is that this invariant allows us to make some implicit +assumptions (which might depend on the target architecture, though). For example, as we have learned +in [tutorial 12], in `AArch64`, _"all kinds of exceptions are turned off upon taking an exception, +so that by default, exception handlers can not get interrupted themselves"_ (note that an IRQ is an +exception). This is a useful property that relieves us from explicitly protecting IRQ handling from +being interrupted itself. Another reason would be that calling IRQ handling functions from arbitrary +execution contexts just doesn't make a lot of sense. + +[tutorial 12]: ../12_exceptions_part1_groundwork/ + +So in order to ensure that this function is only being called from IRQ context, we borrow a +technique that I first saw in the [Rust embedded WG]'s [bare-metal crate]. It uses Rust's type +system to create a "token" that is only valid for the duration of the IRQ context. We create it +directly at the top of the IRQ vector function in `_arch/aarch64/exception.rs`, and pass it on to +the the implementation of the trait's handling function: + +[Rust embedded WG]: https://github.com/rust-embedded/bare-metal +[bare-metal crate]: https://github.com/rust-embedded/bare-metal/blob/master/src/lib.rs#L20 + +```rust +#[no_mangle] +unsafe extern "C" fn current_elx_irq(_e: &mut ExceptionContext) { + use exception::asynchronous::interface::IRQManager; + + let token = &exception::asynchronous::IRQContext::new(); + bsp::exception::asynchronous::irq_manager().handle_pending_irqs(token); +} +``` + +By requiring the caller of the function `handle_pending_irqs()` to provide this `IRQContext` token, +we can prevent that the same function is accidentally being called from somewhere else. It is +evident, though, that for this to work, it is the _user's responsibility_ to only ever create this +token from within an IRQ context. If you want to circumvent this on purpose, you can do it. + +### Reentrancy: What to protect? + +Now that interrupt handling is live, we need to think about `reentrancy`. At [the beginning of this +tutorial], we mused about the need to protect certain functions from being re-entered, and that it +is not straight-forward to identify all the places that need protection. + +[the beginning of this tutorial]: #new-challenges-reentrancy + +In this tutorial, we will keep this part short nonetheless by taking a better-safe-than-sorry +approach. In the past, we already made efforts to prepare parts of `shared resources` (e.g. global +device driver instances) to be protected against parallel access. We did so by wrapping them into +`NullLocks`, which we will upgrade to real `Spinlocks` once we boot secondary CPU cores. + +We can hook on that previous work and reason that anything that we wanted protected against parallel +access so far, we also want it protected against reentrancy now. Therefore, we upgrade all +`NullLocks` to `IRQSafeNullocks`: + +```rust +impl interface::Mutex for &IRQSafeNullLock { + type Data = T; + + fn lock(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R { + // In a real lock, there would be code encapsulating this line that ensures that this + // mutable reference will ever only be given out once at a time. + let data = unsafe { &mut *self.data.get() }; + + // Execute the closure while IRQs are masked. + exception::asynchronous::exec_with_irq_masked(|| f(data)) + } +} +``` + +The new part is that the call to `f(data)` is executed as a closure in +`exception::asynchronous::exec_with_irq_masked()`. Inside that function, IRQs on the executing CPU +core are masked before the `f(data)` is being executed, and restored afterwards: + +```rust +/// Executes the provided closure while IRQs are masked on the executing core. +/// +/// While the function temporarily changes the HW state of the executing core, it restores it to the +/// previous state before returning, so this is deemed safe. +#[inline(always)] +pub fn exec_with_irq_masked(f: impl FnOnce() -> T) -> T { + let ret: T; + + unsafe { + let saved = local_irq_mask_save(); + ret = f(); + local_irq_restore(saved); + } + + ret +} +``` + +The helper functions used here are defined in `src/_arch/aarch64/exception/asynchronous.rs`. + +### The Interrupt Controller Device Drivers + +The previous sections explained how the `kernel` uses the `IRQManager` trait. Now, let's have a look +at the driver-side of it in the Raspberry Pi `BSP`. We start with the Broadcom interrupt controller +featured in the `Pi 3`. + +#### The BCM Driver (Pi 3) + +As mentioned earlier, the `BCM` driver consists of two subcomponents, a **local** and a +**peripheral** controller. The local controller owns a bunch of configuration registers, among +others, the `routing` configuration for peripheral IRQs such as those from the `UART`. Peripheral +IRQs can be routed to _one core only_. In our case, we leave the default unchanged, which means +everything is routed to the boot CPU core. The image below depicts the `struct diagram` of the +driver implementation. + + + +We have a top-level driver, which implements the `IRQManager` trait. _Only the top-level driver_ is +exposed to the rest of the `kernel`. The top-level itself has two members, representing the local +and the peripheral controller, respectively, which implement the `IRQManager` trait as well. This +design allows for easy forwarding of function calls from the top-level driver to one of the +subcontrollers. + +For this tutorial, we leave out implementation of the local controller, because we will only be +concerned with the peripheral `UART` IRQ. + +##### Peripheral Controller Register Access + +When writing a device driver for a kernel with exception handling and multi-core support, it is +always important to analyze what parts of the driver will need protection against reentrancy (we +talked about this earlier in this tutorial) and/or parallel execution of other driver parts. If a +driver function needs to follow a vendor-defined sequence of multiple register operations that +include `write operations`, this is usually a good hint that protection might be needed. But that is +only one of many examples. + +For the driver implementation in this tutorial, we are following a simple rule: Register read access +is deemed always safe. Write access is guarded by an `IRQSafeNullLock`, which means that we are safe +against `reentrancy` issues, and also in the future when the kernel will be running on multiple +cores, we can easily upgrade to a real spinlock, which serializes register write operations from +different CPU cores. + +In fact, for this tutorial, we probably would not have needed any protection yet, because all the +driver does is read from the `PENDING_*` registers for the `handle_pending_irqs()` implementation, +and writing to the `ENABLE_*` registers for the `enable()` implementation. However, the chosen +architecture will have us set up for future extensions, when more complex register manipulation +sequences might be needed. + +Since nothing complex is happening in the implementation, it is not covered in detail here. Please +refer to [the source of the **peripheral** controller] to check it out. + +[the source of the **peripheral** controller]: src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller/peripheral_ic.rs + +##### The IRQ Handler Table + +Calls to `register_handler()` result in the driver inserting the provided handler reference in a +specific table (the handler reference is a member of `IRQDescriptor`): + +```rust +type HandlerTable = + [Option; InterruptController::NUM_PERIPHERAL_IRQS]; +``` + +One of the requirements for safe operation of the `kernel` is that those handlers are not +registered, removed or exchanged in the middle of an IRQ handling situation. This, again, is a +multi-core scenario where one core might look up a handler entry while another core is modifying the +same in parallel. + +While we want to allow drivers to take the decision of registering or not registering a handler at +runtime, there is no need to allow it for the _whole_ runtime of the kernel. It is fine to restrict +this option to the kernel `init phase`, at which only a single boot core runs and IRQs are masked. + +We introduce the so called `InitStateLock` for cases like that. From an API-perspective, it is a +special variant of a `Read/Write exclusion synchronization primitive`. RWLocks in the Rust standard +library [are characterized] as allowing _"a number of readers or at most one writer at any point in +time"_. For the `InitStateLock`, we only implement the `read()` and `write()` functions: + +[are characterized]: https://doc.rust-lang.org/std/sync/struct.RwLock.html + +```rust +impl interface::ReadWriteEx for &InitStateLock { + type Data = T; + + fn write(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R { + assert!( + state::state_manager().state() == state::State::Init, + "InitStateLock::write called after kernel init phase" + ); + assert!( + !exception::asynchronous::is_local_irq_masked(), + "InitStateLock::write called with IRQs unmasked" + ); + + let data = unsafe { &mut *self.data.get() }; + + f(data) + } + + fn read(&mut self, f: impl FnOnce(&Self::Data) -> R) -> R { + let data = unsafe { &*self.data.get() }; + + f(data) + } +} +``` + +The `write()` function is guarded by two `assertions`. One ensures that IRQs are masked, the other +checks the `state::state_manager()` if the kernel is still in the init phase. The `State Manager` is +new since this tutorial, and implemented in `src/state.rs`. It provides atomic state transition and +reporting functions that are called when the kernel enters a new phase. In the current kernel, the +only call is happening before the transition from `kernel_init()` to `kernel_main()`: + +```rust +// Announce conclusion of the kernel_init() phase. +state::state_manager().transition_to_single_core_main(); +``` + +#### The GICv2 Driver (Pi 4) + +As we learned earlier, the ARM `GICv2` in the `Raspberry Pi 4` features a continuous interrupt +number range: +- IRQ numbers `0..31` represent IRQs that are private (aka local) to the respective processor core. +- IRQ numbers `32..1019` are for shared IRQs. + +The `GIC` has a so-called `Distributor`, the `GICD`, and a `CPU Interface`, the `GICC`. The `GICD`, +among other things, is used to enable IRQs and route them to one or more CPU cores. The `GICC` is +used by CPU cores to check which IRQs are pending, and to acknowledge them once they were handled. +There is one dedicated `GICC` for _each CPU core_. + +One neat thing about the `GICv2` is that any MMIO registers that are associated to core-private IRQs +are `banked`. That means that different CPU cores can assert the same MMIO address, but they will +end up accessing a core-private copy of the referenced register. This makes it very comfortable to +program the `GIC`, because this hardware design ensures that each core only ever gets access to its +own resources. Preventing one core to accidentally or willfully fiddle with the IRQ state of another +core must therefore not be enforced in software. + +In summary, this means that any registers in the `GICD` that deal with the core-private IRQ range +are banked. Since there is one `GICC` per CPU core, the whole thing is banked. This allows us to +design the following `struct diagram` for our driver implementation: + + + +The top-level struct is composed of a `GICD`, a `GICC` and a `HandlerTable`. The latter is +implemented identically as in the `Pi 3`. + +##### GICC Details + +Since the `GICC` is banked wholly, the top-level driver can directly forward any requests to it, +without worrying about concurrency issues for now. Note that this only works as long as the `GICC` +implementation is only accessing the banked `GICC` registers, and does not save any state in member +variables that are stored in `DRAM`. The two main duties of the `GICC` struct are to read the `IAR` +(Interrupt Acknowledge) register, which returns the number of the highest-priority pending IRQ, and +writing to the `EOIR` (End Of Interrupt) register, which tells the hardware that handling of an +interrupt is now concluded. + +##### GICD Details + +The `GICD` hardware block differentiates between `shared` and `banked` registers. As with the +`GICC`, we don't have to protect the banked registers against concurrent access. The shared +registers are wrapped into an `IRQSafeNullLock` again. The important parts of the `GICD` for this +tutorial are the `ITARGETSR[256]` and `ISENABLER[32]` register arrays. + +Each `ITARGETSR` is subdivided into four _bytes_. Each byte represents one IRQ, and stores a bitmask +that encodes all the `GICCs` to which the respective IRQ is forwarded. For example, +`ITARGETSR[0].byte0` would represent IRQ number 0, and `ITARGETSR[0].byte3` IRQ number 3. In the +`ISENABLER`, each _bit_ represents an IRQ. For example, `ISENABLER[0].bit3` is IRQ number 3. + +In summary, this means that `ITARGETSR[0..7]` and `ISENABLER[0]` represent the first 32 IRQs (the +banked ones), and as such, we split the register block into `shared` and `banked` parts accordingly +in `gicd.rs`: + +```rust +register_structs! { + #[allow(non_snake_case)] + SharedRegisterBlock { + (0x000 => CTLR: ReadWrite), + (0x004 => TYPER: ReadOnly), + (0x008 => _reserved1), + (0x104 => ISENABLER: [ReadWrite; 31]), + (0x108 => _reserved2), + (0x820 => ITARGETSR: [ReadWrite; 248]), + (0xBFC => @END), + } +} + +register_structs! { + #[allow(non_snake_case)] + BankedRegisterBlock { + (0x000 => _reserved1), + (0x100 => ISENABLER: ReadWrite), + (0x104 => _reserved2), + (0x800 => ITARGETSR: [ReadOnly; 8]), + (0xBFC => @END), + } +} +``` + +As with the implementation of the BCM interrupt controller driver, we won't cover the remaining +parts in exhaustive detail. For that, please refer to [this folder] folder which contains all the +sources. + +[this folder]: src/bsp/device_driver/arm + +## UART hack + +In the introduction, we stated that we want to set up the system such that the `UART` fires one IRQ +per received character. As it turns out, this usually common mode of operation is not natively +supported by the Raspberry's `PL011 UART` when receive FIFOs are activated. We can only set a +relative FIFO fill level at which the first IRQ is fired. The lowest fill level is `1/8` of the RX +FIFO size, which translates to `2 characters` for the `Pi 3` and `4 characters` for the `Pi 4`. + +To circumvent this constraint, we added a hack to the `UART` driver that "abuses" debug facilities +of the controller to always pre-fill the RX FIFOs to one character short of the `1/8` fill level. +This enusres that the next real character received from the connected user will fire an IRQ. + +To make things even more convoluted, `QEMU` does not emulate the fill-level-based IRQ generation, +but generates an IRQ on every received character. In the end, this whole situation adds a bit of +conditional-compilation mumbo-jumbo to the `UART` driver. But hey, it works! + +## Test it + +When you load the kernel, any keystroke results in echoing back the character by way of IRQ +handling. There is no more polling done at the end of `kernel_main()`, just waiting for events such +as IRQs: + +```rust +fn kernel_main() -> ! { + + // omitted for brevity + + info!("Echoing input now"); + cpu::wait_forever(); +} +``` + +Raspberry Pi 3: + +```console +$ make chainboot +[...] +Minipush 1.0 + +[MP] ⏳ Waiting for /dev/ttyUSB0 +[MP] ✅ Connected + __ __ _ _ _ _ +| \/ (_)_ _ (_) | ___ __ _ __| | +| |\/| | | ' \| | |__/ _ \/ _` / _` | +|_| |_|_|_||_|_|____\___/\__,_\__,_| + + Raspberry Pi 3 + +[ML] Requesting binary +[MP] ⏩ Pushing 66 KiB ========================================🦀 100% 33 KiB/s Time: 00:00:02 +[ML] Loaded! Executing the payload now + +[ 3.134937] Booting on: Raspberry Pi 3 +[ 3.136023] MMU online. Special regions: +[ 3.137934] 0x00080000 - 0x0008ffff | 64 KiB | C RO PX | Kernel code and RO data +[ 3.142017] 0x3f000000 - 0x4000ffff | 16 MiB | Dev RW PXN | Device MMIO +[ 3.145579] Current privilege level: EL1 +[ 3.147490] Exception handling state: +[ 3.149271] Debug: Masked +[ 3.150835] SError: Masked +[ 3.152398] IRQ: Unmasked +[ 3.154049] FIQ: Masked +[ 3.155613] Architectural timer resolution: 52 ns +[ 3.157915] Drivers loaded: +[ 3.159262] 1. BCM GPIO +[ 3.160695] 2. BCM PL011 UART +[ 3.162389] 3. BCM Interrupt Controller +[ 3.164518] Registered IRQ handlers: +[ 3.166255] Peripheral handler: +[ 3.168038] 57. BCM PL011 UART +[ 3.170078] Echoing input now +``` + +Raspberry Pi 4: + +```console +$ BSP=rpi4 make chainboot +[...] +Minipush 1.0 + +[MP] ⏳ Waiting for /dev/ttyUSB0 +[MP] ✅ Connected + __ __ _ _ _ _ +| \/ (_)_ _ (_) | ___ __ _ __| | +| |\/| | | ' \| | |__/ _ \/ _` / _` | +|_| |_|_|_||_|_|____\___/\__,_\__,_| + + Raspberry Pi 4 + +[ML] Requesting binary +[MP] ⏩ Pushing 73 KiB ========================================🦀 100% 24 KiB/s Time: 00:00:03 +[ML] Loaded! Executing the payload now + +[ 3.413865] Booting on: Raspberry Pi 4 +[ 3.414255] MMU online. Special regions: +[ 3.416166] 0x00080000 - 0x0008ffff | 64 KiB | C RO PX | Kernel code and RO data +[ 3.420249] 0xfe000000 - 0xff84ffff | 24 MiB | Dev RW PXN | Device MMIO +[ 3.423811] Current privilege level: EL1 +[ 3.425722] Exception handling state: +[ 3.427503] Debug: Masked +[ 3.429067] SError: Masked +[ 3.430630] IRQ: Unmasked +[ 3.432281] FIQ: Masked +[ 3.433845] Architectural timer resolution: 18 ns +[ 3.436147] Drivers loaded: +[ 3.437494] 1. BCM GPIO +[ 3.438927] 2. BCM PL011 UART +[ 3.440621] 3. GICv2 (ARM Generic Interrupt Controller v2) +[ 3.443575] Registered IRQ handlers: +[ 3.445312] Peripheral handler: +[ 3.447096] 153. BCM PL011 UART +[ 3.449136] Echoing input now +``` + +## Diff to previous +```diff + +diff -uNr 13_integrated_testing/Cargo.toml 14_exceptions_part2_peripheral_IRQs/Cargo.toml +--- 13_integrated_testing/Cargo.toml ++++ 14_exceptions_part2_peripheral_IRQs/Cargo.toml +@@ -12,6 +12,7 @@ + default = [] + bsp_rpi3 = ["cortex-a", "register"] + bsp_rpi4 = ["cortex-a", "register"] ++qemu-quirks = [] + + [dependencies] + qemu-exit = "0.1.x" + +diff -uNr 13_integrated_testing/Makefile 14_exceptions_part2_peripheral_IRQs/Makefile +--- 13_integrated_testing/Makefile ++++ 14_exceptions_part2_peripheral_IRQs/Makefile +@@ -50,11 +50,12 @@ + + RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS) + RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs ++FEATURES = bsp_$(BSP) + + SOURCES = $(wildcard **/*.rs) $(wildcard **/*.S) $(wildcard **/*.ld) + + X_CMD_ARGS = --target=$(TARGET) \ +- --features bsp_$(BSP) \ ++ --features $(FEATURES) \ + --release + XRUSTC_CMD = cargo xrustc $(X_CMD_ARGS) + XTEST_CMD = cargo xtest $(X_CMD_ARGS) +@@ -91,6 +92,7 @@ + doc: + cargo xdoc --target=$(TARGET) --features bsp_$(BSP) --document-private-items --open + ++qemu: FEATURES += --features qemu-quirks + ifeq ($(QEMU_MACHINE_TYPE),) + qemu: + @echo $(QEMU_MISSING_STRING) +@@ -113,6 +115,7 @@ + endef + + export KERNEL_TEST_RUNNER ++test: FEATURES += --features qemu-quirks + test: $(SOURCES) + @mkdir -p target + @echo "$$KERNEL_TEST_RUNNER" > target/kernel_test_runner.sh + +diff -uNr 13_integrated_testing/src/_arch/aarch64/exception/asynchronous.rs 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception/asynchronous.rs +--- 13_integrated_testing/src/_arch/aarch64/exception/asynchronous.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception/asynchronous.rs +@@ -10,6 +10,10 @@ + // Private Definitions + //-------------------------------------------------------------------------------------------------- + ++mod daif_bits { ++ pub const IRQ: u8 = 0b0010; ++} ++ + trait DaifField { + fn daif_field() -> register::Field; + } +@@ -55,6 +59,71 @@ + // Public Code + //-------------------------------------------------------------------------------------------------- + ++/// Returns whether IRQs are masked on the executing core. ++pub fn is_local_irq_masked() -> bool { ++ !is_masked::() ++} ++ ++/// Unmask IRQs on the executing core. ++/// ++/// It is not needed to place an explicit instruction synchronization barrier after the `msr`. ++/// Quoting the Architecture Reference Manual for ARMv8-A, section C5.1.3: ++/// ++/// "Writes to PSTATE.{PAN, D, A, I, F} occur in program order without the need for additional ++/// synchronization." ++/// ++/// # Safety ++/// ++/// - Changes the HW state of the executing core. ++#[inline(always)] ++pub unsafe fn local_irq_unmask() { ++ asm!("msr DAIFClr, $0" ++ : // outputs ++ : "i"(daif_bits::IRQ) // inputs ++ : // clobbers ++ : "volatile" // options ++ ); ++} ++ ++/// Mask IRQs on the executing core. ++/// ++/// # Safety ++/// ++/// - Changes the HW state of the executing core. ++#[inline(always)] ++pub unsafe fn local_irq_mask() { ++ asm!("msr DAIFSet, $0" ++ : // outputs ++ : "i"(daif_bits::IRQ) // inputs ++ : // clobbers ++ : "volatile" // options ++ ); ++} ++ ++/// Mask IRQs on the executing core and return the previously saved interrupt mask bits (DAIF). ++/// ++/// # Safety ++/// ++/// - Changes the HW state of the executing core. ++#[inline(always)] ++pub unsafe fn local_irq_mask_save() -> u32 { ++ let saved = DAIF.get(); ++ local_irq_mask(); ++ ++ saved ++} ++ ++/// Restore the interrupt mask bits (DAIF) using the callee's argument. ++/// ++/// # Safety ++/// ++/// - Changes the HW state of the executing core. ++/// - No sanity checks on the input. ++#[inline(always)] ++pub unsafe fn local_irq_restore(saved: u32) { ++ DAIF.set(saved); ++} ++ + /// Print the AArch64 exceptions status. + #[rustfmt::skip] + pub fn print_state() { + +diff -uNr 13_integrated_testing/src/_arch/aarch64/exception.rs 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception.rs +--- 13_integrated_testing/src/_arch/aarch64/exception.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception.rs +@@ -4,6 +4,7 @@ + + //! Architectural synchronous and asynchronous exception handling. + ++use crate::{bsp, exception}; + use core::fmt; + use cortex_a::{barrier, regs::*}; + use register::InMemoryRegister; +@@ -84,8 +85,11 @@ + } + + #[no_mangle] +-unsafe extern "C" fn current_elx_irq(e: &mut ExceptionContext) { +- default_exception_handler(e); ++unsafe extern "C" fn current_elx_irq(_e: &mut ExceptionContext) { ++ use exception::asynchronous::interface::IRQManager; ++ ++ let token = &exception::asynchronous::IRQContext::new(); ++ bsp::exception::asynchronous::irq_manager().handle_pending_irqs(token); + } + + #[no_mangle] + +diff -uNr 13_integrated_testing/src/bsp/device_driver/arm/gicv2/gicc.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicc.rs +--- 13_integrated_testing/src/bsp/device_driver/arm/gicv2/gicc.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicc.rs +@@ -0,0 +1,146 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! GICC Driver - GIC CPU interface. ++ ++use crate::exception; ++use core::ops; ++use register::{mmio::*, register_bitfields, register_structs}; ++ ++//-------------------------------------------------------------------------------------------------- ++// Private Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++register_bitfields! { ++ u32, ++ ++ /// CPU Interface Control Register ++ CTLR [ ++ Enable OFFSET(0) NUMBITS(1) [] ++ ], ++ ++ /// Interrupt Priority Mask Register ++ PMR [ ++ Priority OFFSET(0) NUMBITS(8) [] ++ ], ++ ++ /// Interrupt Acknowledge Register ++ IAR [ ++ InterruptID OFFSET(0) NUMBITS(10) [] ++ ], ++ ++ /// End of Interrupt Register ++ EOIR [ ++ EOIINTID OFFSET(0) NUMBITS(10) [] ++ ] ++} ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++register_structs! { ++ #[allow(non_snake_case)] ++ pub RegisterBlock { ++ (0x000 => CTLR: ReadWrite), ++ (0x004 => PMR: ReadWrite), ++ (0x008 => _reserved1), ++ (0x00C => IAR: ReadWrite), ++ (0x010 => EOIR: ReadWrite), ++ (0x014 => @END), ++ } ++} ++ ++/// Representation of the GIC CPU interface. ++pub struct GICC { ++ base_addr: usize, ++} ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Code ++//-------------------------------------------------------------------------------------------------- ++ ++impl ops::Deref for GICC { ++ type Target = RegisterBlock; ++ ++ fn deref(&self) -> &Self::Target { ++ unsafe { &*self.ptr() } ++ } ++} ++ ++impl GICC { ++ /// Create an instance. ++ /// ++ /// # Safety ++ /// ++ /// - The user must ensure to provide the correct `base_addr`. ++ pub const unsafe fn new(base_addr: usize) -> Self { ++ Self { base_addr } ++ } ++ ++ /// Return a pointer to the associated MMIO register block. ++ fn ptr(&self) -> *const RegisterBlock { ++ self.base_addr as *const _ ++ } ++ ++ /// Accept interrupts of any priority. ++ /// ++ /// Quoting the GICv2 Architecture Specification: ++ /// ++ /// "Writing 255 to the GICC_PMR always sets it to the largest supported priority field ++ /// value." ++ /// ++ /// # Safety ++ /// ++ /// - GICC MMIO registers are banked per CPU core. It is therefore safe to have `&self` instead ++ /// of `&mut self`. ++ pub fn priority_accept_all(&self) { ++ self.PMR.write(PMR::Priority.val(255)); // Comment in arch spec. ++ } ++ ++ /// Enable the interface - start accepting IRQs. ++ /// ++ /// # Safety ++ /// ++ /// - GICC MMIO registers are banked per CPU core. It is therefore safe to have `&self` instead ++ /// of `&mut self`. ++ pub fn enable(&self) { ++ self.CTLR.write(CTLR::Enable::SET); ++ } ++ ++ /// Extract the number of the highest-priority pending IRQ. ++ /// ++ /// Can only be called from IRQ context, which is ensured by taking an `IRQContext` token. ++ /// ++ /// # Safety ++ /// ++ /// - GICC MMIO registers are banked per CPU core. It is therefore safe to have `&self` instead ++ /// of `&mut self`. ++ #[allow(clippy::trivially_copy_pass_by_ref)] ++ pub fn get_pending_number<'irq_context>( ++ &self, ++ _ic: &exception::asynchronous::IRQContext<'irq_context>, ++ ) -> usize { ++ self.IAR.read(IAR::InterruptID) as usize ++ } ++ ++ /// Complete handling of the currently active IRQ. ++ /// ++ /// Can only be called from IRQ context, which is ensured by taking an `IRQContext` token. ++ /// ++ /// To be called after `get_pending_number()`. ++ /// ++ /// # Safety ++ /// ++ /// - GICC MMIO registers are banked per CPU core. It is therefore safe to have `&self` instead ++ /// of `&mut self`. ++ #[allow(clippy::trivially_copy_pass_by_ref)] ++ pub fn mark_comleted<'irq_context>( ++ &self, ++ irq_number: u32, ++ _ic: &exception::asynchronous::IRQContext<'irq_context>, ++ ) { ++ self.EOIR.write(EOIR::EOIINTID.val(irq_number)); ++ } ++} + +diff -uNr 13_integrated_testing/src/bsp/device_driver/arm/gicv2/gicd.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicd.rs +--- 13_integrated_testing/src/bsp/device_driver/arm/gicv2/gicd.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicd.rs +@@ -0,0 +1,197 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! GICD Driver - GIC Distributor. ++//! ++//! # Glossary ++//! - SPI - Shared Peripheral Interrupt. ++ ++use crate::{ ++ bsp::device_driver::common::MMIODerefWrapper, state, synchronization, ++ synchronization::IRQSafeNullLock, ++}; ++use register::{mmio::*, register_bitfields, register_structs}; ++ ++//-------------------------------------------------------------------------------------------------- ++// Private Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++register_bitfields! { ++ u32, ++ ++ /// Distributor Control Register ++ CTLR [ ++ Enable OFFSET(0) NUMBITS(1) [] ++ ], ++ ++ /// Interrupt Controller Type Register ++ TYPER [ ++ ITLinesNumber OFFSET(0) NUMBITS(5) [] ++ ], ++ ++ /// Interrupt Processor Targets Registers ++ ITARGETSR [ ++ Offset3 OFFSET(24) NUMBITS(8) [], ++ Offset2 OFFSET(16) NUMBITS(8) [], ++ Offset1 OFFSET(8) NUMBITS(8) [], ++ Offset0 OFFSET(0) NUMBITS(8) [] ++ ] ++} ++ ++register_structs! { ++ #[allow(non_snake_case)] ++ SharedRegisterBlock { ++ (0x000 => CTLR: ReadWrite), ++ (0x004 => TYPER: ReadOnly), ++ (0x008 => _reserved1), ++ (0x104 => ISENABLER: [ReadWrite; 31]), ++ (0x108 => _reserved2), ++ (0x820 => ITARGETSR: [ReadWrite; 248]), ++ (0xBFC => @END), ++ } ++} ++ ++register_structs! { ++ #[allow(non_snake_case)] ++ BankedRegisterBlock { ++ (0x000 => _reserved1), ++ (0x100 => ISENABLER: ReadWrite), ++ (0x104 => _reserved2), ++ (0x800 => ITARGETSR: [ReadOnly; 8]), ++ (0xBFC => @END), ++ } ++} ++ ++/// Abstraction for the non-banked parts of the associated MMIO registers. ++type SharedRegs = MMIODerefWrapper; ++ ++/// Abstraction for the banked parts of the associated MMIO registers. ++type BankedRegs = MMIODerefWrapper; ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++/// Representation of the GIC Distributor. ++pub struct GICD { ++ /// Access to shared registers is guarded with a lock. ++ shared_regs: IRQSafeNullLock, ++ ++ /// Access to banked registers is unguarded. ++ banked_regs: BankedRegs, ++} ++ ++//-------------------------------------------------------------------------------------------------- ++// Private Code ++//-------------------------------------------------------------------------------------------------- ++ ++impl SharedRegs { ++ /// Return the number of IRQs that this HW implements. ++ #[inline(always)] ++ fn num_irqs(&mut self) -> usize { ++ // Query number of implemented IRQs. ++ // ++ // Refer to GICv2 Architecture Specification, Section 4.3.2. ++ ((self.TYPER.read(TYPER::ITLinesNumber) as usize) + 1) * 32 ++ } ++ ++ /// Return a slice of the implemented ITARGETSR. ++ #[inline(always)] ++ fn implemented_itargets_slice(&mut self) -> &[ReadWrite] { ++ assert!(self.num_irqs() >= 36); ++ ++ // Calculate the max index of the shared ITARGETSR array. ++ // ++ // The first 32 IRQs are private, so not included in `shared_regs`. Each ITARGETS ++ // register has four entries, so shift right by two. Subtract one because we start ++ // counting at zero. ++ let spi_itargetsr_max_index = ((self.num_irqs() - 32) >> 2) - 1; ++ ++ // Rust automatically inserts slice range sanity check, i.e. max >= min. ++ &self.ITARGETSR[0..spi_itargetsr_max_index] ++ } ++} ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Code ++//-------------------------------------------------------------------------------------------------- ++use synchronization::interface::Mutex; ++ ++impl GICD { ++ /// Create an instance. ++ /// ++ /// # Safety ++ /// ++ /// - The user must ensure to provide the correct `base_addr`. ++ pub const unsafe fn new(base_addr: usize) -> Self { ++ Self { ++ shared_regs: IRQSafeNullLock::new(SharedRegs::new(base_addr)), ++ banked_regs: BankedRegs::new(base_addr), ++ } ++ } ++ ++ /// Use a banked ITARGETSR to retrieve the executing core's GIC target mask. ++ /// ++ /// Quoting the GICv2 Architecture Specification: ++ /// ++ /// "GICD_ITARGETSR0 to GICD_ITARGETSR7 are read-only, and each field returns a value that ++ /// corresponds only to the processor reading the register." ++ fn local_gic_target_mask(&self) -> u32 { ++ self.banked_regs.ITARGETSR[0].read(ITARGETSR::Offset0) ++ } ++ ++ /// Route all SPIs to the boot core and enable the distributor. ++ pub fn boot_core_init(&self) { ++ assert!( ++ state::state_manager().state() == state::State::Init, ++ "Only allowed during kernel init phase" ++ ); ++ ++ // Target all SPIs to the boot core only. ++ let mask = self.local_gic_target_mask(); ++ ++ let mut r = &self.shared_regs; ++ r.lock(|regs| { ++ for i in regs.implemented_itargets_slice().iter() { ++ i.write( ++ ITARGETSR::Offset3.val(mask) ++ + ITARGETSR::Offset2.val(mask) ++ + ITARGETSR::Offset1.val(mask) ++ + ITARGETSR::Offset0.val(mask), ++ ); ++ } ++ ++ regs.CTLR.write(CTLR::Enable::SET); ++ }); ++ } ++ ++ /// Enable an interrupt. ++ pub fn enable(&self, irq_num: super::IRQNumber) { ++ let irq_num = irq_num.get(); ++ ++ // Each bit in the u32 enable register corresponds to one IRQ number. Shift right by 5 ++ // (division by 32) and arrive at the index for the respective ISENABLER[i]. ++ let enable_reg_index = irq_num >> 5; ++ let enable_bit: u32 = 1u32 << (irq_num modulo 32); ++ ++ // Check if we are handling a private or shared IRQ. ++ match irq_num { ++ // Private. ++ 0..=31 => { ++ let enable_reg = &self.banked_regs.ISENABLER; ++ enable_reg.set(enable_reg.get() | enable_bit); ++ } ++ // Shared. ++ _ => { ++ let enable_reg_index_shared = enable_reg_index - 1; ++ ++ let mut r = &self.shared_regs; ++ r.lock(|regs| { ++ let enable_reg = ®s.ISENABLER[enable_reg_index_shared]; ++ enable_reg.set(enable_reg.get() | enable_bit); ++ }); ++ } ++ } ++ } ++} + +diff -uNr 13_integrated_testing/src/bsp/device_driver/arm/gicv2.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2.rs +--- 13_integrated_testing/src/bsp/device_driver/arm/gicv2.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2.rs +@@ -0,0 +1,222 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! GICv2 Driver - ARM Generic Interrupt Controller v2. ++//! ++//! The following is a collection of excerpts with useful information from ++//! - `Programmer's Guide for ARMv8-A` ++//! - `ARM Generic Interrupt Controller Architecture Specification` ++//! ++//! # Programmer's Guide - 10.6.1 Configuration ++//! ++//! The GIC is accessed as a memory-mapped peripheral. ++//! ++//! All cores can access the common Distributor, but the CPU interface is banked, that is, each core ++//! uses the same address to access its own private CPU interface. ++//! ++//! It is not possible for a core to access the CPU interface of another core. ++//! ++//! # Architecture Specification - 10.6.2 Initialization ++//! ++//! Both the Distributor and the CPU interfaces are disabled at reset. The GIC must be initialized ++//! after reset before it can deliver interrupts to the core. ++//! ++//! In the Distributor, software must configure the priority, target, security and enable individual ++//! interrupts. The Distributor must subsequently be enabled through its control register ++//! (GICD_CTLR). For each CPU interface, software must program the priority mask and preemption ++//! settings. ++//! ++//! Each CPU interface block itself must be enabled through its control register (GICD_CTLR). This ++//! prepares the GIC to deliver interrupts to the core. ++//! ++//! Before interrupts are expected in the core, software prepares the core to take interrupts by ++//! setting a valid interrupt vector in the vector table, and clearing interrupt mask bits in ++//! PSTATE, and setting the routing controls. ++//! ++//! The entire interrupt mechanism in the system can be disabled by disabling the Distributor. ++//! Interrupt delivery to an individual core can be disabled by disabling its CPU interface. ++//! Individual interrupts can also be disabled (or enabled) in the distributor. ++//! ++//! For an interrupt to reach the core, the individual interrupt, Distributor and CPU interface must ++//! all be enabled. The interrupt also needs to be of sufficient priority, that is, higher than the ++//! core's priority mask. ++//! ++//! # Architecture Specification - 1.4.2 Interrupt types ++//! ++//! - Peripheral interrupt ++//! - Private Peripheral Interrupt (PPI) ++//! - This is a peripheral interrupt that is specific to a single processor. ++//! - Shared Peripheral Interrupt (SPI) ++//! - This is a peripheral interrupt that the Distributor can route to any of a specified ++//! combination of processors. ++//! ++//! - Software-generated interrupt (SGI) ++//! - This is an interrupt generated by software writing to a GICD_SGIR register in the GIC. The ++//! system uses SGIs for interprocessor communication. ++//! - An SGI has edge-triggered properties. The software triggering of the interrupt is ++//! equivalent to the edge transition of the interrupt request signal. ++//! - When an SGI occurs in a multiprocessor implementation, the CPUID field in the Interrupt ++//! Acknowledge Register, GICC_IAR, or the Aliased Interrupt Acknowledge Register, GICC_AIAR, ++//! identifies the processor that requested the interrupt. ++//! ++//! # Architecture Specification - 2.2.1 Interrupt IDs ++//! ++//! Interrupts from sources are identified using ID numbers. Each CPU interface can see up to 1020 ++//! interrupts. The banking of SPIs and PPIs increases the total number of interrupts supported by ++//! the Distributor. ++//! ++//! The GIC assigns interrupt ID numbers ID0-ID1019 as follows: ++//! - Interrupt numbers 32..1019 are used for SPIs. ++//! - Interrupt numbers 0..31 are used for interrupts that are private to a CPU interface. These ++//! interrupts are banked in the Distributor. ++//! - A banked interrupt is one where the Distributor can have multiple interrupts with the ++//! same ID. A banked interrupt is identified uniquely by its ID number and its associated ++//! CPU interface number. Of the banked interrupt IDs: ++//! - 00..15 SGIs ++//! - 16..31 PPIs ++ ++mod gicc; ++mod gicd; ++ ++use crate::{bsp, cpu, driver, exception, synchronization, synchronization::InitStateLock}; ++ ++//-------------------------------------------------------------------------------------------------- ++// Private Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++type HandlerTable = [Option; GICv2::NUM_IRQS]; ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++/// Used for the associated type of trait [`exception::asynchronous::interface::IRQManager`]. ++pub type IRQNumber = exception::asynchronous::IRQNumber<{ GICv2::MAX_IRQ_NUMBER }>; ++ ++/// Representation of the GIC. ++pub struct GICv2 { ++ /// The Distributor. ++ gicd: gicd::GICD, ++ ++ /// The CPU Interface. ++ gicc: gicc::GICC, ++ ++ /// Stores registered IRQ handlers. Writable only during kernel init. RO afterwards. ++ handler_table: InitStateLock, ++} ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Code ++//-------------------------------------------------------------------------------------------------- ++ ++impl GICv2 { ++ const MAX_IRQ_NUMBER: usize = 300; // Normally 1019, but keep it lower to save some space. ++ const NUM_IRQS: usize = Self::MAX_IRQ_NUMBER + 1; ++ ++ /// Create an instance. ++ /// ++ /// # Safety ++ /// ++ /// - The user must ensure to provide the correct `base_addr`. ++ pub const unsafe fn new(gicd_base_addr: usize, gicc_base_addr: usize) -> Self { ++ Self { ++ gicd: gicd::GICD::new(gicd_base_addr), ++ gicc: gicc::GICC::new(gicc_base_addr), ++ handler_table: InitStateLock::new([None; Self::NUM_IRQS]), ++ } ++ } ++} ++ ++//------------------------------------------------------------------------------ ++// OS Interface Code ++//------------------------------------------------------------------------------ ++use synchronization::interface::ReadWriteEx; ++ ++impl driver::interface::DeviceDriver for GICv2 { ++ fn compatible(&self) -> &str { ++ "GICv2 (ARM Generic Interrupt Controller v2)" ++ } ++ ++ fn init(&self) -> Result<(), ()> { ++ if cpu::smp::core_id::() == bsp::cpu::BOOT_CORE_ID { ++ self.gicd.boot_core_init(); ++ } ++ ++ self.gicc.priority_accept_all(); ++ self.gicc.enable(); ++ ++ Ok(()) ++ } ++} ++ ++impl exception::asynchronous::interface::IRQManager for GICv2 { ++ type IRQNumberType = IRQNumber; ++ ++ fn register_handler( ++ &self, ++ irq_number: Self::IRQNumberType, ++ descriptor: exception::asynchronous::IRQDescriptor, ++ ) -> Result<(), &'static str> { ++ let mut r = &self.handler_table; ++ r.write(|table| { ++ let irq_number = irq_number.get(); ++ ++ if table[irq_number].is_some() { ++ return Err("IRQ handler already registered"); ++ } ++ ++ table[irq_number] = Some(descriptor); ++ ++ Ok(()) ++ }) ++ } ++ ++ fn enable(&self, irq_number: Self::IRQNumberType) { ++ self.gicd.enable(irq_number); ++ } ++ ++ fn handle_pending_irqs<'irq_context>( ++ &'irq_context self, ++ ic: &exception::asynchronous::IRQContext<'irq_context>, ++ ) { ++ // Extract the highest priority pending IRQ number from the Interrupt Acknowledge Register ++ // (IAR). ++ let irq_number = self.gicc.get_pending_number(ic); ++ ++ // Guard against spurious interrupts. ++ if irq_number > GICv2::MAX_IRQ_NUMBER { ++ return; ++ } ++ ++ // Call the IRQ handler. Panic if there is none. ++ let mut r = &self.handler_table; ++ r.read(|table| { ++ match table[irq_number] { ++ None => panic!("No handler registered for IRQ {}", irq_number), ++ Some(descriptor) => { ++ // Call the IRQ handler. Panics on failure. ++ descriptor.handler.handle().expect("Error handling IRQ"); ++ } ++ } ++ }); ++ ++ // Signal completion of handling. ++ self.gicc.mark_comleted(irq_number as u32, ic); ++ } ++ ++ fn print_handler(&self) { ++ use crate::info; ++ ++ info!(" Peripheral handler:"); ++ ++ let mut r = &self.handler_table; ++ r.read(|table| { ++ for (i, opt) in table.iter().skip(32).enumerate() { ++ if let Some(handler) = opt { ++ info!(" {: >3}. {}", i + 32, handler.name); ++ } ++ } ++ }); ++ } ++} + +diff -uNr 13_integrated_testing/src/bsp/device_driver/arm.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm.rs +--- 13_integrated_testing/src/bsp/device_driver/arm.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm.rs +@@ -0,0 +1,11 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! ARM driver top level. ++ ++#[cfg(feature = "bsp_rpi4")] ++pub mod gicv2; ++ ++#[cfg(feature = "bsp_rpi4")] ++pub use gicv2::*; + +diff -uNr 13_integrated_testing/src/bsp/device_driver/bcm/bcm2xxx_gpio.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_gpio.rs +--- 13_integrated_testing/src/bsp/device_driver/bcm/bcm2xxx_gpio.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_gpio.rs +@@ -4,8 +4,10 @@ + + //! GPIO Driver. + +-use crate::{cpu, driver, synchronization, synchronization::NullLock}; +-use core::ops; ++use crate::{ ++ bsp::device_driver::common::MMIODerefWrapper, cpu, driver, synchronization, ++ synchronization::IRQSafeNullLock, ++}; + use register::{mmio::*, register_bitfields, register_structs}; + + //-------------------------------------------------------------------------------------------------- +@@ -70,9 +72,8 @@ + } + } + +-struct GPIOInner { +- base_addr: usize, +-} ++/// Abstraction for the associated MMIO registers. ++type Regs = MMIODerefWrapper; + + //-------------------------------------------------------------------------------------------------- + // Public Definitions +@@ -80,30 +81,7 @@ + + /// Representation of the GPIO HW. + pub struct GPIO { +- inner: NullLock, +-} +- +-//-------------------------------------------------------------------------------------------------- +-// Private Code +-//-------------------------------------------------------------------------------------------------- +- +-impl ops::Deref for GPIOInner { +- type Target = RegisterBlock; +- +- fn deref(&self) -> &Self::Target { +- unsafe { &*self.ptr() } +- } +-} +- +-impl GPIOInner { +- const fn new(base_addr: usize) -> Self { +- Self { base_addr } +- } +- +- /// Return a pointer to the associated MMIO register block. +- fn ptr(&self) -> *const RegisterBlock { +- self.base_addr as *const _ +- } ++ inner: IRQSafeNullLock, + } + + //-------------------------------------------------------------------------------------------------- +@@ -118,7 +96,7 @@ + /// - The user must ensure to provide the correct `base_addr`. + pub const unsafe fn new(base_addr: usize) -> Self { + Self { +- inner: NullLock::new(GPIOInner::new(base_addr)), ++ inner: IRQSafeNullLock::new(Regs::new(base_addr)), + } + } + + +diff -uNr 13_integrated_testing/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller/peripheral_ic.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller/peripheral_ic.rs +--- 13_integrated_testing/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller/peripheral_ic.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller/peripheral_ic.rs +@@ -0,0 +1,167 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! Peripheral Interrupt regsler Driver. ++ ++use super::{InterruptController, PendingIRQs, PeripheralIRQ}; ++use crate::{ ++ bsp::device_driver::common::MMIODerefWrapper, ++ exception, synchronization, ++ synchronization::{IRQSafeNullLock, InitStateLock}, ++}; ++use register::{mmio::*, register_structs}; ++ ++//-------------------------------------------------------------------------------------------------- ++// Private Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++register_structs! { ++ #[allow(non_snake_case)] ++ WORegisterBlock { ++ (0x00 => _reserved1), ++ (0x10 => ENABLE_1: WriteOnly), ++ (0x14 => ENABLE_2: WriteOnly), ++ (0x24 => @END), ++ } ++} ++ ++register_structs! { ++ #[allow(non_snake_case)] ++ RORegisterBlock { ++ (0x00 => _reserved1), ++ (0x04 => PENDING_1: ReadOnly), ++ (0x08 => PENDING_2: ReadOnly), ++ (0x0c => @END), ++ } ++} ++ ++/// Abstraction for the WriteOnly parts of the associated MMIO registers. ++type WriteOnlyRegs = MMIODerefWrapper; ++ ++/// Abstraction for the ReadOnly parts of the associated MMIO registers. ++type ReadOnlyRegs = MMIODerefWrapper; ++ ++type HandlerTable = ++ [Option; InterruptController::NUM_PERIPHERAL_IRQS]; ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++/// Representation of the peripheral interrupt regsler. ++pub struct PeripheralIC { ++ /// Access to write registers is guarded with a lock. ++ wo_regs: IRQSafeNullLock, ++ ++ /// Register read access is unguarded. ++ ro_regs: ReadOnlyRegs, ++ ++ /// Stores registered IRQ handlers. Writable only during kernel init. RO afterwards. ++ handler_table: InitStateLock, ++} ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Code ++//-------------------------------------------------------------------------------------------------- ++ ++impl PeripheralIC { ++ /// Create an instance. ++ /// ++ /// # Safety ++ /// ++ /// - The user must ensure to provide the correct `base_addr`. ++ pub const unsafe fn new(base_addr: usize) -> Self { ++ Self { ++ wo_regs: IRQSafeNullLock::new(WriteOnlyRegs::new(base_addr)), ++ ro_regs: ReadOnlyRegs::new(base_addr), ++ handler_table: InitStateLock::new([None; InterruptController::NUM_PERIPHERAL_IRQS]), ++ } ++ } ++ ++ /// Query the list of pending IRQs. ++ fn get_pending(&self) -> PendingIRQs { ++ let pending_mask: u64 = (u64::from(self.ro_regs.PENDING_2.get()) << 32) ++ | u64::from(self.ro_regs.PENDING_1.get()); ++ ++ PendingIRQs::new(pending_mask) ++ } ++} ++ ++//------------------------------------------------------------------------------ ++// OS Interface Code ++//------------------------------------------------------------------------------ ++use synchronization::interface::{Mutex, ReadWriteEx}; ++ ++impl exception::asynchronous::interface::IRQManager for PeripheralIC { ++ type IRQNumberType = PeripheralIRQ; ++ ++ fn register_handler( ++ &self, ++ irq: Self::IRQNumberType, ++ descriptor: exception::asynchronous::IRQDescriptor, ++ ) -> Result<(), &'static str> { ++ let mut r = &self.handler_table; ++ r.write(|table| { ++ let irq_number = irq.get(); ++ ++ if table[irq_number].is_some() { ++ return Err("IRQ handler already registered"); ++ } ++ ++ table[irq_number] = Some(descriptor); ++ ++ Ok(()) ++ }) ++ } ++ ++ fn enable(&self, irq: Self::IRQNumberType) { ++ let mut r = &self.wo_regs; ++ r.lock(|regs| { ++ let enable_reg = if irq.get() <= 31 { ++ ®s.ENABLE_1 ++ } else { ++ ®s.ENABLE_2 ++ }; ++ ++ let enable_bit: u32 = 1 << (irq.get() modulo 32); ++ ++ // Writing a 1 to a bit will set the corresponding IRQ enable bit. All other IRQ enable ++ // bits are unaffected. So we don't need read and OR'ing here. ++ enable_reg.set(enable_bit); ++ }); ++ } ++ ++ fn handle_pending_irqs<'irq_context>( ++ &'irq_context self, ++ _ic: &exception::asynchronous::IRQContext<'irq_context>, ++ ) { ++ let mut r = &self.handler_table; ++ r.read(|table| { ++ for irq_number in self.get_pending() { ++ match table[irq_number] { ++ None => panic!("No handler registered for IRQ {}", irq_number), ++ Some(descriptor) => { ++ // Call the IRQ handler. Panics on failure. ++ descriptor.handler.handle().expect("Error handling IRQ"); ++ } ++ } ++ } ++ }) ++ } ++ ++ fn print_handler(&self) { ++ use crate::info; ++ ++ info!(" Peripheral handler:"); ++ ++ let mut r = &self.handler_table; ++ r.read(|table| { ++ for (i, opt) in table.iter().enumerate() { ++ if let Some(handler) = opt { ++ info!(" {: >3}. {}", i, handler.name); ++ } ++ } ++ }); ++ } ++} + +diff -uNr 13_integrated_testing/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller.rs +--- 13_integrated_testing/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller.rs +@@ -0,0 +1,131 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! Interrupt Controller Driver. ++ ++mod peripheral_ic; ++ ++use crate::{driver, exception}; ++ ++//-------------------------------------------------------------------------------------------------- ++// Private Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++/// Wrapper struct for a bitmask indicating pending IRQ numbers. ++struct PendingIRQs { ++ bitmask: u64, ++} ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++pub type LocalIRQ = ++ exception::asynchronous::IRQNumber<{ InterruptController::MAX_LOCAL_IRQ_NUMBER }>; ++pub type PeripheralIRQ = ++ exception::asynchronous::IRQNumber<{ InterruptController::MAX_PERIPHERAL_IRQ_NUMBER }>; ++ ++/// Used for the associated type of trait [`exception::asynchronous::interface::IRQManager`]. ++#[derive(Copy, Clone)] ++pub enum IRQNumber { ++ Local(LocalIRQ), ++ Peripheral(PeripheralIRQ), ++} ++ ++/// Representation of the Interrupt Controller. ++pub struct InterruptController { ++ periph: peripheral_ic::PeripheralIC, ++} ++ ++//-------------------------------------------------------------------------------------------------- ++// Private Code ++//-------------------------------------------------------------------------------------------------- ++ ++impl PendingIRQs { ++ pub fn new(bitmask: u64) -> Self { ++ Self { bitmask } ++ } ++} ++ ++impl Iterator for PendingIRQs { ++ type Item = usize; ++ ++ fn next(&mut self) -> Option { ++ use core::intrinsics::cttz; ++ ++ let next = cttz(self.bitmask); ++ if next == 64 { ++ return None; ++ } ++ ++ self.bitmask &= !(1 << next); ++ ++ Some(next as usize) ++ } ++} ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Code ++//-------------------------------------------------------------------------------------------------- ++ ++impl InterruptController { ++ const MAX_LOCAL_IRQ_NUMBER: usize = 11; ++ const MAX_PERIPHERAL_IRQ_NUMBER: usize = 63; ++ const NUM_PERIPHERAL_IRQS: usize = Self::MAX_PERIPHERAL_IRQ_NUMBER + 1; ++ ++ /// Create an instance. ++ /// ++ /// # Safety ++ /// ++ /// - The user must ensure to provide the correct `base_addr`. ++ pub const unsafe fn new(_local_base_addr: usize, periph_base_addr: usize) -> Self { ++ Self { ++ periph: peripheral_ic::PeripheralIC::new(periph_base_addr), ++ } ++ } ++} ++ ++//------------------------------------------------------------------------------ ++// OS Interface Code ++//------------------------------------------------------------------------------ ++ ++impl driver::interface::DeviceDriver for InterruptController { ++ fn compatible(&self) -> &str { ++ "BCM Interrupt Controller" ++ } ++} ++ ++impl exception::asynchronous::interface::IRQManager for InterruptController { ++ type IRQNumberType = IRQNumber; ++ ++ fn register_handler( ++ &self, ++ irq: Self::IRQNumberType, ++ descriptor: exception::asynchronous::IRQDescriptor, ++ ) -> Result<(), &'static str> { ++ match irq { ++ IRQNumber::Local(_) => unimplemented!("Local IRQ controller not implemented."), ++ IRQNumber::Peripheral(pirq) => self.periph.register_handler(pirq, descriptor), ++ } ++ } ++ ++ fn enable(&self, irq: Self::IRQNumberType) { ++ match irq { ++ IRQNumber::Local(_) => unimplemented!("Local IRQ controller not implemented."), ++ IRQNumber::Peripheral(pirq) => self.periph.enable(pirq), ++ } ++ } ++ ++ fn handle_pending_irqs<'irq_context>( ++ &'irq_context self, ++ ic: &exception::asynchronous::IRQContext<'irq_context>, ++ ) { ++ // It can only be a peripheral IRQ pending because enable() does not support local IRQs yet. ++ self.periph.handle_pending_irqs(ic) ++ } ++ ++ fn print_handler(&self) { ++ self.periph.print_handler(); ++ } ++} + +diff -uNr 13_integrated_testing/src/bsp/device_driver/bcm/bcm2xxx_pl011_uart.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_pl011_uart.rs +--- 13_integrated_testing/src/bsp/device_driver/bcm/bcm2xxx_pl011_uart.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_pl011_uart.rs +@@ -3,8 +3,32 @@ + // Copyright (c) 2018-2020 Andre Richter + + //! PL011 UART driver. +- +-use crate::{console, cpu, driver, synchronization, synchronization::NullLock}; ++//! ++//! # FIFO fill level IRQ hack ++//! ++//! For learning purposes, we want the UART to raise an IRQ on _every_ received character. ++//! Unfortunately, this rather common mode of operation is not supported by the PL011 when operating ++//! in FIFO mode. It is only possible to set a fill level fraction on which the IRQ is triggered. ++//! The lowest fill level is 1/8. ++//! ++//! On the RPi3, the RX FIFO is 16 chars deep, so the IRQ would trigger after 2 chars have been ++//! received. On the RPi4, the FIFO seems to be 32 chars deep, because experiments showed that the ++//! RX IRQ triggers after receiving 4 chars. ++//! ++//! Fortunately, the PL011 has a test mode which allows to push characters into the FIFOs. We make ++//! use of this testing facilities to employ a little hack that pushes (fill-level - 1) chars into ++//! the RX FIFO by default. This way, we get an IRQ for the first received char that arrives from ++//! external. ++//! ++//! To make things even more complicated, QEMU is not honoring the fill-level dependent IRQ ++//! generation. Instead, QEMU creates an IRQ on every received char. ++//! ++//! We use conditional compilation to differentiate between the three modes of operation (RPi3, ++//! RPI4, QEMU) respectively. ++ ++use crate::{ ++ bsp, console, cpu, driver, exception, synchronization, synchronization::IRQSafeNullLock, ++}; + use core::{fmt, ops}; + use register::{mmio::*, register_bitfields, register_structs}; + +@@ -106,10 +130,45 @@ + ] + ], + ++ /// Interrupt FIFO Level Select Register ++ IFLS [ ++ /// Receive interrupt FIFO level select. The trigger points for the receive interrupt are as ++ /// follows. ++ RXIFLSEL OFFSET(3) NUMBITS(5) [ ++ OneEigth = 0b000, ++ OneQuarter = 0b001, ++ OneHalf = 0b010, ++ ThreeQuarters = 0b011, ++ SevenEights = 0b100 ++ ] ++ ], ++ ++ /// Interrupt Mask Set Clear Register ++ IMSC [ ++ /// Receive interrupt mask. A read returns the current mask for the UARTRXINTR interrupt. On ++ /// a write of 1, the mask of the interrupt is set. A write of 0 clears the mask. ++ RXIM OFFSET(4) NUMBITS(1) [ ++ Disabled = 0, ++ Enabled = 1 ++ ] ++ ], ++ + /// Interrupt Clear Register + ICR [ + /// Meta field for all pending interrupts + ALL OFFSET(0) NUMBITS(11) [] ++ ], ++ ++ /// Test Control Register ++ ITCR [ ++ /// Test FIFO enable. When this bit it 1, a write to the Test Data Register, UART_DR writes ++ /// data into the receive FIFO, and reads from the UART_DR register reads data out of the ++ /// transmit FIFO. When this bit is 0, data cannot be read directly from the transmit FIFO ++ /// or written directly to the receive FIFO (normal operation). ++ ITCR1 OFFSET(1) NUMBITS(1) [ ++ Disabled = 0, ++ Enabled = 1 ++ ] + ] + } + +@@ -128,9 +187,15 @@ + (0x28 => FBRD: WriteOnly), + (0x2c => LCRH: WriteOnly), + (0x30 => CR: WriteOnly), +- (0x34 => _reserved3), ++ (0x34 => IFLS: ReadWrite), ++ (0x38 => IMSC: ReadWrite), ++ (0x3C => _reserved3), + (0x44 => ICR: WriteOnly), +- (0x48 => @END), ++ (0x48 => _reserved4), ++ (0x80 => ITCR: ReadWrite), ++ (0x84 => _reserved5), ++ (0x8c => TDR: ReadWrite), ++ (0x90 => @END), + } + } + +@@ -145,7 +210,8 @@ + + /// Representation of the UART. + pub struct PL011Uart { +- inner: NullLock, ++ inner: IRQSafeNullLock, ++ irq_number: bsp::device_driver::IRQNumber, + } + + //-------------------------------------------------------------------------------------------------- +@@ -199,6 +265,14 @@ + .write(LCRH::WLEN::EightBit + LCRH::FEN::FifosEnabled); // 8N1 + Fifo on + self.CR + .write(CR::UARTEN::Enabled + CR::TXE::Enabled + CR::RXE::Enabled); ++ ++ // Trigger the RX interrupt at 1/8 of the FIFO fill level (this is the lowest possible) and ++ // enable RX interrupts. ++ self.IFLS.write(IFLS::RXIFLSEL::OneEigth); ++ self.IMSC.write(IMSC::RXIM::Enabled); ++ ++ #[cfg(not(feature = "qemu-quirks"))] ++ self.fill_hack_push(); + } + + /// Return a pointer to the register block. +@@ -218,6 +292,70 @@ + + self.chars_written += 1; + } ++ ++ /// Retrieve a character. ++ fn read_char_converting(&mut self, blocking: bool) -> Option { ++ #[cfg(not(feature = "qemu-quirks"))] ++ self.fill_hack_pop(); ++ ++ // If blocking, spin while RX FIFO empty is set, else return None. ++ while self.FR.matches_all(FR::RXFE::SET) { ++ if !blocking { ++ #[cfg(not(feature = "qemu-quirks"))] ++ self.fill_hack_push(); ++ ++ return None; ++ } ++ ++ cpu::nop(); ++ } ++ ++ // Read one character. ++ let mut ret = self.DR.get() as u8 as char; ++ ++ // Convert carrige return to newline. ++ if ret == '\r' { ++ ret = '\n' ++ } ++ ++ // Update statistics. ++ self.chars_read += 1; ++ ++ #[cfg(not(feature = "qemu-quirks"))] ++ self.fill_hack_push(); ++ ++ Some(ret) ++ } ++ ++ /// Push characters into the receive FIFO. ++ /// ++ /// See top level comments why this is needed. ++ #[cfg(not(feature = "qemu-quirks"))] ++ fn fill_hack_push(&mut self) { ++ self.ITCR.write(ITCR::ITCR1::Enabled); ++ ++ #[cfg(feature = "bsp_rpi4")] ++ { ++ self.TDR.set(b'X' as u32); ++ self.TDR.set(b'Y' as u32); ++ } ++ self.TDR.set(b'Z' as u32); ++ ++ self.ITCR.write(ITCR::ITCR1::Disabled); ++ } ++ ++ /// Pop characters from the receive FIFO. ++ /// ++ /// See top level comments why this is needed. ++ #[cfg(not(feature = "qemu-quirks"))] ++ fn fill_hack_pop(&mut self) { ++ #[cfg(feature = "bsp_rpi4")] ++ { ++ self.DR.get(); ++ self.DR.get(); ++ } ++ self.DR.get(); ++ } + } + + /// Implementing `core::fmt::Write` enables usage of the `format_args!` macros, which in turn are +@@ -243,9 +381,10 @@ + /// # Safety + /// + /// - The user must ensure to provide the correct `base_addr`. +- pub const unsafe fn new(base_addr: usize) -> Self { ++ pub const unsafe fn new(base_addr: usize, irq_number: bsp::device_driver::IRQNumber) -> Self { + Self { +- inner: NullLock::new(PL011UartInner::new(base_addr)), ++ inner: IRQSafeNullLock::new(PL011UartInner::new(base_addr)), ++ irq_number, + } + } + } +@@ -266,6 +405,21 @@ + + Ok(()) + } ++ ++ fn register_and_enable_irq_handler(&'static self) -> Result<(), &'static str> { ++ use bsp::exception::asynchronous::irq_manager; ++ use exception::asynchronous::{interface::IRQManager, IRQDescriptor}; ++ ++ let descriptor = IRQDescriptor { ++ name: "BCM PL011 UART", ++ handler: self, ++ }; ++ ++ irq_manager().register_handler(self.irq_number, descriptor)?; ++ irq_manager().enable(self.irq_number); ++ ++ Ok(()) ++ } + } + + impl console::interface::Write for PL011Uart { +@@ -297,25 +451,7 @@ + impl console::interface::Read for PL011Uart { + fn read_char(&self) -> char { + let mut r = &self.inner; +- r.lock(|inner| { +- // Spin while RX FIFO empty is set. +- while inner.FR.matches_all(FR::RXFE::SET) { +- cpu::nop(); +- } +- +- // Read one character. +- let mut ret = inner.DR.get() as u8 as char; +- +- // Convert carrige return to newline. +- if ret == '\r' { +- ret = '\n' +- } +- +- // Update statistics. +- inner.chars_read += 1; +- +- ret +- }) ++ r.lock(|inner| inner.read_char_converting(true).unwrap()) + } + + fn clear(&self) { +@@ -340,3 +476,20 @@ + r.lock(|inner| inner.chars_read) + } + } ++ ++impl exception::asynchronous::interface::IRQHandler for PL011Uart { ++ fn handle(&self) -> Result<(), &'static str> { ++ let mut r = &self.inner; ++ r.lock(|inner| { ++ // Echo any received characters. ++ loop { ++ match inner.read_char_converting(false) { ++ None => break, ++ Some(c) => inner.write_char(c), ++ } ++ } ++ }); ++ ++ Ok(()) ++ } ++} + +diff -uNr 13_integrated_testing/src/bsp/device_driver/bcm.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm.rs +--- 13_integrated_testing/src/bsp/device_driver/bcm.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm.rs +@@ -5,7 +5,11 @@ + //! BCM driver top level. + + mod bcm2xxx_gpio; ++#[cfg(feature = "bsp_rpi3")] ++mod bcm2xxx_interrupt_controller; + mod bcm2xxx_pl011_uart; + + pub use bcm2xxx_gpio::*; ++#[cfg(feature = "bsp_rpi3")] ++pub use bcm2xxx_interrupt_controller::*; + pub use bcm2xxx_pl011_uart::*; + +diff -uNr 13_integrated_testing/src/bsp/device_driver/common.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/common.rs +--- 13_integrated_testing/src/bsp/device_driver/common.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/common.rs +@@ -0,0 +1,35 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! Common device driver code. ++ ++use core::{marker::PhantomData, ops}; ++ ++pub struct MMIODerefWrapper { ++ base_addr: usize, ++ phantom: PhantomData, ++} ++ ++impl MMIODerefWrapper { ++ /// Create an instance. ++ pub const unsafe fn new(base_addr: usize) -> Self { ++ Self { ++ base_addr, ++ phantom: PhantomData, ++ } ++ } ++ ++ /// Return a pointer to the associated MMIO register block. ++ fn ptr(&self) -> *const T { ++ self.base_addr as *const _ ++ } ++} ++ ++impl ops::Deref for MMIODerefWrapper { ++ type Target = T; ++ ++ fn deref(&self) -> &Self::Target { ++ unsafe { &*self.ptr() } ++ } ++} + +diff -uNr 13_integrated_testing/src/bsp/device_driver.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver.rs +--- 13_integrated_testing/src/bsp/device_driver.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver.rs +@@ -4,8 +4,13 @@ + + //! Device driver. + ++#[cfg(feature = "bsp_rpi4")] ++mod arm; + #[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] + mod bcm; ++mod common; + ++#[cfg(feature = "bsp_rpi4")] ++pub use arm::*; + #[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] + pub use bcm::*; + +diff -uNr 13_integrated_testing/src/bsp/raspberrypi/cpu.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/cpu.rs +--- 13_integrated_testing/src/bsp/raspberrypi/cpu.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/cpu.rs +@@ -13,3 +13,6 @@ + + /// The early boot core's stack address. + pub const BOOT_CORE_STACK_START: u64 = 0x80_000; ++ ++/// The number of processor cores. ++pub const NUM_CORES: usize = 4; + +diff -uNr 13_integrated_testing/src/bsp/raspberrypi/driver.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/driver.rs +--- 13_integrated_testing/src/bsp/raspberrypi/driver.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/driver.rs +@@ -12,7 +12,7 @@ + + /// Device Driver Manager type. + pub struct BSPDriverManager { +- device_drivers: [&'static (dyn DeviceDriver + Sync); 2], ++ device_drivers: [&'static (dyn DeviceDriver + Sync); 3], + } + + //-------------------------------------------------------------------------------------------------- +@@ -20,7 +20,11 @@ + //-------------------------------------------------------------------------------------------------- + + static BSP_DRIVER_MANAGER: BSPDriverManager = BSPDriverManager { +- device_drivers: [&super::GPIO, &super::PL011_UART], ++ device_drivers: [ ++ &super::GPIO, ++ &super::PL011_UART, ++ &super::INTERRUPT_CONTROLLER, ++ ], + }; + + //-------------------------------------------------------------------------------------------------- + +diff -uNr 13_integrated_testing/src/bsp/raspberrypi/exception/asynchronous.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception/asynchronous.rs +--- 13_integrated_testing/src/bsp/raspberrypi/exception/asynchronous.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception/asynchronous.rs +@@ -0,0 +1,36 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! BSP asynchronous exception handling. ++ ++use crate::{bsp, exception}; ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++#[cfg(feature = "bsp_rpi3")] ++pub(in crate::bsp) mod irq_map { ++ use super::bsp::device_driver::{IRQNumber, PeripheralIRQ}; ++ ++ pub const PL011_UART: IRQNumber = IRQNumber::Peripheral(PeripheralIRQ::new(57)); ++} ++ ++#[cfg(feature = "bsp_rpi4")] ++pub(in crate::bsp) mod irq_map { ++ use super::bsp::device_driver::IRQNumber; ++ ++ pub const PL011_UART: IRQNumber = IRQNumber::new(153); ++} ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Code ++//-------------------------------------------------------------------------------------------------- ++ ++/// Return a reference to the IRQ manager. ++pub fn irq_manager() -> &'static impl exception::asynchronous::interface::IRQManager< ++ IRQNumberType = bsp::device_driver::IRQNumber, ++> { ++ &super::super::INTERRUPT_CONTROLLER ++} + +diff -uNr 13_integrated_testing/src/bsp/raspberrypi/exception.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception.rs +--- 13_integrated_testing/src/bsp/raspberrypi/exception.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception.rs +@@ -0,0 +1,7 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! BSP synchronous and asynchronous exception handling. ++ ++pub mod asynchronous; + +diff -uNr 13_integrated_testing/src/bsp/raspberrypi/memory.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/memory.rs +--- 13_integrated_testing/src/bsp/raspberrypi/memory.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/memory.rs +@@ -24,8 +24,10 @@ + use super::*; + + pub const BASE: usize = 0x3F00_0000; ++ pub const PERIPHERAL_INTERRUPT_CONTROLLER_BASE: usize = BASE + 0x0000_B200; + pub const GPIO_BASE: usize = BASE + GPIO_OFFSET; + pub const PL011_UART_BASE: usize = BASE + UART_OFFSET; ++ pub const LOCAL_INTERRUPT_CONTROLLER_BASE: usize = 0x4000_0000; + pub const END_INCLUSIVE: usize = 0x4000_FFFF; + } + +@@ -37,6 +39,8 @@ + pub const BASE: usize = 0xFE00_0000; + pub const GPIO_BASE: usize = BASE + GPIO_OFFSET; + pub const PL011_UART_BASE: usize = BASE + UART_OFFSET; ++ pub const GICD_BASE: usize = 0xFF84_1000; ++ pub const GICC_BASE: usize = 0xFF84_2000; + pub const END_INCLUSIVE: usize = 0xFF84_FFFF; + } + } + +diff -uNr 13_integrated_testing/src/bsp/raspberrypi.rs 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi.rs +--- 13_integrated_testing/src/bsp/raspberrypi.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi.rs +@@ -7,6 +7,7 @@ + pub mod console; + pub mod cpu; + pub mod driver; ++pub mod exception; + pub mod memory; + + //-------------------------------------------------------------------------------------------------- +@@ -17,8 +18,25 @@ + static GPIO: device_driver::GPIO = + unsafe { device_driver::GPIO::new(memory::map::mmio::GPIO_BASE) }; + +-static PL011_UART: device_driver::PL011Uart = +- unsafe { device_driver::PL011Uart::new(memory::map::mmio::PL011_UART_BASE) }; ++static PL011_UART: device_driver::PL011Uart = unsafe { ++ device_driver::PL011Uart::new( ++ memory::map::mmio::PL011_UART_BASE, ++ exception::asynchronous::irq_map::PL011_UART, ++ ) ++}; ++ ++#[cfg(feature = "bsp_rpi3")] ++static INTERRUPT_CONTROLLER: device_driver::InterruptController = unsafe { ++ device_driver::InterruptController::new( ++ memory::map::mmio::LOCAL_INTERRUPT_CONTROLLER_BASE, ++ memory::map::mmio::PERIPHERAL_INTERRUPT_CONTROLLER_BASE, ++ ) ++}; ++ ++#[cfg(feature = "bsp_rpi4")] ++static INTERRUPT_CONTROLLER: device_driver::GICv2 = unsafe { ++ device_driver::GICv2::new(memory::map::mmio::GICD_BASE, memory::map::mmio::GICC_BASE) ++}; + + //-------------------------------------------------------------------------------------------------- + // Public Code + +diff -uNr 13_integrated_testing/src/driver.rs 14_exceptions_part2_peripheral_IRQs/src/driver.rs +--- 13_integrated_testing/src/driver.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/driver.rs +@@ -20,6 +20,14 @@ + fn init(&self) -> Result<(), ()> { + Ok(()) + } ++ ++ /// Called by the kernel to register and enable the device's IRQ handlers, if any. ++ /// ++ /// Rust's type system will prevent a call to this function unless the calling instance ++ /// itself has static lifetime. ++ fn register_and_enable_irq_handler(&'static self) -> Result<(), &'static str> { ++ Ok(()) ++ } + } + + /// Device driver management functions. + +diff -uNr 13_integrated_testing/src/exception/asynchronous.rs 14_exceptions_part2_peripheral_IRQs/src/exception/asynchronous.rs +--- 13_integrated_testing/src/exception/asynchronous.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/exception/asynchronous.rs +@@ -8,3 +8,138 @@ + #[path = "../_arch/aarch64/exception/asynchronous.rs"] + mod arch_exception_async; + pub use arch_exception_async::*; ++ ++use core::{fmt, marker::PhantomData}; ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++/// Asynchronous exception handling interfaces. ++pub mod interface { ++ ++ /// Implemented by types that handle IRQs. ++ pub trait IRQHandler { ++ /// Called when the corresponding interrupt is asserted. ++ fn handle(&self) -> Result<(), &'static str>; ++ } ++ ++ /// IRQ management functions. ++ /// ++ /// The `BSP` is supposed to supply one global instance. Typically implemented by the ++ /// platform's interrupt controller. ++ pub trait IRQManager { ++ /// The IRQ number type depends on the implementation. ++ type IRQNumberType; ++ ++ /// Register a handler. ++ fn register_handler( ++ &self, ++ irq_number: Self::IRQNumberType, ++ descriptor: super::IRQDescriptor, ++ ) -> Result<(), &'static str>; ++ ++ /// Enable an interrupt in the controller. ++ fn enable(&self, irq_number: Self::IRQNumberType); ++ ++ /// Handle pending interrupts. ++ /// ++ /// This function is called directly from the CPU's IRQ exception vector. On AArch64, ++ /// this means that the respective CPU core has disabled exception handling. ++ /// This function can therefore not be preempted and runs start to finish. ++ /// ++ /// Takes an IRQContext token to ensure it can only be called from IRQ context. ++ #[allow(clippy::trivially_copy_pass_by_ref)] ++ fn handle_pending_irqs<'irq_context>( ++ &'irq_context self, ++ ic: &super::IRQContext<'irq_context>, ++ ); ++ ++ /// Print list of registered handlers. ++ fn print_handler(&self); ++ } ++} ++ ++/// Interrupt descriptor. ++#[derive(Copy, Clone)] ++pub struct IRQDescriptor { ++ /// Descriptive name. ++ pub name: &'static str, ++ ++ /// Reference to handler trait object. ++ pub handler: &'static (dyn interface::IRQHandler + Sync), ++} ++ ++/// IRQContext token. ++/// ++/// An instance of this type indicates that the local core is currently executing in IRQ ++/// context, aka executing an interrupt vector or subcalls of it. ++/// ++/// Concept and implementation derived from the `CriticalSection` introduced in ++/// https://github.com/rust-embedded/bare-metal ++#[derive(Clone, Copy)] ++pub struct IRQContext<'irq_context> { ++ _0: PhantomData<&'irq_context ()>, ++} ++ ++/// A wrapper type for IRQ numbers with integrated range sanity check. ++#[derive(Copy, Clone)] ++pub struct IRQNumber(usize); ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Code ++//-------------------------------------------------------------------------------------------------- ++ ++impl<'irq_context> IRQContext<'irq_context> { ++ /// Creates an IRQContext token. ++ /// ++ /// # Safety ++ /// ++ /// - This must only be called when the current core is in an interrupt context and will not ++ /// live beyond the end of it. That is, creation is allowed in interrupt vector functions. For ++ /// example, in the ARMv8-A case, in `extern "C" fn current_elx_irq()`. ++ /// - Note that the lifetime `'irq_context` of the returned instance is unconstrained. User code ++ /// must not be able to influence the lifetime picked for this type, since that might cause it ++ /// to be inferred to `'static`. ++ #[inline(always)] ++ pub unsafe fn new() -> Self { ++ IRQContext { _0: PhantomData } ++ } ++} ++ ++impl IRQNumber<{ MAX_INCLUSIVE }> { ++ /// Creates a new instance if number <= MAX_INCLUSIVE. ++ pub const fn new(number: usize) -> Self { ++ assert!(number <= MAX_INCLUSIVE); ++ ++ Self { 0: number } ++ } ++ ++ /// Return the wrapped number. ++ pub fn get(self) -> usize { ++ self.0 ++ } ++} ++ ++impl fmt::Display for IRQNumber<{ MAX_INCLUSIVE }> { ++ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { ++ write!(f, "{}", self.0) ++ } ++} ++ ++/// Executes the provided closure while IRQs are masked on the executing core. ++/// ++/// While the function temporarily changes the HW state of the executing core, it restores it to the ++/// previous state before returning, so this is deemed safe. ++#[inline(always)] ++pub fn exec_with_irq_masked(f: impl FnOnce() -> T) -> T { ++ let ret: T; ++ ++ unsafe { ++ let saved = local_irq_mask_save(); ++ ret = f(); ++ local_irq_restore(saved); ++ } ++ ++ ret ++} + +diff -uNr 13_integrated_testing/src/lib.rs 14_exceptions_part2_peripheral_IRQs/src/lib.rs +--- 13_integrated_testing/src/lib.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/lib.rs +@@ -13,12 +13,17 @@ + //! + //! - [`bsp::console::console()`] - Returns a reference to the kernel's [console interface]. + //! - [`bsp::driver::driver_manager()`] - Returns a reference to the kernel's [driver interface]. ++//! - [`bsp::exception::asynchronous::irq_manager()`] - Returns a reference to the kernel's [IRQ ++//! Handling interface]. + //! - [`memory::mmu::mmu()`] - Returns a reference to the kernel's [MMU interface]. ++//! - [`state::state_manager()`] - Returns a reference to the kernel's [state management] instance. + //! - [`time::time_manager()`] - Returns a reference to the kernel's [timer interface]. + //! + //! [console interface]: ../libkernel/console/interface/index.html + //! [driver interface]: ../libkernel/driver/interface/trait.DriverManager.html ++//! [IRQ Handling interface]: ../libkernel/exception/asynchronous/interface/trait.IRQManager.html + //! [MMU interface]: ../libkernel/memory/mmu/interface/trait.MMU.html ++//! [state management]: ../libkernel/state/struct.StateManager.html + //! [timer interface]: ../libkernel/time/interface/trait.TimeManager.html + //! + //! # Code organization and architecture +@@ -107,7 +112,12 @@ + //! - `crate::bsp::memory::*` + + #![allow(incomplete_features)] ++#![feature(asm)] ++#![feature(const_fn)] + #![feature(const_generics)] ++#![feature(const_if_match)] ++#![feature(const_panic)] ++#![feature(core_intrinsics)] + #![feature(custom_inner_attributes)] + #![feature(format_args_nl)] + #![feature(global_asm)] +@@ -137,6 +147,7 @@ + pub mod exception; + pub mod memory; + pub mod print; ++pub mod state; + pub mod time; + + //-------------------------------------------------------------------------------------------------- + +diff -uNr 13_integrated_testing/src/main.rs 14_exceptions_part2_peripheral_IRQs/src/main.rs +--- 13_integrated_testing/src/main.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/main.rs +@@ -11,7 +11,7 @@ + #![no_main] + #![no_std] + +-use libkernel::{bsp, console, driver, exception, info, memory, time}; ++use libkernel::{bsp, cpu, driver, exception, info, memory, state, time, warn}; + + /// Early init code. + /// +@@ -21,8 +21,8 @@ + /// - The init calls in this function must appear in the correct order: + /// - Virtual memory must be activated before the device drivers. + /// - Without it, any atomic operations, e.g. the yet-to-be-introduced spinlocks in the device +-/// drivers (which currently employ NullLocks instead of spinlocks), will fail to work on +-/// the RPi SoCs. ++/// drivers (which currently employ IRQSafeNullLocks instead of spinlocks), will fail to ++/// work on the RPi SoCs. + #[no_mangle] + unsafe fn kernel_init() -> ! { + use driver::interface::DriverManager; +@@ -42,14 +42,27 @@ + bsp::driver::driver_manager().post_device_driver_init(); + // println! is usable from here on. + ++ // Let device drivers register and enable their handlers with the interrupt controller. ++ for i in bsp::driver::driver_manager().all_device_drivers() { ++ if let Err(msg) = i.register_and_enable_irq_handler() { ++ warn!("Error registering IRQ handler: {}", msg); ++ } ++ } ++ ++ // Unmask interrupts on the boot CPU core. ++ exception::asynchronous::local_irq_unmask(); ++ ++ // Announce conclusion of the kernel_init() phase. ++ state::state_manager().transition_to_single_core_main(); ++ + // Transition from unsafe to safe. + kernel_main() + } + + /// The main function running after the early init. + fn kernel_main() -> ! { +- use console::interface::All; + use driver::interface::DriverManager; ++ use exception::asynchronous::interface::IRQManager; + + info!("Booting on: {}", bsp::board_name()); + +@@ -76,9 +89,9 @@ + info!(" {}. {}", i + 1, driver.compatible()); + } + ++ info!("Registered IRQ handlers:"); ++ bsp::exception::asynchronous::irq_manager().print_handler(); ++ + info!("Echoing input now"); +- loop { +- let c = bsp::console::console().read_char(); +- bsp::console::console().write_char(c); +- } ++ cpu::wait_forever(); + } + +diff -uNr 13_integrated_testing/src/state.rs 14_exceptions_part2_peripheral_IRQs/src/state.rs +--- 13_integrated_testing/src/state.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/state.rs +@@ -0,0 +1,83 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! State information about the kernel itself. ++ ++use core::sync::atomic::{AtomicU8, Ordering}; ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Definitions ++//-------------------------------------------------------------------------------------------------- ++ ++/// Different stages in the kernel execution. ++#[derive(Copy, Clone, Eq, PartialEq)] ++pub enum State { ++ /// The kernel starts booting in this state. ++ Init, ++ ++ /// The kernel transitions to this state when jumping to `kernel_main()` (at the end of ++ /// `kernel_init()`, after all init calls are done). ++ SingleCoreMain, ++ ++ /// The kernel transitions to this state when it boots the secondary cores, aka switches ++ /// exectution mode to symmetric multiprocessing (SMP). ++ MultiCoreMain, ++} ++ ++/// Maintains the kernel state and state transitions. ++pub struct StateManager(AtomicU8); ++ ++//-------------------------------------------------------------------------------------------------- ++// Global instances ++//-------------------------------------------------------------------------------------------------- ++ ++static STATE_MANAGER: StateManager = StateManager::new(); ++ ++//-------------------------------------------------------------------------------------------------- ++// Public Code ++//-------------------------------------------------------------------------------------------------- ++ ++/// Return a reference to the global StateManager. ++pub fn state_manager() -> &'static StateManager { ++ &STATE_MANAGER ++} ++ ++impl StateManager { ++ const INIT: u8 = 0; ++ const SINGLE_CORE_MAIN: u8 = 1; ++ const MULTI_CORE_MAIN: u8 = 2; ++ ++ /// Create a new instance. ++ pub const fn new() -> Self { ++ Self(AtomicU8::new(Self::INIT)) ++ } ++ ++ /// Return the current state. ++ pub fn state(&self) -> State { ++ let state = self.0.load(Ordering::Acquire); ++ ++ match state { ++ Self::INIT => State::Init, ++ Self::SINGLE_CORE_MAIN => State::SingleCoreMain, ++ Self::MULTI_CORE_MAIN => State::MultiCoreMain, ++ _ => panic!("Invalid KERNEL_STATE"), ++ } ++ } ++ ++ /// Transition from Init to SingleCoreMain. ++ pub fn transition_to_single_core_main(&self) { ++ if self ++ .0 ++ .compare_exchange( ++ Self::INIT, ++ Self::SINGLE_CORE_MAIN, ++ Ordering::Acquire, ++ Ordering::Relaxed, ++ ) ++ .is_err() ++ { ++ panic!("transition_to_single_core_main() called while state != Init"); ++ } ++ } ++} + +diff -uNr 13_integrated_testing/src/synchronization.rs 14_exceptions_part2_peripheral_IRQs/src/synchronization.rs +--- 13_integrated_testing/src/synchronization.rs ++++ 14_exceptions_part2_peripheral_IRQs/src/synchronization.rs +@@ -42,6 +42,21 @@ + /// Creates a critical section and grants temporary mutable access to the encapsulated data. + fn lock(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R; + } ++ ++ /// A reader-writer exclusion type. ++ /// ++ /// The implementing object allows either a number of readers or at most one writer at any point ++ /// in time. ++ pub trait ReadWriteEx { ++ /// The type of encapsulated data. ++ type Data; ++ ++ /// Grants temporary mutable access to the encapsulated data. ++ fn write(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R; ++ ++ /// Grants temporary immutable access to the encapsulated data. ++ fn read(&mut self, f: impl FnOnce(&Self::Data) -> R) -> R; ++ } + } + + /// A pseudo-lock for teaching purposes. +@@ -52,10 +67,17 @@ + /// other cores to the contained data. This part is preserved for later lessons. + /// + /// The lock will only be used as long as it is safe to do so, i.e. as long as the kernel is +-/// executing single-threaded, aka only running on a single core with interrupts disabled. ++/// executing on a single core. + /// + /// [interior mutability]: https://doc.rust-lang.org/std/cell/index.html +-pub struct NullLock { ++pub struct IRQSafeNullLock { ++ data: UnsafeCell, ++} ++ ++/// A pseudo-lock that is RW during the single-core kernel init phase and RO afterwards. ++/// ++/// Intended to encapsulate data that is populated during kernel init when no concurrency exists. ++pub struct InitStateLock { + data: UnsafeCell, + } + +@@ -63,10 +85,20 @@ + // Public Code + //-------------------------------------------------------------------------------------------------- + +-unsafe impl Sync for NullLock {} ++unsafe impl Sync for IRQSafeNullLock {} ++ ++impl IRQSafeNullLock { ++ /// Wraps `data` into a new `IRQSafeNullLock`. ++ pub const fn new(data: T) -> Self { ++ Self { ++ data: UnsafeCell::new(data), ++ } ++ } ++} ++ ++unsafe impl Sync for InitStateLock {} + +-impl NullLock { +- /// Wraps `data` into a new `NullLock`. ++impl InitStateLock { + pub const fn new(data: T) -> Self { + Self { + data: UnsafeCell::new(data), +@@ -77,8 +109,9 @@ + //------------------------------------------------------------------------------ + // OS Interface Code + //------------------------------------------------------------------------------ ++use crate::{exception, state}; + +-impl interface::Mutex for &NullLock { ++impl interface::Mutex for &IRQSafeNullLock { + type Data = T; + + fn lock(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R { +@@ -86,6 +119,32 @@ + // mutable reference will ever only be given out once at a time. + let data = unsafe { &mut *self.data.get() }; + ++ // Execute the closure while IRQs are masked. ++ exception::asynchronous::exec_with_irq_masked(|| f(data)) ++ } ++} ++ ++impl interface::ReadWriteEx for &InitStateLock { ++ type Data = T; ++ ++ fn write(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R { ++ assert!( ++ state::state_manager().state() == state::State::Init, ++ "InitStateLock::write called after kernel init phase" ++ ); ++ assert!( ++ !exception::asynchronous::is_local_irq_masked(), ++ "InitStateLock::write called with IRQs unmasked" ++ ); ++ ++ let data = unsafe { &mut *self.data.get() }; ++ ++ f(data) ++ } ++ ++ fn read(&mut self, f: impl FnOnce(&Self::Data) -> R) -> R { ++ let data = unsafe { &*self.data.get() }; ++ + f(data) + } + } + +diff -uNr 13_integrated_testing/tests/03_exception_irq_sanity.rs 14_exceptions_part2_peripheral_IRQs/tests/03_exception_irq_sanity.rs +--- 13_integrated_testing/tests/03_exception_irq_sanity.rs ++++ 14_exceptions_part2_peripheral_IRQs/tests/03_exception_irq_sanity.rs +@@ -0,0 +1,68 @@ ++// SPDX-License-Identifier: MIT OR Apache-2.0 ++// ++// Copyright (c) 2020 Andre Richter ++ ++//! IRQ handling sanity tests. ++ ++#![feature(custom_test_frameworks)] ++#![no_main] ++#![no_std] ++#![reexport_test_harness_main = "test_main"] ++#![test_runner(libkernel::test_runner)] ++ ++mod panic_exit_failure; ++ ++use libkernel::{bsp, cpu, exception}; ++use test_macros::kernel_test; ++ ++#[no_mangle] ++unsafe fn kernel_init() -> ! { ++ bsp::console::qemu_bring_up_console(); ++ ++ exception::handling_init(); ++ exception::asynchronous::local_irq_unmask(); ++ ++ test_main(); ++ ++ cpu::qemu_exit_success() ++} ++ ++/// Check that IRQ masking works. ++#[kernel_test] ++fn local_irq_mask_works() { ++ // Precondition: IRQs are unmasked. ++ assert!(exception::asynchronous::is_local_irq_masked()); ++ ++ unsafe { exception::asynchronous::local_irq_mask() }; ++ assert!(!exception::asynchronous::is_local_irq_masked()); ++ ++ // Restore earlier state. ++ unsafe { exception::asynchronous::local_irq_unmask() }; ++} ++ ++/// Check that IRQ unmasking works. ++#[kernel_test] ++fn local_irq_unmask_works() { ++ // Precondition: IRQs are masked. ++ unsafe { exception::asynchronous::local_irq_mask() }; ++ assert!(!exception::asynchronous::is_local_irq_masked()); ++ ++ unsafe { exception::asynchronous::local_irq_unmask() }; ++ assert!(exception::asynchronous::is_local_irq_masked()); ++} ++ ++/// Check that IRQ mask save is saving "something". ++#[kernel_test] ++fn local_irq_mask_save_works() { ++ // Precondition: IRQs are unmasked. ++ assert!(exception::asynchronous::is_local_irq_masked()); ++ ++ let first = unsafe { exception::asynchronous::local_irq_mask_save() }; ++ assert!(!exception::asynchronous::is_local_irq_masked()); ++ ++ let second = unsafe { exception::asynchronous::local_irq_mask_save() }; ++ assert_ne!(first, second); ++ ++ unsafe { exception::asynchronous::local_irq_restore(first) }; ++ assert!(exception::asynchronous::is_local_irq_masked()); ++} + +``` diff --git a/14_exceptions_part2_peripheral_IRQs/kernel b/14_exceptions_part2_peripheral_IRQs/kernel new file mode 100755 index 0000000000000000000000000000000000000000..14dcfa761a50f1e1c73fbb5946762f5834276c84 GIT binary patch literal 163376 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�#T!{v;45LtBAy|uaxR$Wtv@tpdTu^T=C_@o2 z;}o}#DU@S|3vyQi`GVX(1r}xIIs*BIsU;5n6w!B@J`DW>QAD636BY^z6_CS&?jh>E zII-IZ-CutC$@g7Hpz4|zOuTeWi2#oeHzP%yBn$T!8l`fyL`0P$tcnL{?sYtq#=G+5 z#qDR(s2H(@afq5TDV=dBY&Ji*5oH_@V`zeHt&lZA+7G4Q^bTW$jjSjFY*M$PqKI`P z_Ff7FtH7e>OrQt>W!-5X*74<(6q5d3M**B=GPt*Ea$$CIyC}|2!s9$@ar*$ioX-$Q z1tS9ms=UT0lW)}h1Q|4H`;8Npp#(@G57%_EYN&CV5gGMD$Ten-ptKPco`pjmOCzsvQkj%pWiob?+_5TKD@ugRXk~C) zVumDDR^Lk!qO9Pdp|%?NEJR>*iVOxtez%8FV4LAd9MnY_T5IG7@`dAAyegRz0tpI* zf*w5n>G>8NUH^R3DX)})1?bHe6psijHzxc=j0nbiixhQH9F_iWAR9^vyz#r5!-g`J z(6u#uQi3dK*2VkNW--c-x~C_N@9)h&9_|1A=u!9lBz1gn`n&l-`}BQ!?D(iP{>x}JN#@B=ABGpS7Nbjqo55oVv{dn%jjh{;WKZobTyRUx#{|2VfiLL+u literal 0 HcmV?d00001 diff --git a/14_exceptions_part2_peripheral_IRQs/kernel8.img b/14_exceptions_part2_peripheral_IRQs/kernel8.img new file mode 100755 index 0000000000000000000000000000000000000000..9bc0ea3b72da05ce34657e4274981f3dbaeae399 GIT binary patch literal 67648 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 literal 0 HcmV?d00001 diff --git a/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/cpu.rs b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/cpu.rs new file mode 100644 index 00000000..7839f142 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/cpu.rs @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Architectural processor code. + +use crate::{bsp, cpu}; +use cortex_a::{asm, regs::*}; + +//-------------------------------------------------------------------------------------------------- +// Boot Code +//-------------------------------------------------------------------------------------------------- + +/// The entry of the `kernel` binary. +/// +/// The function must be named `_start`, because the linker is looking for this exact name. +/// +/// # Safety +/// +/// - Linker script must ensure to place this function at `0x80_000`. +#[naked] +#[no_mangle] +pub unsafe extern "C" fn _start() -> ! { + // Expect the boot core to start in EL2. + if (bsp::cpu::BOOT_CORE_ID == cpu::smp::core_id()) + && (CurrentEL.get() == CurrentEL::EL::EL2.value) + { + el2_to_el1_transition() + } else { + // If not core0, infinitely wait for events. + wait_forever() + } +} + +/// Transition from EL2 to EL1. +/// +/// # Safety +/// +/// - The HW state of EL1 must be prepared in a sound way. +/// - Exception return from EL2 must must continue execution in EL1 with +/// `runtime_init::runtime_init()`. +#[inline(always)] +unsafe fn el2_to_el1_transition() -> ! { + use crate::runtime_init; + + // Enable timer counter registers for EL1. + CNTHCTL_EL2.write(CNTHCTL_EL2::EL1PCEN::SET + CNTHCTL_EL2::EL1PCTEN::SET); + + // No offset for reading the counters. + CNTVOFF_EL2.set(0); + + // Set EL1 execution state to AArch64. + HCR_EL2.write(HCR_EL2::RW::EL1IsAarch64); + + // Set up a simulated exception return. + // + // First, fake a saved program status where all interrupts were masked and SP_EL1 was used as a + // stack pointer. + SPSR_EL2.write( + SPSR_EL2::D::Masked + + SPSR_EL2::A::Masked + + SPSR_EL2::I::Masked + + SPSR_EL2::F::Masked + + SPSR_EL2::M::EL1h, + ); + + // Second, let the link register point to runtime_init(). + ELR_EL2.set(runtime_init::runtime_init as *const () as u64); + + // Set up SP_EL1 (stack pointer), which will be used by EL1 once we "return" to it. + SP_EL1.set(bsp::cpu::BOOT_CORE_STACK_START); + + // Use `eret` to "return" to EL1. This results in execution of runtime_init() in EL1. + asm::eret() +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +pub use asm::nop; + +/// Spin for `n` cycles. +#[inline(always)] +pub fn spin_for_cycles(n: usize) { + for _ in 0..n { + asm::nop(); + } +} + +/// Pause execution on the core. +#[inline(always)] +pub fn wait_forever() -> ! { + loop { + asm::wfe() + } +} + +//-------------------------------------------------------------------------------------------------- +// Testing +//-------------------------------------------------------------------------------------------------- + +/// Make the host QEMU binary execute `exit(1)`. +pub fn qemu_exit_failure() -> ! { + qemu_exit::aarch64::exit_failure() +} + +/// Make the host QEMU binary execute `exit(0)`. +pub fn qemu_exit_success() -> ! { + qemu_exit::aarch64::exit_success() +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/cpu/smp.rs b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/cpu/smp.rs new file mode 100644 index 00000000..8429e1d2 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/cpu/smp.rs @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Architectural symmetric multiprocessing. + +use cortex_a::regs::*; + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Return the executing core's id. +#[inline(always)] +pub fn core_id() -> T +where + T: From, +{ + const CORE_MASK: u64 = 0b11; + + T::from((MPIDR_EL1.get() & CORE_MASK) as u8) +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception.S b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception.S new file mode 100644 index 00000000..70817be4 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception.S @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +/// Call the function provided by parameter `\handler` after saving the exception context. Provide +/// the context as the first parameter to '\handler'. +.macro CALL_WITH_CONTEXT handler + // Make room on the stack for the exception context. + sub sp, sp, #16 * 17 + + // Store all general purpose registers on the stack. + stp x0, x1, [sp, #16 * 0] + stp x2, x3, [sp, #16 * 1] + stp x4, x5, [sp, #16 * 2] + stp x6, x7, [sp, #16 * 3] + stp x8, x9, [sp, #16 * 4] + stp x10, x11, [sp, #16 * 5] + stp x12, x13, [sp, #16 * 6] + stp x14, x15, [sp, #16 * 7] + stp x16, x17, [sp, #16 * 8] + stp x18, x19, [sp, #16 * 9] + stp x20, x21, [sp, #16 * 10] + stp x22, x23, [sp, #16 * 11] + stp x24, x25, [sp, #16 * 12] + stp x26, x27, [sp, #16 * 13] + stp x28, x29, [sp, #16 * 14] + + // Add the exception link register (ELR_EL1) and the saved program status (SPSR_EL1). + mrs x1, ELR_EL1 + mrs x2, SPSR_EL1 + + stp lr, x1, [sp, #16 * 15] + str w2, [sp, #16 * 16] + + // x0 is the first argument for the function called through `\handler`. + mov x0, sp + + // Call `\handler`. + bl \handler + + // After returning from exception handling code, replay the saved context and return via `eret`. + b __exception_restore_context +.endm + +.macro FIQ_SUSPEND +1: wfe + b 1b +.endm + +//-------------------------------------------------------------------------------------------------- +// The exception vector table. +//-------------------------------------------------------------------------------------------------- +.section .exception_vectors, "ax", @progbits + +// Align by 2^11 bytes, as demanded by ARMv8-A. Same as ALIGN(2048) in an ld script. +.align 11 + +// Export a symbol for the Rust code to use. +__exception_vector_start: + +// Current exception level with SP_EL0. +// +// .org sets the offset relative to section start. +// +// # Safety +// +// - It must be ensured that `CALL_WITH_CONTEXT` <= 0x80 bytes. +.org 0x000 + CALL_WITH_CONTEXT current_el0_synchronous +.org 0x080 + CALL_WITH_CONTEXT current_el0_irq +.org 0x100 + FIQ_SUSPEND +.org 0x180 + CALL_WITH_CONTEXT current_el0_serror + +// Current exception level with SP_ELx, x > 0. +.org 0x200 + CALL_WITH_CONTEXT current_elx_synchronous +.org 0x280 + CALL_WITH_CONTEXT current_elx_irq +.org 0x300 + FIQ_SUSPEND +.org 0x380 + CALL_WITH_CONTEXT current_elx_serror + +// Lower exception level, AArch64 +.org 0x400 + CALL_WITH_CONTEXT lower_aarch64_synchronous +.org 0x480 + CALL_WITH_CONTEXT lower_aarch64_irq +.org 0x500 + FIQ_SUSPEND +.org 0x580 + CALL_WITH_CONTEXT lower_aarch64_serror + +// Lower exception level, AArch32 +.org 0x600 + CALL_WITH_CONTEXT lower_aarch32_synchronous +.org 0x680 + CALL_WITH_CONTEXT lower_aarch32_irq +.org 0x700 + FIQ_SUSPEND +.org 0x780 + CALL_WITH_CONTEXT lower_aarch32_serror +.org 0x800 + +//-------------------------------------------------------------------------------------------------- +// Helper functions +//-------------------------------------------------------------------------------------------------- +.section .text + +__exception_restore_context: + ldr w19, [sp, #16 * 16] + ldp lr, x20, [sp, #16 * 15] + + msr SPSR_EL1, x19 + msr ELR_EL1, x20 + + ldp x0, x1, [sp, #16 * 0] + ldp x2, x3, [sp, #16 * 1] + ldp x4, x5, [sp, #16 * 2] + ldp x6, x7, [sp, #16 * 3] + ldp x8, x9, [sp, #16 * 4] + ldp x10, x11, [sp, #16 * 5] + ldp x12, x13, [sp, #16 * 6] + ldp x14, x15, [sp, #16 * 7] + ldp x16, x17, [sp, #16 * 8] + ldp x18, x19, [sp, #16 * 9] + ldp x20, x21, [sp, #16 * 10] + ldp x22, x23, [sp, #16 * 11] + ldp x24, x25, [sp, #16 * 12] + ldp x26, x27, [sp, #16 * 13] + ldp x28, x29, [sp, #16 * 14] + + add sp, sp, #16 * 17 + + eret diff --git a/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception.rs b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception.rs new file mode 100644 index 00000000..396618bf --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception.rs @@ -0,0 +1,261 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Architectural synchronous and asynchronous exception handling. + +use crate::{bsp, exception}; +use core::fmt; +use cortex_a::{barrier, regs::*}; +use register::InMemoryRegister; + +// Assembly counterpart to this file. +global_asm!(include_str!("exception.S")); + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +/// Wrapper struct for memory copy of SPSR_EL1. +#[repr(transparent)] +struct SpsrEL1(InMemoryRegister); + +/// The exception context as it is stored on the stack on exception entry. +#[repr(C)] +struct ExceptionContext { + /// General Purpose Registers. + gpr: [u64; 30], + + /// The link register, aka x30. + lr: u64, + + /// Exception link register. The program counter at the time the exception happened. + elr_el1: u64, + + /// Saved program status. + spsr_el1: SpsrEL1, +} + +/// Wrapper struct for pretty printing ESR_EL1. +struct EsrEL1; + +//-------------------------------------------------------------------------------------------------- +// Private Code +//-------------------------------------------------------------------------------------------------- + +/// Print verbose information about the exception and the panic. +fn default_exception_handler(e: &ExceptionContext) { + panic!( + "\n\nCPU Exception!\n\ + FAR_EL1: {:#018x}\n\ + {}\n\ + {}", + FAR_EL1.get(), + EsrEL1 {}, + e + ); +} + +//------------------------------------------------------------------------------ +// Current, EL0 +//------------------------------------------------------------------------------ + +#[no_mangle] +unsafe extern "C" fn current_el0_synchronous(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +#[no_mangle] +unsafe extern "C" fn current_el0_irq(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +#[no_mangle] +unsafe extern "C" fn current_el0_serror(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +//------------------------------------------------------------------------------ +// Current, ELx +//------------------------------------------------------------------------------ + +#[no_mangle] +unsafe extern "C" fn current_elx_synchronous(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +#[no_mangle] +unsafe extern "C" fn current_elx_irq(_e: &mut ExceptionContext) { + use exception::asynchronous::interface::IRQManager; + + let token = &exception::asynchronous::IRQContext::new(); + bsp::exception::asynchronous::irq_manager().handle_pending_irqs(token); +} + +#[no_mangle] +unsafe extern "C" fn current_elx_serror(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +//------------------------------------------------------------------------------ +// Lower, AArch64 +//------------------------------------------------------------------------------ + +#[no_mangle] +unsafe extern "C" fn lower_aarch64_synchronous(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +#[no_mangle] +unsafe extern "C" fn lower_aarch64_irq(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +#[no_mangle] +unsafe extern "C" fn lower_aarch64_serror(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +//------------------------------------------------------------------------------ +// Lower, AArch32 +//------------------------------------------------------------------------------ + +#[no_mangle] +unsafe extern "C" fn lower_aarch32_synchronous(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +#[no_mangle] +unsafe extern "C" fn lower_aarch32_irq(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +#[no_mangle] +unsafe extern "C" fn lower_aarch32_serror(e: &mut ExceptionContext) { + default_exception_handler(e); +} + +//------------------------------------------------------------------------------ +// Pretty printing +//------------------------------------------------------------------------------ + +/// Human readable ESR_EL1. +#[rustfmt::skip] +impl fmt::Display for EsrEL1 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let esr_el1 = ESR_EL1.extract(); + + // Raw print of whole register. + writeln!(f, "ESR_EL1: {:#010x}", esr_el1.get())?; + + // Raw print of exception class. + write!(f, " Exception Class (EC) : {:#x}", esr_el1.read(ESR_EL1::EC))?; + + // Exception class, translation. + let ec_translation = match esr_el1.read_as_enum(ESR_EL1::EC) { + Some(ESR_EL1::EC::Value::DataAbortCurrentEL) => "Data Abort, current EL", + _ => "N/A", + }; + writeln!(f, " - {}", ec_translation)?; + + // Raw print of instruction specific syndrome. + write!(f, " Instr Specific Syndrome (ISS): {:#x}", esr_el1.read(ESR_EL1::ISS))?; + + Ok(()) + } +} + +/// Human readable SPSR_EL1. +#[rustfmt::skip] +impl fmt::Display for SpsrEL1 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // Raw value. + writeln!(f, "SPSR_EL1: {:#010x}", self.0.get())?; + + let to_flag_str = |x| -> _ { + if x { "Set" } else { "Not set" } + }; + + writeln!(f, " Flags:")?; + writeln!(f, " Negative (N): {}", to_flag_str(self.0.is_set(SPSR_EL1::N)))?; + writeln!(f, " Zero (Z): {}", to_flag_str(self.0.is_set(SPSR_EL1::Z)))?; + writeln!(f, " Carry (C): {}", to_flag_str(self.0.is_set(SPSR_EL1::C)))?; + writeln!(f, " Overflow (V): {}", to_flag_str(self.0.is_set(SPSR_EL1::V)))?; + + let to_mask_str = |x| -> _ { + if x { "Masked" } else { "Unmasked" } + }; + + writeln!(f, " Exception handling state:")?; + writeln!(f, " Debug (D): {}", to_mask_str(self.0.is_set(SPSR_EL1::D)))?; + writeln!(f, " SError (A): {}", to_mask_str(self.0.is_set(SPSR_EL1::A)))?; + writeln!(f, " IRQ (I): {}", to_mask_str(self.0.is_set(SPSR_EL1::I)))?; + writeln!(f, " FIQ (F): {}", to_mask_str(self.0.is_set(SPSR_EL1::F)))?; + + write!(f, " Illegal Execution State (IL): {}", + to_flag_str(self.0.is_set(SPSR_EL1::IL)) + )?; + + Ok(()) + } +} + +/// Human readable print of the exception context. +impl fmt::Display for ExceptionContext { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + writeln!(f, "ELR_EL1: {:#018x}", self.elr_el1)?; + writeln!(f, "{}", self.spsr_el1)?; + writeln!(f)?; + writeln!(f, "General purpose register:")?; + + #[rustfmt::skip] + let alternating = |x| -> _ { + if x % 2 == 0 { " " } else { "\n" } + }; + + // Print two registers per line. + for (i, reg) in self.gpr.iter().enumerate() { + write!(f, " x{: <2}: {: >#018x}{}", i, reg, alternating(i))?; + } + write!(f, " lr : {:#018x}", self.lr)?; + + Ok(()) + } +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- +use crate::exception::PrivilegeLevel; + +/// The processing element's current privilege level. +pub fn current_privilege_level() -> (PrivilegeLevel, &'static str) { + let el = CurrentEL.read_as_enum(CurrentEL::EL); + match el { + Some(CurrentEL::EL::Value::EL2) => (PrivilegeLevel::Hypervisor, "EL2"), + Some(CurrentEL::EL::Value::EL1) => (PrivilegeLevel::Kernel, "EL1"), + Some(CurrentEL::EL::Value::EL0) => (PrivilegeLevel::User, "EL0"), + _ => (PrivilegeLevel::Unknown, "Unknown"), + } +} + +/// Init exception handling by setting the exception vector base address register. +/// +/// # Safety +/// +/// - Changes the HW state of the executing core. +/// - The vector table and the symbol `__exception_vector_table_start` from the linker script must +/// adhere to the alignment and size constraints demanded by the ARMv8-A Architecture Reference +/// Manual. +pub unsafe fn handling_init() { + // Provided by exception.S. + extern "C" { + static mut __exception_vector_start: u64; + } + let addr: u64 = &__exception_vector_start as *const _ as u64; + + VBAR_EL1.set(addr); + + // Force VBAR update to complete before next instruction. + barrier::isb(barrier::SY); +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception/asynchronous.rs b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception/asynchronous.rs new file mode 100644 index 00000000..e2887289 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/exception/asynchronous.rs @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Architectural asynchronous exception handling. + +use cortex_a::regs::*; + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +mod daif_bits { + pub const IRQ: u8 = 0b0010; +} + +trait DaifField { + fn daif_field() -> register::Field; +} + +struct Debug; +struct SError; +struct IRQ; +struct FIQ; + +//-------------------------------------------------------------------------------------------------- +// Private Code +//-------------------------------------------------------------------------------------------------- + +impl DaifField for Debug { + fn daif_field() -> register::Field { + DAIF::D + } +} + +impl DaifField for SError { + fn daif_field() -> register::Field { + DAIF::A + } +} + +impl DaifField for IRQ { + fn daif_field() -> register::Field { + DAIF::I + } +} + +impl DaifField for FIQ { + fn daif_field() -> register::Field { + DAIF::F + } +} + +fn is_masked() -> bool { + DAIF.is_set(T::daif_field()) +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Returns whether IRQs are masked on the executing core. +pub fn is_local_irq_masked() -> bool { + !is_masked::() +} + +/// Unmask IRQs on the executing core. +/// +/// It is not needed to place an explicit instruction synchronization barrier after the `msr`. +/// Quoting the Architecture Reference Manual for ARMv8-A, section C5.1.3: +/// +/// "Writes to PSTATE.{PAN, D, A, I, F} occur in program order without the need for additional +/// synchronization." +/// +/// # Safety +/// +/// - Changes the HW state of the executing core. +#[inline(always)] +pub unsafe fn local_irq_unmask() { + asm!("msr DAIFClr, $0" + : // outputs + : "i"(daif_bits::IRQ) // inputs + : // clobbers + : "volatile" // options + ); +} + +/// Mask IRQs on the executing core. +/// +/// # Safety +/// +/// - Changes the HW state of the executing core. +#[inline(always)] +pub unsafe fn local_irq_mask() { + asm!("msr DAIFSet, $0" + : // outputs + : "i"(daif_bits::IRQ) // inputs + : // clobbers + : "volatile" // options + ); +} + +/// Mask IRQs on the executing core and return the previously saved interrupt mask bits (DAIF). +/// +/// # Safety +/// +/// - Changes the HW state of the executing core. +#[inline(always)] +pub unsafe fn local_irq_mask_save() -> u32 { + let saved = DAIF.get(); + local_irq_mask(); + + saved +} + +/// Restore the interrupt mask bits (DAIF) using the callee's argument. +/// +/// # Safety +/// +/// - Changes the HW state of the executing core. +/// - No sanity checks on the input. +#[inline(always)] +pub unsafe fn local_irq_restore(saved: u32) { + DAIF.set(saved); +} + +/// Print the AArch64 exceptions status. +#[rustfmt::skip] +pub fn print_state() { + use crate::info; + + let to_mask_str = |x| -> _ { + if x { "Masked" } else { "Unmasked" } + }; + + info!(" Debug: {}", to_mask_str(is_masked::())); + info!(" SError: {}", to_mask_str(is_masked::())); + info!(" IRQ: {}", to_mask_str(is_masked::())); + info!(" FIQ: {}", to_mask_str(is_masked::())); +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/memory/mmu.rs b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/memory/mmu.rs new file mode 100644 index 00000000..e9c9d038 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/memory/mmu.rs @@ -0,0 +1,320 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Memory Management Unit Driver. +//! +//! Static page tables, compiled on boot; Everything 64 KiB granule. + +use super::{AccessPermissions, AttributeFields, MemAttributes}; +use crate::{bsp, memory}; +use core::convert; +use cortex_a::{barrier, regs::*}; +use register::register_bitfields; + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +// A table descriptor, as per ARMv8-A Architecture Reference Manual Figure D4-15. +register_bitfields! {u64, + STAGE1_TABLE_DESCRIPTOR [ + /// Physical address of the next page table. + NEXT_LEVEL_TABLE_ADDR_64KiB OFFSET(16) NUMBITS(32) [], // [47:16] + + TYPE OFFSET(1) NUMBITS(1) [ + Block = 0, + Table = 1 + ], + + VALID OFFSET(0) NUMBITS(1) [ + False = 0, + True = 1 + ] + ] +} + +// A level 3 page descriptor, as per ARMv8-A Architecture Reference Manual Figure D4-17. +register_bitfields! {u64, + STAGE1_PAGE_DESCRIPTOR [ + /// Privileged execute-never. + PXN OFFSET(53) NUMBITS(1) [ + False = 0, + True = 1 + ], + + /// Physical address of the next page table (lvl2) or the page descriptor (lvl3). + OUTPUT_ADDR_64KiB OFFSET(16) NUMBITS(32) [], // [47:16] + + /// Access flag. + AF OFFSET(10) NUMBITS(1) [ + False = 0, + True = 1 + ], + + /// Shareability field. + SH OFFSET(8) NUMBITS(2) [ + OuterShareable = 0b10, + InnerShareable = 0b11 + ], + + /// Access Permissions. + AP OFFSET(6) NUMBITS(2) [ + RW_EL1 = 0b00, + RW_EL1_EL0 = 0b01, + RO_EL1 = 0b10, + RO_EL1_EL0 = 0b11 + ], + + /// Memory attributes index into the MAIR_EL1 register. + AttrIndx OFFSET(2) NUMBITS(3) [], + + TYPE OFFSET(1) NUMBITS(1) [ + Block = 0, + Table = 1 + ], + + VALID OFFSET(0) NUMBITS(1) [ + False = 0, + True = 1 + ] + ] +} + +const SIXTYFOUR_KIB_SHIFT: usize = 16; // log2(64 * 1024) +const FIVETWELVE_MIB_SHIFT: usize = 29; // log2(512 * 1024 * 1024) + +/// A table descriptor for 64 KiB aperture. +/// +/// The output points to the next table. +#[derive(Copy, Clone)] +#[repr(transparent)] +struct TableDescriptor(u64); + +/// A page descriptor with 64 KiB aperture. +/// +/// The output points to physical memory. +#[derive(Copy, Clone)] +#[repr(transparent)] +struct PageDescriptor(u64); + +/// Big monolithic struct for storing the page tables. Individual levels must be 64 KiB aligned, +/// hence the "reverse" order of appearance. +#[repr(C)] +#[repr(align(65536))] +struct PageTables { + /// Page descriptors, covering 64 KiB windows per entry. + lvl3: [[PageDescriptor; 8192]; N], + + /// Table descriptors, covering 512 MiB windows. + lvl2: [TableDescriptor; N], +} + +/// Usually evaluates to 1 GiB for RPi3 and 4 GiB for RPi 4. +const ENTRIES_512_MIB: usize = bsp::memory::mmu::addr_space_size() >> FIVETWELVE_MIB_SHIFT; + +/// The page tables. +/// +/// # Safety +/// +/// - Supposed to land in `.bss`. Therefore, ensure that they boil down to all "0" entries. +static mut TABLES: PageTables<{ ENTRIES_512_MIB }> = PageTables { + lvl3: [[PageDescriptor(0); 8192]; ENTRIES_512_MIB], + lvl2: [TableDescriptor(0); ENTRIES_512_MIB], +}; + +trait BaseAddr { + fn base_addr_u64(&self) -> u64; + fn base_addr_usize(&self) -> usize; +} + +/// Constants for indexing the MAIR_EL1. +#[allow(dead_code)] +mod mair { + pub const DEVICE: u64 = 0; + pub const NORMAL: u64 = 1; +} + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Memory Management Unit type. +pub struct MemoryManagementUnit; + +//-------------------------------------------------------------------------------------------------- +// Global instances +//-------------------------------------------------------------------------------------------------- + +static MMU: MemoryManagementUnit = MemoryManagementUnit; + +//-------------------------------------------------------------------------------------------------- +// Private Code +//-------------------------------------------------------------------------------------------------- + +impl BaseAddr for [T; N] { + fn base_addr_u64(&self) -> u64 { + self as *const T as u64 + } + + fn base_addr_usize(&self) -> usize { + self as *const T as usize + } +} + +impl convert::From for TableDescriptor { + fn from(next_lvl_table_addr: usize) -> Self { + let shifted = next_lvl_table_addr >> SIXTYFOUR_KIB_SHIFT; + let val = (STAGE1_TABLE_DESCRIPTOR::VALID::True + + STAGE1_TABLE_DESCRIPTOR::TYPE::Table + + STAGE1_TABLE_DESCRIPTOR::NEXT_LEVEL_TABLE_ADDR_64KiB.val(shifted as u64)) + .value; + + TableDescriptor(val) + } +} + +/// Convert the kernel's generic memory range attributes to HW-specific attributes of the MMU. +impl convert::From + for register::FieldValue +{ + fn from(attribute_fields: AttributeFields) -> Self { + // Memory attributes. + let mut desc = match attribute_fields.mem_attributes { + MemAttributes::CacheableDRAM => { + STAGE1_PAGE_DESCRIPTOR::SH::InnerShareable + + STAGE1_PAGE_DESCRIPTOR::AttrIndx.val(mair::NORMAL) + } + MemAttributes::Device => { + STAGE1_PAGE_DESCRIPTOR::SH::OuterShareable + + STAGE1_PAGE_DESCRIPTOR::AttrIndx.val(mair::DEVICE) + } + }; + + // Access Permissions. + desc += match attribute_fields.acc_perms { + AccessPermissions::ReadOnly => STAGE1_PAGE_DESCRIPTOR::AP::RO_EL1, + AccessPermissions::ReadWrite => STAGE1_PAGE_DESCRIPTOR::AP::RW_EL1, + }; + + // Execute Never. + desc += if attribute_fields.execute_never { + STAGE1_PAGE_DESCRIPTOR::PXN::True + } else { + STAGE1_PAGE_DESCRIPTOR::PXN::False + }; + + desc + } +} + +impl PageDescriptor { + fn new(output_addr: usize, attribute_fields: AttributeFields) -> Self { + let shifted = output_addr >> SIXTYFOUR_KIB_SHIFT; + let val = (STAGE1_PAGE_DESCRIPTOR::VALID::True + + STAGE1_PAGE_DESCRIPTOR::AF::True + + attribute_fields.into() + + STAGE1_PAGE_DESCRIPTOR::TYPE::Table + + STAGE1_PAGE_DESCRIPTOR::OUTPUT_ADDR_64KiB.val(shifted as u64)) + .value; + + Self(val) + } +} + +/// Setup function for the MAIR_EL1 register. +fn set_up_mair() { + // Define the memory types being mapped. + MAIR_EL1.write( + // Attribute 1 - Cacheable normal DRAM. + MAIR_EL1::Attr1_HIGH::Memory_OuterWriteBack_NonTransient_ReadAlloc_WriteAlloc + + MAIR_EL1::Attr1_LOW_MEMORY::InnerWriteBack_NonTransient_ReadAlloc_WriteAlloc + + // Attribute 0 - Device. + + MAIR_EL1::Attr0_HIGH::Device + + MAIR_EL1::Attr0_LOW_DEVICE::Device_nGnRE, + ); +} + +/// Iterates over all static page table entries and fills them at once. +/// +/// # Safety +/// +/// - Modifies a `static mut`. Ensure it only happens from here. +unsafe fn populate_pt_entries() -> Result<(), &'static str> { + for (l2_nr, l2_entry) in TABLES.lvl2.iter_mut().enumerate() { + *l2_entry = TABLES.lvl3[l2_nr].base_addr_usize().into(); + + for (l3_nr, l3_entry) in TABLES.lvl3[l2_nr].iter_mut().enumerate() { + let virt_addr = (l2_nr << FIVETWELVE_MIB_SHIFT) + (l3_nr << SIXTYFOUR_KIB_SHIFT); + + let (output_addr, attribute_fields) = + bsp::memory::mmu::virt_mem_layout().get_virt_addr_properties(virt_addr)?; + + *l3_entry = PageDescriptor::new(output_addr, attribute_fields); + } + } + + Ok(()) +} + +/// Configure various settings of stage 1 of the EL1 translation regime. +fn configure_translation_control() { + let ips = ID_AA64MMFR0_EL1.read(ID_AA64MMFR0_EL1::PARange); + TCR_EL1.write( + TCR_EL1::TBI0::Ignored + + TCR_EL1::IPS.val(ips) + + TCR_EL1::TG0::KiB_64 + + TCR_EL1::SH0::Inner + + TCR_EL1::ORGN0::WriteBack_ReadAlloc_WriteAlloc_Cacheable + + TCR_EL1::IRGN0::WriteBack_ReadAlloc_WriteAlloc_Cacheable + + TCR_EL1::EPD0::EnableTTBR0Walks + + TCR_EL1::T0SZ.val(32), // TTBR0 spans 4 GiB total. + ); +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Return a reference to the MMU. +pub fn mmu() -> &'static impl memory::mmu::interface::MMU { + &MMU +} + +//------------------------------------------------------------------------------ +// OS Interface Code +//------------------------------------------------------------------------------ + +impl memory::mmu::interface::MMU for MemoryManagementUnit { + unsafe fn init(&self) -> Result<(), &'static str> { + // Fail early if translation granule is not supported. Both RPis support it, though. + if !ID_AA64MMFR0_EL1.matches_all(ID_AA64MMFR0_EL1::TGran64::Supported) { + return Err("64 KiB translation granule not supported"); + } + + // Prepare the memory attribute indirection register. + set_up_mair(); + + // Populate page tables. + populate_pt_entries()?; + + // Set the "Translation Table Base Register". + TTBR0_EL1.set_baddr(TABLES.lvl2.base_addr_u64()); + + configure_translation_control(); + + // Switch the MMU on. + // + // First, force all previous changes to be seen before the MMU is enabled. + barrier::isb(barrier::SY); + + // Enable the MMU and turn on data and instruction caching. + SCTLR_EL1.modify(SCTLR_EL1::M::Enable + SCTLR_EL1::C::Cacheable + SCTLR_EL1::I::Cacheable); + + // Force MMU init to complete before next instruction. + barrier::isb(barrier::SY); + + Ok(()) + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/time.rs b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/time.rs new file mode 100644 index 00000000..fb01ced1 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/time.rs @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Architectural timer primitives. + +use crate::{time, warn}; +use core::time::Duration; +use cortex_a::regs::*; + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +const NS_PER_S: u64 = 1_000_000_000; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// ARMv8 Generic Timer. +pub struct GenericTimer; + +//-------------------------------------------------------------------------------------------------- +// Global instances +//-------------------------------------------------------------------------------------------------- + +static TIME_MANAGER: GenericTimer = GenericTimer; + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Return a reference to the time manager. +pub fn time_manager() -> &'static impl time::interface::TimeManager { + &TIME_MANAGER +} + +//------------------------------------------------------------------------------ +// OS Interface Code +//------------------------------------------------------------------------------ + +impl time::interface::TimeManager for GenericTimer { + fn resolution(&self) -> Duration { + Duration::from_nanos(NS_PER_S / (CNTFRQ_EL0.get() as u64)) + } + + fn uptime(&self) -> Duration { + let frq: u64 = CNTFRQ_EL0.get() as u64; + let current_count: u64 = CNTPCT_EL0.get() * NS_PER_S; + + Duration::from_nanos(current_count / frq) + } + + fn spin_for(&self, duration: Duration) { + // Instantly return on zero. + if duration.as_nanos() == 0 { + return; + } + + // Calculate the register compare value. + let frq = CNTFRQ_EL0.get() as u64; + let x = match frq.checked_mul(duration.as_nanos() as u64) { + None => { + warn!("Spin duration too long, skipping"); + return; + } + Some(val) => val, + }; + let tval = x / NS_PER_S; + + // Check if it is within supported bounds. + let warn: Option<&str> = if tval == 0 { + Some("smaller") + } else if tval > u32::max_value().into() { + Some("bigger") + } else { + None + }; + + if let Some(w) = warn { + warn!( + "Spin duration {} than architecturally supported, skipping", + w + ); + return; + } + + // Set the compare value register. + CNTP_TVAL_EL0.set(tval as u32); + + // Kick off the counting. // Disable timer interrupt. + CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::SET + CNTP_CTL_EL0::IMASK::SET); + + // ISTATUS will be '1' when cval ticks have passed. Busy-check it. + while !CNTP_CTL_EL0.matches_all(CNTP_CTL_EL0::ISTATUS::SET) {} + + // Disable counting again. + CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::CLEAR); + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp.rs new file mode 100644 index 00000000..3dbbba8c --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp.rs @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Conditional re-exporting of Board Support Packages. + +mod device_driver; + +#[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] +mod raspberrypi; + +#[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] +pub use raspberrypi::*; + +//-------------------------------------------------------------------------------------------------- +// Testing +//-------------------------------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + use test_macros::kernel_test; + + /// Ensure the kernel's virtual memory layout is free of overlaps. + #[kernel_test] + fn virt_mem_layout_has_no_overlaps() { + let layout = memory::mmu::virt_mem_layout().inner(); + + for (i, first) in layout.iter().enumerate() { + for second in layout.iter().skip(i + 1) { + let first_range = first.virtual_range; + let second_range = second.virtual_range; + + assert!(!first_range().contains(second_range().start())); + assert!(!first_range().contains(second_range().end())); + assert!(!second_range().contains(first_range().start())); + assert!(!second_range().contains(first_range().end())); + } + } + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver.rs new file mode 100644 index 00000000..3fe1fa55 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver.rs @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Device driver. + +#[cfg(feature = "bsp_rpi4")] +mod arm; +#[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] +mod bcm; +mod common; + +#[cfg(feature = "bsp_rpi4")] +pub use arm::*; +#[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] +pub use bcm::*; diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm.rs new file mode 100644 index 00000000..9e42fa49 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm.rs @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! ARM driver top level. + +#[cfg(feature = "bsp_rpi4")] +pub mod gicv2; + +#[cfg(feature = "bsp_rpi4")] +pub use gicv2::*; diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2.rs new file mode 100644 index 00000000..4501bec7 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2.rs @@ -0,0 +1,222 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! GICv2 Driver - ARM Generic Interrupt Controller v2. +//! +//! The following is a collection of excerpts with useful information from +//! - `Programmer's Guide for ARMv8-A` +//! - `ARM Generic Interrupt Controller Architecture Specification` +//! +//! # Programmer's Guide - 10.6.1 Configuration +//! +//! The GIC is accessed as a memory-mapped peripheral. +//! +//! All cores can access the common Distributor, but the CPU interface is banked, that is, each core +//! uses the same address to access its own private CPU interface. +//! +//! It is not possible for a core to access the CPU interface of another core. +//! +//! # Architecture Specification - 10.6.2 Initialization +//! +//! Both the Distributor and the CPU interfaces are disabled at reset. The GIC must be initialized +//! after reset before it can deliver interrupts to the core. +//! +//! In the Distributor, software must configure the priority, target, security and enable individual +//! interrupts. The Distributor must subsequently be enabled through its control register +//! (GICD_CTLR). For each CPU interface, software must program the priority mask and preemption +//! settings. +//! +//! Each CPU interface block itself must be enabled through its control register (GICD_CTLR). This +//! prepares the GIC to deliver interrupts to the core. +//! +//! Before interrupts are expected in the core, software prepares the core to take interrupts by +//! setting a valid interrupt vector in the vector table, and clearing interrupt mask bits in +//! PSTATE, and setting the routing controls. +//! +//! The entire interrupt mechanism in the system can be disabled by disabling the Distributor. +//! Interrupt delivery to an individual core can be disabled by disabling its CPU interface. +//! Individual interrupts can also be disabled (or enabled) in the distributor. +//! +//! For an interrupt to reach the core, the individual interrupt, Distributor and CPU interface must +//! all be enabled. The interrupt also needs to be of sufficient priority, that is, higher than the +//! core's priority mask. +//! +//! # Architecture Specification - 1.4.2 Interrupt types +//! +//! - Peripheral interrupt +//! - Private Peripheral Interrupt (PPI) +//! - This is a peripheral interrupt that is specific to a single processor. +//! - Shared Peripheral Interrupt (SPI) +//! - This is a peripheral interrupt that the Distributor can route to any of a specified +//! combination of processors. +//! +//! - Software-generated interrupt (SGI) +//! - This is an interrupt generated by software writing to a GICD_SGIR register in the GIC. The +//! system uses SGIs for interprocessor communication. +//! - An SGI has edge-triggered properties. The software triggering of the interrupt is +//! equivalent to the edge transition of the interrupt request signal. +//! - When an SGI occurs in a multiprocessor implementation, the CPUID field in the Interrupt +//! Acknowledge Register, GICC_IAR, or the Aliased Interrupt Acknowledge Register, GICC_AIAR, +//! identifies the processor that requested the interrupt. +//! +//! # Architecture Specification - 2.2.1 Interrupt IDs +//! +//! Interrupts from sources are identified using ID numbers. Each CPU interface can see up to 1020 +//! interrupts. The banking of SPIs and PPIs increases the total number of interrupts supported by +//! the Distributor. +//! +//! The GIC assigns interrupt ID numbers ID0-ID1019 as follows: +//! - Interrupt numbers 32..1019 are used for SPIs. +//! - Interrupt numbers 0..31 are used for interrupts that are private to a CPU interface. These +//! interrupts are banked in the Distributor. +//! - A banked interrupt is one where the Distributor can have multiple interrupts with the +//! same ID. A banked interrupt is identified uniquely by its ID number and its associated +//! CPU interface number. Of the banked interrupt IDs: +//! - 00..15 SGIs +//! - 16..31 PPIs + +mod gicc; +mod gicd; + +use crate::{bsp, cpu, driver, exception, synchronization, synchronization::InitStateLock}; + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +type HandlerTable = [Option; GICv2::NUM_IRQS]; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Used for the associated type of trait [`exception::asynchronous::interface::IRQManager`]. +pub type IRQNumber = exception::asynchronous::IRQNumber<{ GICv2::MAX_IRQ_NUMBER }>; + +/// Representation of the GIC. +pub struct GICv2 { + /// The Distributor. + gicd: gicd::GICD, + + /// The CPU Interface. + gicc: gicc::GICC, + + /// Stores registered IRQ handlers. Writable only during kernel init. RO afterwards. + handler_table: InitStateLock, +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +impl GICv2 { + const MAX_IRQ_NUMBER: usize = 300; // Normally 1019, but keep it lower to save some space. + const NUM_IRQS: usize = Self::MAX_IRQ_NUMBER + 1; + + /// Create an instance. + /// + /// # Safety + /// + /// - The user must ensure to provide the correct `base_addr`. + pub const unsafe fn new(gicd_base_addr: usize, gicc_base_addr: usize) -> Self { + Self { + gicd: gicd::GICD::new(gicd_base_addr), + gicc: gicc::GICC::new(gicc_base_addr), + handler_table: InitStateLock::new([None; Self::NUM_IRQS]), + } + } +} + +//------------------------------------------------------------------------------ +// OS Interface Code +//------------------------------------------------------------------------------ +use synchronization::interface::ReadWriteEx; + +impl driver::interface::DeviceDriver for GICv2 { + fn compatible(&self) -> &str { + "GICv2 (ARM Generic Interrupt Controller v2)" + } + + fn init(&self) -> Result<(), ()> { + if cpu::smp::core_id::() == bsp::cpu::BOOT_CORE_ID { + self.gicd.boot_core_init(); + } + + self.gicc.priority_accept_all(); + self.gicc.enable(); + + Ok(()) + } +} + +impl exception::asynchronous::interface::IRQManager for GICv2 { + type IRQNumberType = IRQNumber; + + fn register_handler( + &self, + irq_number: Self::IRQNumberType, + descriptor: exception::asynchronous::IRQDescriptor, + ) -> Result<(), &'static str> { + let mut r = &self.handler_table; + r.write(|table| { + let irq_number = irq_number.get(); + + if table[irq_number].is_some() { + return Err("IRQ handler already registered"); + } + + table[irq_number] = Some(descriptor); + + Ok(()) + }) + } + + fn enable(&self, irq_number: Self::IRQNumberType) { + self.gicd.enable(irq_number); + } + + fn handle_pending_irqs<'irq_context>( + &'irq_context self, + ic: &exception::asynchronous::IRQContext<'irq_context>, + ) { + // Extract the highest priority pending IRQ number from the Interrupt Acknowledge Register + // (IAR). + let irq_number = self.gicc.get_pending_number(ic); + + // Guard against spurious interrupts. + if irq_number > GICv2::MAX_IRQ_NUMBER { + return; + } + + // Call the IRQ handler. Panic if there is none. + let mut r = &self.handler_table; + r.read(|table| { + match table[irq_number] { + None => panic!("No handler registered for IRQ {}", irq_number), + Some(descriptor) => { + // Call the IRQ handler. Panics on failure. + descriptor.handler.handle().expect("Error handling IRQ"); + } + } + }); + + // Signal completion of handling. + self.gicc.mark_comleted(irq_number as u32, ic); + } + + fn print_handler(&self) { + use crate::info; + + info!(" Peripheral handler:"); + + let mut r = &self.handler_table; + r.read(|table| { + for (i, opt) in table.iter().skip(32).enumerate() { + if let Some(handler) = opt { + info!(" {: >3}. {}", i + 32, handler.name); + } + } + }); + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicc.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicc.rs new file mode 100644 index 00000000..eaa60363 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicc.rs @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! GICC Driver - GIC CPU interface. + +use crate::exception; +use core::ops; +use register::{mmio::*, register_bitfields, register_structs}; + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +register_bitfields! { + u32, + + /// CPU Interface Control Register + CTLR [ + Enable OFFSET(0) NUMBITS(1) [] + ], + + /// Interrupt Priority Mask Register + PMR [ + Priority OFFSET(0) NUMBITS(8) [] + ], + + /// Interrupt Acknowledge Register + IAR [ + InterruptID OFFSET(0) NUMBITS(10) [] + ], + + /// End of Interrupt Register + EOIR [ + EOIINTID OFFSET(0) NUMBITS(10) [] + ] +} + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +register_structs! { + #[allow(non_snake_case)] + pub RegisterBlock { + (0x000 => CTLR: ReadWrite), + (0x004 => PMR: ReadWrite), + (0x008 => _reserved1), + (0x00C => IAR: ReadWrite), + (0x010 => EOIR: ReadWrite), + (0x014 => @END), + } +} + +/// Representation of the GIC CPU interface. +pub struct GICC { + base_addr: usize, +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +impl ops::Deref for GICC { + type Target = RegisterBlock; + + fn deref(&self) -> &Self::Target { + unsafe { &*self.ptr() } + } +} + +impl GICC { + /// Create an instance. + /// + /// # Safety + /// + /// - The user must ensure to provide the correct `base_addr`. + pub const unsafe fn new(base_addr: usize) -> Self { + Self { base_addr } + } + + /// Return a pointer to the associated MMIO register block. + fn ptr(&self) -> *const RegisterBlock { + self.base_addr as *const _ + } + + /// Accept interrupts of any priority. + /// + /// Quoting the GICv2 Architecture Specification: + /// + /// "Writing 255 to the GICC_PMR always sets it to the largest supported priority field + /// value." + /// + /// # Safety + /// + /// - GICC MMIO registers are banked per CPU core. It is therefore safe to have `&self` instead + /// of `&mut self`. + pub fn priority_accept_all(&self) { + self.PMR.write(PMR::Priority.val(255)); // Comment in arch spec. + } + + /// Enable the interface - start accepting IRQs. + /// + /// # Safety + /// + /// - GICC MMIO registers are banked per CPU core. It is therefore safe to have `&self` instead + /// of `&mut self`. + pub fn enable(&self) { + self.CTLR.write(CTLR::Enable::SET); + } + + /// Extract the number of the highest-priority pending IRQ. + /// + /// Can only be called from IRQ context, which is ensured by taking an `IRQContext` token. + /// + /// # Safety + /// + /// - GICC MMIO registers are banked per CPU core. It is therefore safe to have `&self` instead + /// of `&mut self`. + #[allow(clippy::trivially_copy_pass_by_ref)] + pub fn get_pending_number<'irq_context>( + &self, + _ic: &exception::asynchronous::IRQContext<'irq_context>, + ) -> usize { + self.IAR.read(IAR::InterruptID) as usize + } + + /// Complete handling of the currently active IRQ. + /// + /// Can only be called from IRQ context, which is ensured by taking an `IRQContext` token. + /// + /// To be called after `get_pending_number()`. + /// + /// # Safety + /// + /// - GICC MMIO registers are banked per CPU core. It is therefore safe to have `&self` instead + /// of `&mut self`. + #[allow(clippy::trivially_copy_pass_by_ref)] + pub fn mark_comleted<'irq_context>( + &self, + irq_number: u32, + _ic: &exception::asynchronous::IRQContext<'irq_context>, + ) { + self.EOIR.write(EOIR::EOIINTID.val(irq_number)); + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicd.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicd.rs new file mode 100644 index 00000000..25a6bdda --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/arm/gicv2/gicd.rs @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! GICD Driver - GIC Distributor. +//! +//! # Glossary +//! - SPI - Shared Peripheral Interrupt. + +use crate::{ + bsp::device_driver::common::MMIODerefWrapper, state, synchronization, + synchronization::IRQSafeNullLock, +}; +use register::{mmio::*, register_bitfields, register_structs}; + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +register_bitfields! { + u32, + + /// Distributor Control Register + CTLR [ + Enable OFFSET(0) NUMBITS(1) [] + ], + + /// Interrupt Controller Type Register + TYPER [ + ITLinesNumber OFFSET(0) NUMBITS(5) [] + ], + + /// Interrupt Processor Targets Registers + ITARGETSR [ + Offset3 OFFSET(24) NUMBITS(8) [], + Offset2 OFFSET(16) NUMBITS(8) [], + Offset1 OFFSET(8) NUMBITS(8) [], + Offset0 OFFSET(0) NUMBITS(8) [] + ] +} + +register_structs! { + #[allow(non_snake_case)] + SharedRegisterBlock { + (0x000 => CTLR: ReadWrite), + (0x004 => TYPER: ReadOnly), + (0x008 => _reserved1), + (0x104 => ISENABLER: [ReadWrite; 31]), + (0x108 => _reserved2), + (0x820 => ITARGETSR: [ReadWrite; 248]), + (0xBFC => @END), + } +} + +register_structs! { + #[allow(non_snake_case)] + BankedRegisterBlock { + (0x000 => _reserved1), + (0x100 => ISENABLER: ReadWrite), + (0x104 => _reserved2), + (0x800 => ITARGETSR: [ReadOnly; 8]), + (0xBFC => @END), + } +} + +/// Abstraction for the non-banked parts of the associated MMIO registers. +type SharedRegs = MMIODerefWrapper; + +/// Abstraction for the banked parts of the associated MMIO registers. +type BankedRegs = MMIODerefWrapper; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Representation of the GIC Distributor. +pub struct GICD { + /// Access to shared registers is guarded with a lock. + shared_regs: IRQSafeNullLock, + + /// Access to banked registers is unguarded. + banked_regs: BankedRegs, +} + +//-------------------------------------------------------------------------------------------------- +// Private Code +//-------------------------------------------------------------------------------------------------- + +impl SharedRegs { + /// Return the number of IRQs that this HW implements. + #[inline(always)] + fn num_irqs(&mut self) -> usize { + // Query number of implemented IRQs. + // + // Refer to GICv2 Architecture Specification, Section 4.3.2. + ((self.TYPER.read(TYPER::ITLinesNumber) as usize) + 1) * 32 + } + + /// Return a slice of the implemented ITARGETSR. + #[inline(always)] + fn implemented_itargets_slice(&mut self) -> &[ReadWrite] { + assert!(self.num_irqs() >= 36); + + // Calculate the max index of the shared ITARGETSR array. + // + // The first 32 IRQs are private, so not included in `shared_regs`. Each ITARGETS + // register has four entries, so shift right by two. Subtract one because we start + // counting at zero. + let spi_itargetsr_max_index = ((self.num_irqs() - 32) >> 2) - 1; + + // Rust automatically inserts slice range sanity check, i.e. max >= min. + &self.ITARGETSR[0..spi_itargetsr_max_index] + } +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- +use synchronization::interface::Mutex; + +impl GICD { + /// Create an instance. + /// + /// # Safety + /// + /// - The user must ensure to provide the correct `base_addr`. + pub const unsafe fn new(base_addr: usize) -> Self { + Self { + shared_regs: IRQSafeNullLock::new(SharedRegs::new(base_addr)), + banked_regs: BankedRegs::new(base_addr), + } + } + + /// Use a banked ITARGETSR to retrieve the executing core's GIC target mask. + /// + /// Quoting the GICv2 Architecture Specification: + /// + /// "GICD_ITARGETSR0 to GICD_ITARGETSR7 are read-only, and each field returns a value that + /// corresponds only to the processor reading the register." + fn local_gic_target_mask(&self) -> u32 { + self.banked_regs.ITARGETSR[0].read(ITARGETSR::Offset0) + } + + /// Route all SPIs to the boot core and enable the distributor. + pub fn boot_core_init(&self) { + assert!( + state::state_manager().state() == state::State::Init, + "Only allowed during kernel init phase" + ); + + // Target all SPIs to the boot core only. + let mask = self.local_gic_target_mask(); + + let mut r = &self.shared_regs; + r.lock(|regs| { + for i in regs.implemented_itargets_slice().iter() { + i.write( + ITARGETSR::Offset3.val(mask) + + ITARGETSR::Offset2.val(mask) + + ITARGETSR::Offset1.val(mask) + + ITARGETSR::Offset0.val(mask), + ); + } + + regs.CTLR.write(CTLR::Enable::SET); + }); + } + + /// Enable an interrupt. + pub fn enable(&self, irq_num: super::IRQNumber) { + let irq_num = irq_num.get(); + + // Each bit in the u32 enable register corresponds to one IRQ number. Shift right by 5 + // (division by 32) and arrive at the index for the respective ISENABLER[i]. + let enable_reg_index = irq_num >> 5; + let enable_bit: u32 = 1u32 << (irq_num % 32); + + // Check if we are handling a private or shared IRQ. + match irq_num { + // Private. + 0..=31 => { + let enable_reg = &self.banked_regs.ISENABLER; + enable_reg.set(enable_reg.get() | enable_bit); + } + // Shared. + _ => { + let enable_reg_index_shared = enable_reg_index - 1; + + let mut r = &self.shared_regs; + r.lock(|regs| { + let enable_reg = ®s.ISENABLER[enable_reg_index_shared]; + enable_reg.set(enable_reg.get() | enable_bit); + }); + } + } + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm.rs new file mode 100644 index 00000000..5e4c9e70 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm.rs @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! BCM driver top level. + +mod bcm2xxx_gpio; +#[cfg(feature = "bsp_rpi3")] +mod bcm2xxx_interrupt_controller; +mod bcm2xxx_pl011_uart; + +pub use bcm2xxx_gpio::*; +#[cfg(feature = "bsp_rpi3")] +pub use bcm2xxx_interrupt_controller::*; +pub use bcm2xxx_pl011_uart::*; diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_gpio.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_gpio.rs new file mode 100644 index 00000000..0e7384f3 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_gpio.rs @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! GPIO Driver. + +use crate::{ + bsp::device_driver::common::MMIODerefWrapper, cpu, driver, synchronization, + synchronization::IRQSafeNullLock, +}; +use register::{mmio::*, register_bitfields, register_structs}; + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +// GPIO registers. +// +// Descriptions taken from +// https://github.com/raspberrypi/documentation/files/1888662/BCM2837-ARM-Peripherals.-.Revised.-.V2-1.pdf +register_bitfields! { + u32, + + /// GPIO Function Select 1 + GPFSEL1 [ + /// Pin 15 + FSEL15 OFFSET(15) NUMBITS(3) [ + Input = 0b000, + Output = 0b001, + AltFunc0 = 0b100 // PL011 UART RX + + ], + + /// Pin 14 + FSEL14 OFFSET(12) NUMBITS(3) [ + Input = 0b000, + Output = 0b001, + AltFunc0 = 0b100 // PL011 UART TX + ] + ], + + /// GPIO Pull-up/down Clock Register 0 + GPPUDCLK0 [ + /// Pin 15 + PUDCLK15 OFFSET(15) NUMBITS(1) [ + NoEffect = 0, + AssertClock = 1 + ], + + /// Pin 14 + PUDCLK14 OFFSET(14) NUMBITS(1) [ + NoEffect = 0, + AssertClock = 1 + ] + ] +} + +register_structs! { + #[allow(non_snake_case)] + RegisterBlock { + (0x00 => GPFSEL0: ReadWrite), + (0x04 => GPFSEL1: ReadWrite), + (0x08 => GPFSEL2: ReadWrite), + (0x0C => GPFSEL3: ReadWrite), + (0x10 => GPFSEL4: ReadWrite), + (0x14 => GPFSEL5: ReadWrite), + (0x18 => _reserved1), + (0x94 => GPPUD: ReadWrite), + (0x98 => GPPUDCLK0: ReadWrite), + (0x9C => GPPUDCLK1: ReadWrite), + (0xA0 => @END), + } +} + +/// Abstraction for the associated MMIO registers. +type Regs = MMIODerefWrapper; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Representation of the GPIO HW. +pub struct GPIO { + inner: IRQSafeNullLock, +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +impl GPIO { + /// Create an instance. + /// + /// # Safety + /// + /// - The user must ensure to provide the correct `base_addr`. + pub const unsafe fn new(base_addr: usize) -> Self { + Self { + inner: IRQSafeNullLock::new(Regs::new(base_addr)), + } + } + + /// Map PL011 UART as standard output. + /// + /// TX to pin 14 + /// RX to pin 15 + pub fn map_pl011_uart(&self) { + let mut r = &self.inner; + r.lock(|inner| { + // Map to pins. + inner + .GPFSEL1 + .modify(GPFSEL1::FSEL14::AltFunc0 + GPFSEL1::FSEL15::AltFunc0); + + // Enable pins 14 and 15. + inner.GPPUD.set(0); + cpu::spin_for_cycles(150); + + inner + .GPPUDCLK0 + .write(GPPUDCLK0::PUDCLK14::AssertClock + GPPUDCLK0::PUDCLK15::AssertClock); + cpu::spin_for_cycles(150); + + inner.GPPUDCLK0.set(0); + }) + } +} + +//------------------------------------------------------------------------------ +// OS Interface Code +//------------------------------------------------------------------------------ +use synchronization::interface::Mutex; + +impl driver::interface::DeviceDriver for GPIO { + fn compatible(&self) -> &str { + "BCM GPIO" + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller.rs new file mode 100644 index 00000000..9b2f00a3 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller.rs @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! Interrupt Controller Driver. + +mod peripheral_ic; + +use crate::{driver, exception}; + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +/// Wrapper struct for a bitmask indicating pending IRQ numbers. +struct PendingIRQs { + bitmask: u64, +} + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +pub type LocalIRQ = + exception::asynchronous::IRQNumber<{ InterruptController::MAX_LOCAL_IRQ_NUMBER }>; +pub type PeripheralIRQ = + exception::asynchronous::IRQNumber<{ InterruptController::MAX_PERIPHERAL_IRQ_NUMBER }>; + +/// Used for the associated type of trait [`exception::asynchronous::interface::IRQManager`]. +#[derive(Copy, Clone)] +pub enum IRQNumber { + Local(LocalIRQ), + Peripheral(PeripheralIRQ), +} + +/// Representation of the Interrupt Controller. +pub struct InterruptController { + periph: peripheral_ic::PeripheralIC, +} + +//-------------------------------------------------------------------------------------------------- +// Private Code +//-------------------------------------------------------------------------------------------------- + +impl PendingIRQs { + pub fn new(bitmask: u64) -> Self { + Self { bitmask } + } +} + +impl Iterator for PendingIRQs { + type Item = usize; + + fn next(&mut self) -> Option { + use core::intrinsics::cttz; + + let next = cttz(self.bitmask); + if next == 64 { + return None; + } + + self.bitmask &= !(1 << next); + + Some(next as usize) + } +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +impl InterruptController { + const MAX_LOCAL_IRQ_NUMBER: usize = 11; + const MAX_PERIPHERAL_IRQ_NUMBER: usize = 63; + const NUM_PERIPHERAL_IRQS: usize = Self::MAX_PERIPHERAL_IRQ_NUMBER + 1; + + /// Create an instance. + /// + /// # Safety + /// + /// - The user must ensure to provide the correct `base_addr`. + pub const unsafe fn new(_local_base_addr: usize, periph_base_addr: usize) -> Self { + Self { + periph: peripheral_ic::PeripheralIC::new(periph_base_addr), + } + } +} + +//------------------------------------------------------------------------------ +// OS Interface Code +//------------------------------------------------------------------------------ + +impl driver::interface::DeviceDriver for InterruptController { + fn compatible(&self) -> &str { + "BCM Interrupt Controller" + } +} + +impl exception::asynchronous::interface::IRQManager for InterruptController { + type IRQNumberType = IRQNumber; + + fn register_handler( + &self, + irq: Self::IRQNumberType, + descriptor: exception::asynchronous::IRQDescriptor, + ) -> Result<(), &'static str> { + match irq { + IRQNumber::Local(_) => unimplemented!("Local IRQ controller not implemented."), + IRQNumber::Peripheral(pirq) => self.periph.register_handler(pirq, descriptor), + } + } + + fn enable(&self, irq: Self::IRQNumberType) { + match irq { + IRQNumber::Local(_) => unimplemented!("Local IRQ controller not implemented."), + IRQNumber::Peripheral(pirq) => self.periph.enable(pirq), + } + } + + fn handle_pending_irqs<'irq_context>( + &'irq_context self, + ic: &exception::asynchronous::IRQContext<'irq_context>, + ) { + // It can only be a peripheral IRQ pending because enable() does not support local IRQs yet. + self.periph.handle_pending_irqs(ic) + } + + fn print_handler(&self) { + self.periph.print_handler(); + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller/peripheral_ic.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller/peripheral_ic.rs new file mode 100644 index 00000000..bd640216 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_interrupt_controller/peripheral_ic.rs @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! Peripheral Interrupt regsler Driver. + +use super::{InterruptController, PendingIRQs, PeripheralIRQ}; +use crate::{ + bsp::device_driver::common::MMIODerefWrapper, + exception, synchronization, + synchronization::{IRQSafeNullLock, InitStateLock}, +}; +use register::{mmio::*, register_structs}; + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +register_structs! { + #[allow(non_snake_case)] + WORegisterBlock { + (0x00 => _reserved1), + (0x10 => ENABLE_1: WriteOnly), + (0x14 => ENABLE_2: WriteOnly), + (0x24 => @END), + } +} + +register_structs! { + #[allow(non_snake_case)] + RORegisterBlock { + (0x00 => _reserved1), + (0x04 => PENDING_1: ReadOnly), + (0x08 => PENDING_2: ReadOnly), + (0x0c => @END), + } +} + +/// Abstraction for the WriteOnly parts of the associated MMIO registers. +type WriteOnlyRegs = MMIODerefWrapper; + +/// Abstraction for the ReadOnly parts of the associated MMIO registers. +type ReadOnlyRegs = MMIODerefWrapper; + +type HandlerTable = + [Option; InterruptController::NUM_PERIPHERAL_IRQS]; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Representation of the peripheral interrupt regsler. +pub struct PeripheralIC { + /// Access to write registers is guarded with a lock. + wo_regs: IRQSafeNullLock, + + /// Register read access is unguarded. + ro_regs: ReadOnlyRegs, + + /// Stores registered IRQ handlers. Writable only during kernel init. RO afterwards. + handler_table: InitStateLock, +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +impl PeripheralIC { + /// Create an instance. + /// + /// # Safety + /// + /// - The user must ensure to provide the correct `base_addr`. + pub const unsafe fn new(base_addr: usize) -> Self { + Self { + wo_regs: IRQSafeNullLock::new(WriteOnlyRegs::new(base_addr)), + ro_regs: ReadOnlyRegs::new(base_addr), + handler_table: InitStateLock::new([None; InterruptController::NUM_PERIPHERAL_IRQS]), + } + } + + /// Query the list of pending IRQs. + fn get_pending(&self) -> PendingIRQs { + let pending_mask: u64 = (u64::from(self.ro_regs.PENDING_2.get()) << 32) + | u64::from(self.ro_regs.PENDING_1.get()); + + PendingIRQs::new(pending_mask) + } +} + +//------------------------------------------------------------------------------ +// OS Interface Code +//------------------------------------------------------------------------------ +use synchronization::interface::{Mutex, ReadWriteEx}; + +impl exception::asynchronous::interface::IRQManager for PeripheralIC { + type IRQNumberType = PeripheralIRQ; + + fn register_handler( + &self, + irq: Self::IRQNumberType, + descriptor: exception::asynchronous::IRQDescriptor, + ) -> Result<(), &'static str> { + let mut r = &self.handler_table; + r.write(|table| { + let irq_number = irq.get(); + + if table[irq_number].is_some() { + return Err("IRQ handler already registered"); + } + + table[irq_number] = Some(descriptor); + + Ok(()) + }) + } + + fn enable(&self, irq: Self::IRQNumberType) { + let mut r = &self.wo_regs; + r.lock(|regs| { + let enable_reg = if irq.get() <= 31 { + ®s.ENABLE_1 + } else { + ®s.ENABLE_2 + }; + + let enable_bit: u32 = 1 << (irq.get() % 32); + + // Writing a 1 to a bit will set the corresponding IRQ enable bit. All other IRQ enable + // bits are unaffected. So we don't need read and OR'ing here. + enable_reg.set(enable_bit); + }); + } + + fn handle_pending_irqs<'irq_context>( + &'irq_context self, + _ic: &exception::asynchronous::IRQContext<'irq_context>, + ) { + let mut r = &self.handler_table; + r.read(|table| { + for irq_number in self.get_pending() { + match table[irq_number] { + None => panic!("No handler registered for IRQ {}", irq_number), + Some(descriptor) => { + // Call the IRQ handler. Panics on failure. + descriptor.handler.handle().expect("Error handling IRQ"); + } + } + } + }) + } + + fn print_handler(&self) { + use crate::info; + + info!(" Peripheral handler:"); + + let mut r = &self.handler_table; + r.read(|table| { + for (i, opt) in table.iter().enumerate() { + if let Some(handler) = opt { + info!(" {: >3}. {}", i, handler.name); + } + } + }); + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_pl011_uart.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_pl011_uart.rs new file mode 100644 index 00000000..84f45e48 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/bcm/bcm2xxx_pl011_uart.rs @@ -0,0 +1,495 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! PL011 UART driver. +//! +//! # FIFO fill level IRQ hack +//! +//! For learning purposes, we want the UART to raise an IRQ on _every_ received character. +//! Unfortunately, this rather common mode of operation is not supported by the PL011 when operating +//! in FIFO mode. It is only possible to set a fill level fraction on which the IRQ is triggered. +//! The lowest fill level is 1/8. +//! +//! On the RPi3, the RX FIFO is 16 chars deep, so the IRQ would trigger after 2 chars have been +//! received. On the RPi4, the FIFO seems to be 32 chars deep, because experiments showed that the +//! RX IRQ triggers after receiving 4 chars. +//! +//! Fortunately, the PL011 has a test mode which allows to push characters into the FIFOs. We make +//! use of this testing facilities to employ a little hack that pushes (fill-level - 1) chars into +//! the RX FIFO by default. This way, we get an IRQ for the first received char that arrives from +//! external. +//! +//! To make things even more complicated, QEMU is not honoring the fill-level dependent IRQ +//! generation. Instead, QEMU creates an IRQ on every received char. +//! +//! We use conditional compilation to differentiate between the three modes of operation (RPi3, +//! RPI4, QEMU) respectively. + +use crate::{ + bsp, console, cpu, driver, exception, synchronization, synchronization::IRQSafeNullLock, +}; +use core::{fmt, ops}; +use register::{mmio::*, register_bitfields, register_structs}; + +//-------------------------------------------------------------------------------------------------- +// Private Definitions +//-------------------------------------------------------------------------------------------------- + +// PL011 UART registers. +// +// Descriptions taken from +// https://github.com/raspberrypi/documentation/files/1888662/BCM2837-ARM-Peripherals.-.Revised.-.V2-1.pdf +register_bitfields! { + u32, + + /// Flag Register + FR [ + /// Transmit FIFO empty. The meaning of this bit depends on the state of the FEN bit in the + /// Line Control Register, UARTLCR_ LCRH. + /// + /// If the FIFO is disabled, this bit is set when the transmit holding register is empty. If + /// the FIFO is enabled, the TXFE bit is set when the transmit FIFO is empty. This bit does + /// not indicate if there is data in the transmit shift register. + TXFE OFFSET(7) NUMBITS(1) [], + + /// Transmit FIFO full. The meaning of this bit depends on the state of the FEN bit in the + /// UARTLCR_ LCRH Register. + /// + /// If the FIFO is disabled, this bit is set when the transmit holding register is full. If + /// the FIFO is enabled, the TXFF bit is set when the transmit FIFO is full. + TXFF OFFSET(5) NUMBITS(1) [], + + /// Receive FIFO empty. The meaning of this bit depends on the state of the FEN bit in the + /// UARTLCR_H Register. + /// + /// If the FIFO is disabled, this bit is set when the receive holding register is empty. If + /// the FIFO is enabled, the RXFE bit is set when the receive FIFO is empty. + RXFE OFFSET(4) NUMBITS(1) [] + ], + + /// Integer Baud rate divisor + IBRD [ + /// Integer Baud rate divisor + IBRD OFFSET(0) NUMBITS(16) [] + ], + + /// Fractional Baud rate divisor + FBRD [ + /// Fractional Baud rate divisor + FBRD OFFSET(0) NUMBITS(6) [] + ], + + /// Line Control register + LCRH [ + /// Word length. These bits indicate the number of data bits transmitted or received in a + /// frame. + WLEN OFFSET(5) NUMBITS(2) [ + FiveBit = 0b00, + SixBit = 0b01, + SevenBit = 0b10, + EightBit = 0b11 + ], + + /// Enable FIFOs: + /// + /// 0 = FIFOs are disabled (character mode) that is, the FIFOs become 1-byte-deep holding + /// registers + /// + /// 1 = transmit and receive FIFO buffers are enabled (FIFO mode). + FEN OFFSET(4) NUMBITS(1) [ + FifosDisabled = 0, + FifosEnabled = 1 + ] + ], + + /// Control Register + CR [ + /// Receive enable. If this bit is set to 1, the receive section of the UART is enabled. + /// Data reception occurs for UART signals. When the UART is disabled in the middle of + /// reception, it completes the current character before stopping. + RXE OFFSET(9) NUMBITS(1) [ + Disabled = 0, + Enabled = 1 + ], + + /// Transmit enable. If this bit is set to 1, the transmit section of the UART is enabled. + /// Data transmission occurs for UART signals. When the UART is disabled in the middle of + /// transmission, it completes the current character before stopping. + TXE OFFSET(8) NUMBITS(1) [ + Disabled = 0, + Enabled = 1 + ], + + /// UART enable + UARTEN OFFSET(0) NUMBITS(1) [ + /// If the UART is disabled in the middle of transmission or reception, it completes the + /// current character before stopping. + Disabled = 0, + Enabled = 1 + ] + ], + + /// Interrupt FIFO Level Select Register + IFLS [ + /// Receive interrupt FIFO level select. The trigger points for the receive interrupt are as + /// follows. + RXIFLSEL OFFSET(3) NUMBITS(5) [ + OneEigth = 0b000, + OneQuarter = 0b001, + OneHalf = 0b010, + ThreeQuarters = 0b011, + SevenEights = 0b100 + ] + ], + + /// Interrupt Mask Set Clear Register + IMSC [ + /// Receive interrupt mask. A read returns the current mask for the UARTRXINTR interrupt. On + /// a write of 1, the mask of the interrupt is set. A write of 0 clears the mask. + RXIM OFFSET(4) NUMBITS(1) [ + Disabled = 0, + Enabled = 1 + ] + ], + + /// Interrupt Clear Register + ICR [ + /// Meta field for all pending interrupts + ALL OFFSET(0) NUMBITS(11) [] + ], + + /// Test Control Register + ITCR [ + /// Test FIFO enable. When this bit it 1, a write to the Test Data Register, UART_DR writes + /// data into the receive FIFO, and reads from the UART_DR register reads data out of the + /// transmit FIFO. When this bit is 0, data cannot be read directly from the transmit FIFO + /// or written directly to the receive FIFO (normal operation). + ITCR1 OFFSET(1) NUMBITS(1) [ + Disabled = 0, + Enabled = 1 + ] + ] +} + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +register_structs! { + #[allow(non_snake_case)] + pub RegisterBlock { + (0x00 => DR: ReadWrite), + (0x04 => _reserved1), + (0x18 => FR: ReadOnly), + (0x1c => _reserved2), + (0x24 => IBRD: WriteOnly), + (0x28 => FBRD: WriteOnly), + (0x2c => LCRH: WriteOnly), + (0x30 => CR: WriteOnly), + (0x34 => IFLS: ReadWrite), + (0x38 => IMSC: ReadWrite), + (0x3C => _reserved3), + (0x44 => ICR: WriteOnly), + (0x48 => _reserved4), + (0x80 => ITCR: ReadWrite), + (0x84 => _reserved5), + (0x8c => TDR: ReadWrite), + (0x90 => @END), + } +} + +pub struct PL011UartInner { + base_addr: usize, + chars_written: usize, + chars_read: usize, +} + +// Export the inner struct so that BSPs can use it for the panic handler. +pub use PL011UartInner as PanicUart; + +/// Representation of the UART. +pub struct PL011Uart { + inner: IRQSafeNullLock, + irq_number: bsp::device_driver::IRQNumber, +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Deref to RegisterBlock. +/// +/// Allows writing +/// ``` +/// self.DR.read() +/// ``` +/// instead of something along the lines of +/// ``` +/// unsafe { (*PL011UartInner::ptr()).DR.read() } +/// ``` +impl ops::Deref for PL011UartInner { + type Target = RegisterBlock; + + fn deref(&self) -> &Self::Target { + unsafe { &*self.ptr() } + } +} + +impl PL011UartInner { + /// Create an instance. + /// + /// # Safety + /// + /// - The user must ensure to provide the correct `base_addr`. + pub const unsafe fn new(base_addr: usize) -> Self { + Self { + base_addr, + chars_written: 0, + chars_read: 0, + } + } + + /// Set up baud rate and characteristics. + /// + /// Results in 8N1 and 230400 baud (if the clk has been previously set to 48 MHz by the + /// firmware). + pub fn init(&mut self) { + // Turn it off temporarily. + self.CR.set(0); + + self.ICR.write(ICR::ALL::CLEAR); + self.IBRD.write(IBRD::IBRD.val(13)); + self.FBRD.write(FBRD::FBRD.val(2)); + self.LCRH + .write(LCRH::WLEN::EightBit + LCRH::FEN::FifosEnabled); // 8N1 + Fifo on + self.CR + .write(CR::UARTEN::Enabled + CR::TXE::Enabled + CR::RXE::Enabled); + + // Trigger the RX interrupt at 1/8 of the FIFO fill level (this is the lowest possible) and + // enable RX interrupts. + self.IFLS.write(IFLS::RXIFLSEL::OneEigth); + self.IMSC.write(IMSC::RXIM::Enabled); + + #[cfg(not(feature = "qemu-quirks"))] + self.fill_hack_push(); + } + + /// Return a pointer to the register block. + fn ptr(&self) -> *const RegisterBlock { + self.base_addr as *const _ + } + + /// Send a character. + fn write_char(&mut self, c: char) { + // Spin while TX FIFO full is set, waiting for an empty slot. + while self.FR.matches_all(FR::TXFF::SET) { + cpu::nop(); + } + + // Write the character to the buffer. + self.DR.set(c as u32); + + self.chars_written += 1; + } + + /// Retrieve a character. + fn read_char_converting(&mut self, blocking: bool) -> Option { + #[cfg(not(feature = "qemu-quirks"))] + self.fill_hack_pop(); + + // If blocking, spin while RX FIFO empty is set, else return None. + while self.FR.matches_all(FR::RXFE::SET) { + if !blocking { + #[cfg(not(feature = "qemu-quirks"))] + self.fill_hack_push(); + + return None; + } + + cpu::nop(); + } + + // Read one character. + let mut ret = self.DR.get() as u8 as char; + + // Convert carrige return to newline. + if ret == '\r' { + ret = '\n' + } + + // Update statistics. + self.chars_read += 1; + + #[cfg(not(feature = "qemu-quirks"))] + self.fill_hack_push(); + + Some(ret) + } + + /// Push characters into the receive FIFO. + /// + /// See top level comments why this is needed. + #[cfg(not(feature = "qemu-quirks"))] + fn fill_hack_push(&mut self) { + self.ITCR.write(ITCR::ITCR1::Enabled); + + #[cfg(feature = "bsp_rpi4")] + { + self.TDR.set(b'X' as u32); + self.TDR.set(b'Y' as u32); + } + self.TDR.set(b'Z' as u32); + + self.ITCR.write(ITCR::ITCR1::Disabled); + } + + /// Pop characters from the receive FIFO. + /// + /// See top level comments why this is needed. + #[cfg(not(feature = "qemu-quirks"))] + fn fill_hack_pop(&mut self) { + #[cfg(feature = "bsp_rpi4")] + { + self.DR.get(); + self.DR.get(); + } + self.DR.get(); + } +} + +/// Implementing `core::fmt::Write` enables usage of the `format_args!` macros, which in turn are +/// used to implement the `kernel`'s `print!` and `println!` macros. By implementing `write_str()`, +/// we get `write_fmt()` automatically. +/// +/// The function takes an `&mut self`, so it must be implemented for the inner struct. +/// +/// See [`src/print.rs`]. +/// +/// [`src/print.rs`]: ../../print/index.html +impl fmt::Write for PL011UartInner { + fn write_str(&mut self, s: &str) -> fmt::Result { + for c in s.chars() { + self.write_char(c); + } + + Ok(()) + } +} + +impl PL011Uart { + /// # Safety + /// + /// - The user must ensure to provide the correct `base_addr`. + pub const unsafe fn new(base_addr: usize, irq_number: bsp::device_driver::IRQNumber) -> Self { + Self { + inner: IRQSafeNullLock::new(PL011UartInner::new(base_addr)), + irq_number, + } + } +} + +//------------------------------------------------------------------------------ +// OS Interface Code +//------------------------------------------------------------------------------ +use synchronization::interface::Mutex; + +impl driver::interface::DeviceDriver for PL011Uart { + fn compatible(&self) -> &str { + "BCM PL011 UART" + } + + fn init(&self) -> Result<(), ()> { + let mut r = &self.inner; + r.lock(|inner| inner.init()); + + Ok(()) + } + + fn register_and_enable_irq_handler(&'static self) -> Result<(), &'static str> { + use bsp::exception::asynchronous::irq_manager; + use exception::asynchronous::{interface::IRQManager, IRQDescriptor}; + + let descriptor = IRQDescriptor { + name: "BCM PL011 UART", + handler: self, + }; + + irq_manager().register_handler(self.irq_number, descriptor)?; + irq_manager().enable(self.irq_number); + + Ok(()) + } +} + +impl console::interface::Write for PL011Uart { + /// Passthrough of `args` to the `core::fmt::Write` implementation, but guarded by a Mutex to + /// serialize access. + fn write_char(&self, c: char) { + let mut r = &self.inner; + r.lock(|inner| inner.write_char(c)); + } + + fn write_fmt(&self, args: core::fmt::Arguments) -> fmt::Result { + // Fully qualified syntax for the call to `core::fmt::Write::write:fmt()` to increase + // readability. + let mut r = &self.inner; + r.lock(|inner| fmt::Write::write_fmt(inner, args)) + } + + fn flush(&self) { + // Spin until TX FIFO empty is set. + let mut r = &self.inner; + r.lock(|inner| { + while !inner.FR.matches_all(FR::TXFE::SET) { + cpu::nop(); + } + }); + } +} + +impl console::interface::Read for PL011Uart { + fn read_char(&self) -> char { + let mut r = &self.inner; + r.lock(|inner| inner.read_char_converting(true).unwrap()) + } + + fn clear(&self) { + let mut r = &self.inner; + r.lock(|inner| { + // Read from the RX FIFO until it is indicating empty. + while !inner.FR.matches_all(FR::RXFE::SET) { + inner.DR.get(); + } + }) + } +} + +impl console::interface::Statistics for PL011Uart { + fn chars_written(&self) -> usize { + let mut r = &self.inner; + r.lock(|inner| inner.chars_written) + } + + fn chars_read(&self) -> usize { + let mut r = &self.inner; + r.lock(|inner| inner.chars_read) + } +} + +impl exception::asynchronous::interface::IRQHandler for PL011Uart { + fn handle(&self) -> Result<(), &'static str> { + let mut r = &self.inner; + r.lock(|inner| { + // Echo any received characters. + loop { + match inner.read_char_converting(false) { + None => break, + Some(c) => inner.write_char(c), + } + } + }); + + Ok(()) + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/common.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/common.rs new file mode 100644 index 00000000..8a83399a --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/device_driver/common.rs @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! Common device driver code. + +use core::{marker::PhantomData, ops}; + +pub struct MMIODerefWrapper { + base_addr: usize, + phantom: PhantomData, +} + +impl MMIODerefWrapper { + /// Create an instance. + pub const unsafe fn new(base_addr: usize) -> Self { + Self { + base_addr, + phantom: PhantomData, + } + } + + /// Return a pointer to the associated MMIO register block. + fn ptr(&self) -> *const T { + self.base_addr as *const _ + } +} + +impl ops::Deref for MMIODerefWrapper { + type Target = T; + + fn deref(&self) -> &Self::Target { + unsafe { &*self.ptr() } + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi.rs new file mode 100644 index 00000000..aa395411 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi.rs @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Top-level BSP file for the Raspberry Pi 3 and 4. + +pub mod console; +pub mod cpu; +pub mod driver; +pub mod exception; +pub mod memory; + +//-------------------------------------------------------------------------------------------------- +// Global instances +//-------------------------------------------------------------------------------------------------- +use super::device_driver; + +static GPIO: device_driver::GPIO = + unsafe { device_driver::GPIO::new(memory::map::mmio::GPIO_BASE) }; + +static PL011_UART: device_driver::PL011Uart = unsafe { + device_driver::PL011Uart::new( + memory::map::mmio::PL011_UART_BASE, + exception::asynchronous::irq_map::PL011_UART, + ) +}; + +#[cfg(feature = "bsp_rpi3")] +static INTERRUPT_CONTROLLER: device_driver::InterruptController = unsafe { + device_driver::InterruptController::new( + memory::map::mmio::LOCAL_INTERRUPT_CONTROLLER_BASE, + memory::map::mmio::PERIPHERAL_INTERRUPT_CONTROLLER_BASE, + ) +}; + +#[cfg(feature = "bsp_rpi4")] +static INTERRUPT_CONTROLLER: device_driver::GICv2 = unsafe { + device_driver::GICv2::new(memory::map::mmio::GICD_BASE, memory::map::mmio::GICC_BASE) +}; + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Board identification. +pub fn board_name() -> &'static str { + #[cfg(feature = "bsp_rpi3")] + { + "Raspberry Pi 3" + } + + #[cfg(feature = "bsp_rpi4")] + { + "Raspberry Pi 4" + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/console.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/console.rs new file mode 100644 index 00000000..90011da6 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/console.rs @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! BSP console facilities. + +use super::memory; +use crate::{bsp::device_driver, console}; +use core::fmt; + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// In case of a panic, the panic handler uses this function to take a last shot at printing +/// something before the system is halted. +/// +/// # Safety +/// +/// - Use only for printing during a panic. +pub unsafe fn panic_console_out() -> impl fmt::Write { + let mut uart = device_driver::PanicUart::new(memory::map::mmio::PL011_UART_BASE); + uart.init(); + uart +} + +/// Return a reference to the console. +pub fn console() -> &'static impl console::interface::All { + &super::PL011_UART +} + +//-------------------------------------------------------------------------------------------------- +// Testing +//-------------------------------------------------------------------------------------------------- + +/// Minimal code needed to bring up the console in QEMU (for testing only). This is often less steps +/// than on real hardware due to QEMU's abstractions. +/// +/// For the RPi, nothing needs to be done. +pub fn qemu_bring_up_console() {} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/cpu.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/cpu.rs new file mode 100644 index 00000000..c24204f0 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/cpu.rs @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! BSP Processor code. + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Used by `arch` code to find the early boot core. +pub const BOOT_CORE_ID: usize = 0; + +/// The early boot core's stack address. +pub const BOOT_CORE_STACK_START: u64 = 0x80_000; + +/// The number of processor cores. +pub const NUM_CORES: usize = 4; diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/driver.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/driver.rs new file mode 100644 index 00000000..b9e1e171 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/driver.rs @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! BSP driver support. + +use crate::driver; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Device Driver Manager type. +pub struct BSPDriverManager { + device_drivers: [&'static (dyn DeviceDriver + Sync); 3], +} + +//-------------------------------------------------------------------------------------------------- +// Global instances +//-------------------------------------------------------------------------------------------------- + +static BSP_DRIVER_MANAGER: BSPDriverManager = BSPDriverManager { + device_drivers: [ + &super::GPIO, + &super::PL011_UART, + &super::INTERRUPT_CONTROLLER, + ], +}; + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Return a reference to the driver manager. +pub fn driver_manager() -> &'static impl driver::interface::DriverManager { + &BSP_DRIVER_MANAGER +} + +//------------------------------------------------------------------------------ +// OS Interface Code +//------------------------------------------------------------------------------ +use driver::interface::DeviceDriver; + +impl driver::interface::DriverManager for BSPDriverManager { + fn all_device_drivers(&self) -> &[&'static (dyn DeviceDriver + Sync)] { + &self.device_drivers[..] + } + + fn post_device_driver_init(&self) { + // Configure PL011Uart's output pins. + super::GPIO.map_pl011_uart(); + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception.rs new file mode 100644 index 00000000..55e82119 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception.rs @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! BSP synchronous and asynchronous exception handling. + +pub mod asynchronous; diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception/asynchronous.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception/asynchronous.rs new file mode 100644 index 00000000..787d5926 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/exception/asynchronous.rs @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! BSP asynchronous exception handling. + +use crate::{bsp, exception}; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +#[cfg(feature = "bsp_rpi3")] +pub(in crate::bsp) mod irq_map { + use super::bsp::device_driver::{IRQNumber, PeripheralIRQ}; + + pub const PL011_UART: IRQNumber = IRQNumber::Peripheral(PeripheralIRQ::new(57)); +} + +#[cfg(feature = "bsp_rpi4")] +pub(in crate::bsp) mod irq_map { + use super::bsp::device_driver::IRQNumber; + + pub const PL011_UART: IRQNumber = IRQNumber::new(153); +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Return a reference to the IRQ manager. +pub fn irq_manager() -> &'static impl exception::asynchronous::interface::IRQManager< + IRQNumberType = bsp::device_driver::IRQNumber, +> { + &super::super::INTERRUPT_CONTROLLER +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/link.ld b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/link.ld new file mode 100644 index 00000000..fac86cda --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/link.ld @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: MIT OR Apache-2.0 + * + * Copyright (c) 2018-2020 Andre Richter + */ + +SECTIONS +{ + /* Set current address to the value from which the RPi starts execution */ + . = 0x80000; + + __ro_start = .; + .text : + { + *(.text._start) *(.text*) + } + + .rodata : + { + *(.rodata*) + } + . = ALIGN(65536); /* Fill up to 64 KiB */ + __ro_end = .; + + .data : + { + *(.data*) + } + + /* Section is zeroed in u64 chunks, align start and end to 8 bytes */ + .bss ALIGN(8): + { + __bss_start = .; + *(.bss*); + . = ALIGN(8); + __bss_end = .; + } + + /DISCARD/ : { *(.comment*) } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/memory.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/memory.rs new file mode 100644 index 00000000..43c54094 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/memory.rs @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! BSP Memory Management. + +pub mod mmu; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// The board's memory map. +#[rustfmt::skip] +pub(super) mod map { + pub const END_INCLUSIVE: usize = 0xFFFF_FFFF; + + pub const GPIO_OFFSET: usize = 0x0020_0000; + pub const UART_OFFSET: usize = 0x0020_1000; + + /// Physical devices. + #[cfg(feature = "bsp_rpi3")] + pub mod mmio { + use super::*; + + pub const BASE: usize = 0x3F00_0000; + pub const PERIPHERAL_INTERRUPT_CONTROLLER_BASE: usize = BASE + 0x0000_B200; + pub const GPIO_BASE: usize = BASE + GPIO_OFFSET; + pub const PL011_UART_BASE: usize = BASE + UART_OFFSET; + pub const LOCAL_INTERRUPT_CONTROLLER_BASE: usize = 0x4000_0000; + pub const END_INCLUSIVE: usize = 0x4000_FFFF; + } + + /// Physical devices. + #[cfg(feature = "bsp_rpi4")] + pub mod mmio { + use super::*; + + pub const BASE: usize = 0xFE00_0000; + pub const GPIO_BASE: usize = BASE + GPIO_OFFSET; + pub const PL011_UART_BASE: usize = BASE + UART_OFFSET; + pub const GICD_BASE: usize = 0xFF84_1000; + pub const GICC_BASE: usize = 0xFF84_2000; + pub const END_INCLUSIVE: usize = 0xFF84_FFFF; + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/memory/mmu.rs b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/memory/mmu.rs new file mode 100644 index 00000000..31c6f9a6 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/bsp/raspberrypi/memory/mmu.rs @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! BSP Memory Management Unit. + +use super::map as memory_map; +use crate::memory::mmu::*; +use core::ops::RangeInclusive; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +const NUM_MEM_RANGES: usize = 2; + +/// The virtual memory layout. +/// +/// The layout must contain only special ranges, aka anything that is _not_ normal cacheable DRAM. +/// It is agnostic of the paging granularity that the architecture's MMU will use. +pub static LAYOUT: KernelVirtualLayout<{ NUM_MEM_RANGES }> = KernelVirtualLayout::new( + memory_map::END_INCLUSIVE, + [ + RangeDescriptor { + name: "Kernel code and RO data", + virtual_range: || { + // Using the linker script, we ensure that the RO area is consecutive and 64 KiB + // aligned, and we export the boundaries via symbols: + // + // [__ro_start, __ro_end) + extern "C" { + // The inclusive start of the read-only area, aka the address of the first + // byte of the area. + static __ro_start: usize; + + // The exclusive end of the read-only area, aka the address of the first + // byte _after_ the RO area. + static __ro_end: usize; + } + + unsafe { + // Notice the subtraction to turn the exclusive end into an inclusive end. + #[allow(clippy::range_minus_one)] + RangeInclusive::new( + &__ro_start as *const _ as usize, + &__ro_end as *const _ as usize - 1, + ) + } + }, + translation: Translation::Identity, + attribute_fields: AttributeFields { + mem_attributes: MemAttributes::CacheableDRAM, + acc_perms: AccessPermissions::ReadOnly, + execute_never: false, + }, + }, + RangeDescriptor { + name: "Device MMIO", + virtual_range: || { + RangeInclusive::new(memory_map::mmio::BASE, memory_map::mmio::END_INCLUSIVE) + }, + translation: Translation::Identity, + attribute_fields: AttributeFields { + mem_attributes: MemAttributes::Device, + acc_perms: AccessPermissions::ReadWrite, + execute_never: true, + }, + }, + ], +); + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Return the address space size in bytes. +pub const fn addr_space_size() -> usize { + memory_map::END_INCLUSIVE + 1 +} + +/// Return a reference to the virtual memory layout. +pub fn virt_mem_layout() -> &'static KernelVirtualLayout<{ NUM_MEM_RANGES }> { + &LAYOUT +} + +//-------------------------------------------------------------------------------------------------- +// Testing +//-------------------------------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + use test_macros::kernel_test; + + /// Check 64 KiB alignment of the kernel's virtual memory layout sections. + #[kernel_test] + fn virt_mem_layout_sections_are_64KiB_aligned() { + const SIXTYFOUR_KIB: usize = 65536; + + for i in LAYOUT.inner().iter() { + let start: usize = *(i.virtual_range)().start(); + let end: usize = *(i.virtual_range)().end() + 1; + + assert_eq!(start % SIXTYFOUR_KIB, 0); + assert_eq!(end % SIXTYFOUR_KIB, 0); + assert!(end >= start); + } + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/console.rs b/14_exceptions_part2_peripheral_IRQs/src/console.rs new file mode 100644 index 00000000..e6323a20 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/console.rs @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! System console. + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Console interfaces. +pub mod interface { + use core::fmt; + + /// Console write functions. + pub trait Write { + /// Write a single character. + fn write_char(&self, c: char); + + /// Write a Rust format string. + fn write_fmt(&self, args: fmt::Arguments) -> fmt::Result; + + /// Block execution until the last character has been physically put on the TX wire + /// (draining TX buffers/FIFOs, if any). + fn flush(&self); + } + + /// Console read functions. + pub trait Read { + /// Read a single character. + fn read_char(&self) -> char { + ' ' + } + + /// Clear RX buffers, if any. + fn clear(&self); + } + + /// Console statistics. + pub trait Statistics { + /// Return the number of characters written. + fn chars_written(&self) -> usize { + 0 + } + + /// Return the number of characters read. + fn chars_read(&self) -> usize { + 0 + } + } + + /// Trait alias for a full-fledged console. + pub trait All = Write + Read + Statistics; +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/cpu.rs b/14_exceptions_part2_peripheral_IRQs/src/cpu.rs new file mode 100644 index 00000000..9c67c0e7 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/cpu.rs @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! Processor code. + +#[cfg(target_arch = "aarch64")] +#[path = "_arch/aarch64/cpu.rs"] +mod arch_cpu; +pub use arch_cpu::*; + +pub mod smp; diff --git a/14_exceptions_part2_peripheral_IRQs/src/cpu/smp.rs b/14_exceptions_part2_peripheral_IRQs/src/cpu/smp.rs new file mode 100644 index 00000000..b1428884 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/cpu/smp.rs @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Symmetric multiprocessing. + +#[cfg(target_arch = "aarch64")] +#[path = "../_arch/aarch64/cpu/smp.rs"] +mod arch_cpu_smp; +pub use arch_cpu_smp::*; diff --git a/14_exceptions_part2_peripheral_IRQs/src/driver.rs b/14_exceptions_part2_peripheral_IRQs/src/driver.rs new file mode 100644 index 00000000..0e24b403 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/driver.rs @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Driver support. + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Driver interfaces. +pub mod interface { + + /// Device Driver functions. + pub trait DeviceDriver { + /// Return a compatibility string for identifying the driver. + fn compatible(&self) -> &str; + + /// Called by the kernel to bring up the device. + fn init(&self) -> Result<(), ()> { + Ok(()) + } + + /// Called by the kernel to register and enable the device's IRQ handlers, if any. + /// + /// Rust's type system will prevent a call to this function unless the calling instance + /// itself has static lifetime. + fn register_and_enable_irq_handler(&'static self) -> Result<(), &'static str> { + Ok(()) + } + } + + /// Device driver management functions. + /// + /// The `BSP` is supposed to supply one global instance. + pub trait DriverManager { + /// Return a slice of references to all `BSP`-instantiated drivers. + /// + /// # Safety + /// + /// - The order of devices is the order in which `DeviceDriver::init()` is called. + fn all_device_drivers(&self) -> &[&'static (dyn DeviceDriver + Sync)]; + + /// Initialization code that runs after driver init. + /// + /// For example, device driver code that depends on other drivers already being online. + fn post_device_driver_init(&self); + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/exception.rs b/14_exceptions_part2_peripheral_IRQs/src/exception.rs new file mode 100644 index 00000000..81ea2b26 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/exception.rs @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! Synchronous and asynchronous exception handling. + +#[cfg(target_arch = "aarch64")] +#[path = "_arch/aarch64/exception.rs"] +mod arch_exception; +pub use arch_exception::*; + +pub mod asynchronous; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Kernel privilege levels. +#[allow(missing_docs)] +#[derive(PartialEq)] +pub enum PrivilegeLevel { + User, + Kernel, + Hypervisor, + Unknown, +} + +//-------------------------------------------------------------------------------------------------- +// Testing +//-------------------------------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + use test_macros::kernel_test; + + /// Libkernel unit tests must execute in kernel mode. + #[kernel_test] + fn test_runner_executes_in_kernel_mode() { + let (level, _) = current_privilege_level(); + + assert!(level == PrivilegeLevel::Kernel) + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/exception/asynchronous.rs b/14_exceptions_part2_peripheral_IRQs/src/exception/asynchronous.rs new file mode 100644 index 00000000..25a01736 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/exception/asynchronous.rs @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! Asynchronous exception handling. + +#[cfg(target_arch = "aarch64")] +#[path = "../_arch/aarch64/exception/asynchronous.rs"] +mod arch_exception_async; +pub use arch_exception_async::*; + +use core::{fmt, marker::PhantomData}; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Asynchronous exception handling interfaces. +pub mod interface { + + /// Implemented by types that handle IRQs. + pub trait IRQHandler { + /// Called when the corresponding interrupt is asserted. + fn handle(&self) -> Result<(), &'static str>; + } + + /// IRQ management functions. + /// + /// The `BSP` is supposed to supply one global instance. Typically implemented by the + /// platform's interrupt controller. + pub trait IRQManager { + /// The IRQ number type depends on the implementation. + type IRQNumberType; + + /// Register a handler. + fn register_handler( + &self, + irq_number: Self::IRQNumberType, + descriptor: super::IRQDescriptor, + ) -> Result<(), &'static str>; + + /// Enable an interrupt in the controller. + fn enable(&self, irq_number: Self::IRQNumberType); + + /// Handle pending interrupts. + /// + /// This function is called directly from the CPU's IRQ exception vector. On AArch64, + /// this means that the respective CPU core has disabled exception handling. + /// This function can therefore not be preempted and runs start to finish. + /// + /// Takes an IRQContext token to ensure it can only be called from IRQ context. + #[allow(clippy::trivially_copy_pass_by_ref)] + fn handle_pending_irqs<'irq_context>( + &'irq_context self, + ic: &super::IRQContext<'irq_context>, + ); + + /// Print list of registered handlers. + fn print_handler(&self); + } +} + +/// Interrupt descriptor. +#[derive(Copy, Clone)] +pub struct IRQDescriptor { + /// Descriptive name. + pub name: &'static str, + + /// Reference to handler trait object. + pub handler: &'static (dyn interface::IRQHandler + Sync), +} + +/// IRQContext token. +/// +/// An instance of this type indicates that the local core is currently executing in IRQ +/// context, aka executing an interrupt vector or subcalls of it. +/// +/// Concept and implementation derived from the `CriticalSection` introduced in +/// https://github.com/rust-embedded/bare-metal +#[derive(Clone, Copy)] +pub struct IRQContext<'irq_context> { + _0: PhantomData<&'irq_context ()>, +} + +/// A wrapper type for IRQ numbers with integrated range sanity check. +#[derive(Copy, Clone)] +pub struct IRQNumber(usize); + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +impl<'irq_context> IRQContext<'irq_context> { + /// Creates an IRQContext token. + /// + /// # Safety + /// + /// - This must only be called when the current core is in an interrupt context and will not + /// live beyond the end of it. That is, creation is allowed in interrupt vector functions. For + /// example, in the ARMv8-A case, in `extern "C" fn current_elx_irq()`. + /// - Note that the lifetime `'irq_context` of the returned instance is unconstrained. User code + /// must not be able to influence the lifetime picked for this type, since that might cause it + /// to be inferred to `'static`. + #[inline(always)] + pub unsafe fn new() -> Self { + IRQContext { _0: PhantomData } + } +} + +impl IRQNumber<{ MAX_INCLUSIVE }> { + /// Creates a new instance if number <= MAX_INCLUSIVE. + pub const fn new(number: usize) -> Self { + assert!(number <= MAX_INCLUSIVE); + + Self { 0: number } + } + + /// Return the wrapped number. + pub fn get(self) -> usize { + self.0 + } +} + +impl fmt::Display for IRQNumber<{ MAX_INCLUSIVE }> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +/// Executes the provided closure while IRQs are masked on the executing core. +/// +/// While the function temporarily changes the HW state of the executing core, it restores it to the +/// previous state before returning, so this is deemed safe. +#[inline(always)] +pub fn exec_with_irq_masked(f: impl FnOnce() -> T) -> T { + let ret: T; + + unsafe { + let saved = local_irq_mask_save(); + ret = f(); + local_irq_restore(saved); + } + + ret +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/lib.rs b/14_exceptions_part2_peripheral_IRQs/src/lib.rs new file mode 100644 index 00000000..004bb212 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/lib.rs @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +// Rust embedded logo for `make doc`. +#![doc(html_logo_url = "https://git.io/JeGIp")] + +//! The `kernel` library. +//! +//! Used by `main.rs` to compose the final kernel binary. +//! +//! # TL;DR - Overview of important Kernel entities +//! +//! - [`bsp::console::console()`] - Returns a reference to the kernel's [console interface]. +//! - [`bsp::driver::driver_manager()`] - Returns a reference to the kernel's [driver interface]. +//! - [`bsp::exception::asynchronous::irq_manager()`] - Returns a reference to the kernel's [IRQ +//! Handling interface]. +//! - [`memory::mmu::mmu()`] - Returns a reference to the kernel's [MMU interface]. +//! - [`state::state_manager()`] - Returns a reference to the kernel's [state management] instance. +//! - [`time::time_manager()`] - Returns a reference to the kernel's [timer interface]. +//! +//! [console interface]: ../libkernel/console/interface/index.html +//! [driver interface]: ../libkernel/driver/interface/trait.DriverManager.html +//! [IRQ Handling interface]: ../libkernel/exception/asynchronous/interface/trait.IRQManager.html +//! [MMU interface]: ../libkernel/memory/mmu/interface/trait.MMU.html +//! [state management]: ../libkernel/state/struct.StateManager.html +//! [timer interface]: ../libkernel/time/interface/trait.TimeManager.html +//! +//! # Code organization and architecture +//! +//! The code is divided into different *modules*, each representing a typical **subsystem** of the +//! `kernel`. Top-level module files of subsystems reside directly in the `src` folder. For example, +//! `src/memory.rs` contains code that is concerned with all things memory management. +//! +//! ## Visibility of processor architecture code +//! +//! Some of the `kernel`'s subsystems depend on low-level code that is specific to the target +//! processor architecture. For each supported processor architecture, there exists a subfolder in +//! `src/_arch`, for example, `src/_arch/aarch64`. +//! +//! The architecture folders mirror the subsystem modules laid out in `src`. For example, +//! architectural code that belongs to the `kernel`'s memory subsystem (`src/memory.rs`) would go +//! into `src/_arch/aarch64/memory.rs`. The latter file is directly included and re-exported in +//! `src/memory.rs`, so that the architectural code parts are transparent with respect to the code's +//! module organization. That means a public function `foo()` defined in +//! `src/_arch/aarch64/memory.rs` would be reachable as `crate::memory::foo()` only. +//! +//! The `_` in `_arch` denotes that this folder is not part of the standard module hierarchy. +//! Rather, it's contents are conditionally pulled into respective files using the `#[path = +//! "_arch/xxx/yyy.rs"]` attribute. +//! +//! ## BSP code +//! +//! `BSP` stands for Board Support Package. `BSP` code is organized under `src/bsp.rs` and contains +//! target board specific definitions and functions. These are things such as the board's memory map +//! or instances of drivers for devices that are featured on the respective board. +//! +//! Just like processor architecture code, the `BSP` code's module structure tries to mirror the +//! `kernel`'s subsystem modules, but there is no transparent re-exporting this time. That means +//! whatever is provided must be called starting from the `bsp` namespace, e.g. +//! `bsp::driver::driver_manager()`. +//! +//! ## Kernel interfaces +//! +//! Both `arch` and `bsp` contain code that is conditionally compiled depending on the actual target +//! and board for which the kernel is compiled. For example, the `interrupt controller` hardware of +//! the `Raspberry Pi 3` and the `Raspberry Pi 4` is different, but we want the rest of the `kernel` +//! code to play nicely with any of the two without much hassle. +//! +//! In order to provide a clean abstraction between `arch`, `bsp` and `generic kernel code`, +//! `interface` traits are provided *whenever possible* and *where it makes sense*. They are defined +//! in the respective subsystem module and help to enforce the idiom of *program to an interface, +//! not an implementation*. For example, there will be a common IRQ handling interface which the two +//! different interrupt controller `drivers` of both Raspberrys will implement, and only export the +//! interface to the rest of the `kernel`. +//! +//! ``` +//! +-------------------+ +//! | Interface (Trait) | +//! | | +//! +--+-------------+--+ +//! ^ ^ +//! | | +//! | | +//! +----------+--+ +--+----------+ +//! | kernel code | | bsp code | +//! | | | arch code | +//! +-------------+ +-------------+ +//! ``` +//! +//! # Summary +//! +//! For a logical `kernel` subsystem, corresponding code can be distributed over several physical +//! locations. Here is an example for the **memory** subsystem: +//! +//! - `src/memory.rs` and `src/memory/**/*` +//! - Common code that is agnostic of target processor architecture and `BSP` characteristics. +//! - Example: A function to zero a chunk of memory. +//! - Interfaces for the memory subsystem that are implemented by `arch` or `BSP` code. +//! - Example: An `MMU` interface that defines `MMU` function prototypes. +//! - `src/bsp/__board_name__/memory.rs` and `src/bsp/__board_name__/memory/**/*` +//! - `BSP` specific code. +//! - Example: The board's memory map (physical addresses of DRAM and MMIO devices). +//! - `src/_arch/__arch_name__/memory.rs` and `src/_arch/__arch_name__/memory/**/*` +//! - Processor architecture specific code. +//! - Example: Implementation of the `MMU` interface for the `__arch_name__` processor +//! architecture. +//! +//! From a namespace perspective, **memory** subsystem code lives in: +//! +//! - `crate::memory::*` +//! - `crate::bsp::memory::*` + +#![allow(incomplete_features)] +#![feature(asm)] +#![feature(const_fn)] +#![feature(const_generics)] +#![feature(const_if_match)] +#![feature(const_panic)] +#![feature(core_intrinsics)] +#![feature(custom_inner_attributes)] +#![feature(format_args_nl)] +#![feature(global_asm)] +#![feature(linkage)] +#![feature(naked_functions)] +#![feature(panic_info_message)] +#![feature(slice_ptr_range)] +#![feature(trait_alias)] +#![no_std] +// Testing +#![cfg_attr(test, no_main)] +#![feature(custom_test_frameworks)] +#![reexport_test_harness_main = "test_main"] +#![test_runner(crate::test_runner)] + +// `mod cpu` provides the `_start()` function, the first function to run. `_start()` then calls +// `runtime_init()`, which jumps to `kernel_init()` (defined in `main.rs`). + +mod panic_wait; +mod runtime_init; +mod synchronization; + +pub mod bsp; +pub mod console; +pub mod cpu; +pub mod driver; +pub mod exception; +pub mod memory; +pub mod print; +pub mod state; +pub mod time; + +//-------------------------------------------------------------------------------------------------- +// Testing +//-------------------------------------------------------------------------------------------------- + +/// The default runner for unit tests. +pub fn test_runner(tests: &[&test_types::UnitTest]) { + println!("Running {} tests", tests.len()); + println!("-------------------------------------------------------------------\n"); + for (i, test) in tests.iter().enumerate() { + print!("{:>3}. {:.<58}", i + 1, test.name); + + // Run the actual test. + (test.test_func)(); + + // Failed tests call panic!(). Execution reaches here only if the test has passed. + println!("[ok]") + } +} + +/// The `kernel_init()` for unit tests. Called from `runtime_init()`. +#[cfg(test)] +#[no_mangle] +unsafe fn kernel_init() -> ! { + bsp::console::qemu_bring_up_console(); + + test_main(); + + cpu::qemu_exit_success() +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/main.rs b/14_exceptions_part2_peripheral_IRQs/src/main.rs new file mode 100644 index 00000000..df81e718 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/main.rs @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +// Rust embedded logo for `make doc`. +#![doc(html_logo_url = "https://git.io/JeGIp")] + +//! The `kernel` binary. + +#![feature(format_args_nl)] +#![no_main] +#![no_std] + +use libkernel::{bsp, cpu, driver, exception, info, memory, state, time, warn}; + +/// Early init code. +/// +/// # Safety +/// +/// - Only a single core must be active and running this function. +/// - The init calls in this function must appear in the correct order: +/// - Virtual memory must be activated before the device drivers. +/// - Without it, any atomic operations, e.g. the yet-to-be-introduced spinlocks in the device +/// drivers (which currently employ IRQSafeNullLocks instead of spinlocks), will fail to +/// work on the RPi SoCs. +#[no_mangle] +unsafe fn kernel_init() -> ! { + use driver::interface::DriverManager; + use memory::mmu::interface::MMU; + + exception::handling_init(); + + if let Err(string) = memory::mmu::mmu().init() { + panic!("MMU: {}", string); + } + + for i in bsp::driver::driver_manager().all_device_drivers().iter() { + if i.init().is_err() { + panic!("Error loading driver: {}", i.compatible()) + } + } + bsp::driver::driver_manager().post_device_driver_init(); + // println! is usable from here on. + + // Let device drivers register and enable their handlers with the interrupt controller. + for i in bsp::driver::driver_manager().all_device_drivers() { + if let Err(msg) = i.register_and_enable_irq_handler() { + warn!("Error registering IRQ handler: {}", msg); + } + } + + // Unmask interrupts on the boot CPU core. + exception::asynchronous::local_irq_unmask(); + + // Announce conclusion of the kernel_init() phase. + state::state_manager().transition_to_single_core_main(); + + // Transition from unsafe to safe. + kernel_main() +} + +/// The main function running after the early init. +fn kernel_main() -> ! { + use driver::interface::DriverManager; + use exception::asynchronous::interface::IRQManager; + + info!("Booting on: {}", bsp::board_name()); + + info!("MMU online. Special regions:"); + bsp::memory::mmu::virt_mem_layout().print_layout(); + + let (_, privilege_level) = exception::current_privilege_level(); + info!("Current privilege level: {}", privilege_level); + + info!("Exception handling state:"); + exception::asynchronous::print_state(); + + info!( + "Architectural timer resolution: {} ns", + time::time_manager().resolution().as_nanos() + ); + + info!("Drivers loaded:"); + for (i, driver) in bsp::driver::driver_manager() + .all_device_drivers() + .iter() + .enumerate() + { + info!(" {}. {}", i + 1, driver.compatible()); + } + + info!("Registered IRQ handlers:"); + bsp::exception::asynchronous::irq_manager().print_handler(); + + info!("Echoing input now"); + cpu::wait_forever(); +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/memory.rs b/14_exceptions_part2_peripheral_IRQs/src/memory.rs new file mode 100644 index 00000000..4a68a6d9 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/memory.rs @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Memory Management. + +pub mod mmu; + +use core::ops::Range; + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Zero out a memory region. +/// +/// # Safety +/// +/// - `range.start` and `range.end` must be valid. +/// - `range.start` and `range.end` must be `T` aligned. +pub unsafe fn zero_volatile(range: Range<*mut T>) +where + T: From, +{ + let mut ptr = range.start; + + while ptr < range.end { + core::ptr::write_volatile(ptr, T::from(0)); + ptr = ptr.offset(1); + } +} + +//-------------------------------------------------------------------------------------------------- +// Testing +//-------------------------------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + use test_macros::kernel_test; + + /// Check `zero_volatile()`. + #[kernel_test] + fn zero_volatile_works() { + let mut x: [usize; 3] = [10, 11, 12]; + let x_range = x.as_mut_ptr_range(); + + unsafe { zero_volatile(x_range) }; + + assert_eq!(x, [0, 0, 0]); + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/memory/mmu.rs b/14_exceptions_part2_peripheral_IRQs/src/memory/mmu.rs new file mode 100644 index 00000000..8d789704 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/memory/mmu.rs @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! Memory Management Unit. +//! +//! In order to decouple `BSP` and `arch` parts of the MMU code (to keep them pluggable), this file +//! provides types for composing an architecture-agnostic description of the kernel 's virtual +//! memory layout. +//! +//! The `BSP` provides such a description through the `bsp::memory::mmu::virt_mem_layout()` +//! function. +//! +//! The `MMU` driver of the `arch` code uses `bsp::memory::mmu::virt_mem_layout()` to compile and +//! install respective page tables. + +#[cfg(target_arch = "aarch64")] +#[path = "../_arch/aarch64/memory/mmu.rs"] +mod arch_mmu; +pub use arch_mmu::*; + +use core::{fmt, ops::RangeInclusive}; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Memory Management interfaces. +pub mod interface { + + /// MMU functions. + pub trait MMU { + /// Called by the kernel during early init. Supposed to take the page tables from the + /// `BSP`-supplied `virt_mem_layout()` and install/activate them for the respective MMU. + /// + /// # Safety + /// + /// - Changes the HW's global state. + unsafe fn init(&self) -> Result<(), &'static str>; + } +} + +/// Architecture agnostic translation types. +#[allow(missing_docs)] +#[derive(Copy, Clone)] +pub enum Translation { + Identity, + Offset(usize), +} + +/// Architecture agnostic memory attributes. +#[allow(missing_docs)] +#[derive(Copy, Clone)] +pub enum MemAttributes { + CacheableDRAM, + Device, +} + +/// Architecture agnostic access permissions. +#[allow(missing_docs)] +#[derive(Copy, Clone)] +pub enum AccessPermissions { + ReadOnly, + ReadWrite, +} + +/// Collection of memory attributes. +#[allow(missing_docs)] +#[derive(Copy, Clone)] +pub struct AttributeFields { + pub mem_attributes: MemAttributes, + pub acc_perms: AccessPermissions, + pub execute_never: bool, +} + +/// Architecture agnostic descriptor for a memory range. +#[allow(missing_docs)] +pub struct RangeDescriptor { + pub name: &'static str, + pub virtual_range: fn() -> RangeInclusive, + pub translation: Translation, + pub attribute_fields: AttributeFields, +} + +/// Type for expressing the kernel's virtual memory layout. +pub struct KernelVirtualLayout { + /// The last (inclusive) address of the address space. + max_virt_addr_inclusive: usize, + + /// Array of descriptors for non-standard (normal cacheable DRAM) memory regions. + inner: [RangeDescriptor; NUM_SPECIAL_RANGES], +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +impl Default for AttributeFields { + fn default() -> AttributeFields { + AttributeFields { + mem_attributes: MemAttributes::CacheableDRAM, + acc_perms: AccessPermissions::ReadWrite, + execute_never: true, + } + } +} + +/// Human-readable output of a RangeDescriptor. +impl fmt::Display for RangeDescriptor { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // Call the function to which self.range points, and dereference the result, which causes + // Rust to copy the value. + let start = *(self.virtual_range)().start(); + let end = *(self.virtual_range)().end(); + let size = end - start + 1; + + // log2(1024). + const KIB_RSHIFT: u32 = 10; + + // log2(1024 * 1024). + const MIB_RSHIFT: u32 = 20; + + let (size, unit) = if (size >> MIB_RSHIFT) > 0 { + (size >> MIB_RSHIFT, "MiB") + } else if (size >> KIB_RSHIFT) > 0 { + (size >> KIB_RSHIFT, "KiB") + } else { + (size, "Byte") + }; + + let attr = match self.attribute_fields.mem_attributes { + MemAttributes::CacheableDRAM => "C", + MemAttributes::Device => "Dev", + }; + + let acc_p = match self.attribute_fields.acc_perms { + AccessPermissions::ReadOnly => "RO", + AccessPermissions::ReadWrite => "RW", + }; + + let xn = if self.attribute_fields.execute_never { + "PXN" + } else { + "PX" + }; + + write!( + f, + " {:#010x} - {:#010x} | {: >3} {} | {: <3} {} {: <3} | {}", + start, end, size, unit, attr, acc_p, xn, self.name + ) + } +} + +impl KernelVirtualLayout<{ NUM_SPECIAL_RANGES }> { + /// Create a new instance. + pub const fn new(max: usize, layout: [RangeDescriptor; NUM_SPECIAL_RANGES]) -> Self { + Self { + max_virt_addr_inclusive: max, + inner: layout, + } + } + + /// For a virtual address, find and return the output address and corresponding attributes. + /// + /// If the address is not found in `inner`, return an identity mapped default with normal + /// cacheable DRAM attributes. + pub fn get_virt_addr_properties( + &self, + virt_addr: usize, + ) -> Result<(usize, AttributeFields), &'static str> { + if virt_addr > self.max_virt_addr_inclusive { + return Err("Address out of range"); + } + + for i in self.inner.iter() { + if (i.virtual_range)().contains(&virt_addr) { + let output_addr = match i.translation { + Translation::Identity => virt_addr, + Translation::Offset(a) => a + (virt_addr - (i.virtual_range)().start()), + }; + + return Ok((output_addr, i.attribute_fields)); + } + } + + Ok((virt_addr, AttributeFields::default())) + } + + /// Print the memory layout. + pub fn print_layout(&self) { + use crate::info; + + for i in self.inner.iter() { + info!("{}", i); + } + } + + #[cfg(test)] + pub fn inner(&self) -> &[RangeDescriptor; NUM_SPECIAL_RANGES] { + &self.inner + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/panic_wait.rs b/14_exceptions_part2_peripheral_IRQs/src/panic_wait.rs new file mode 100644 index 00000000..218c0a88 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/panic_wait.rs @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! A panic handler that infinitely waits. + +use crate::{bsp, cpu}; +use core::{fmt, panic::PanicInfo}; + +//-------------------------------------------------------------------------------------------------- +// Private Code +//-------------------------------------------------------------------------------------------------- + +fn _panic_print(args: fmt::Arguments) { + use fmt::Write; + + unsafe { bsp::console::panic_console_out().write_fmt(args).unwrap() }; +} + +/// The point of exit for the "standard" (non-testing) `libkernel`. +/// +/// This code will be used by the release kernel binary and the `integration tests`. It is linked +/// weakly, so that the integration tests can overload it to exit `QEMU` instead of spinning +/// forever. +/// +/// This is one possible approach to solve the problem that `cargo` can not know who the consumer of +/// the library will be: +/// - The release kernel binary that should safely park the paniced core, +/// - or an `integration test` that is executed in QEMU, which should just exit QEMU. +#[cfg(not(test))] +#[linkage = "weak"] +#[no_mangle] +fn _panic_exit() -> ! { + cpu::wait_forever() +} + +/// Prints with a newline - only use from the panic handler. +/// +/// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html +#[macro_export] +macro_rules! panic_println { + ($($arg:tt)*) => ({ + _panic_print(format_args_nl!($($arg)*)); + }) +} + +#[panic_handler] +fn panic(info: &PanicInfo) -> ! { + if let Some(args) = info.message() { + panic_println!("\nKernel panic: {}", args); + } else { + panic_println!("\nKernel panic!"); + } + + _panic_exit() +} + +//-------------------------------------------------------------------------------------------------- +// Testing +//-------------------------------------------------------------------------------------------------- + +/// The point of exit when the library is compiled for testing. +#[cfg(test)] +#[no_mangle] +fn _panic_exit() -> ! { + cpu::qemu_exit_failure() +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/print.rs b/14_exceptions_part2_peripheral_IRQs/src/print.rs new file mode 100644 index 00000000..cc303bfc --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/print.rs @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Printing facilities. + +use crate::{bsp, console}; +use core::fmt; + +//-------------------------------------------------------------------------------------------------- +// Private Code +//-------------------------------------------------------------------------------------------------- + +#[doc(hidden)] +pub fn _print(args: fmt::Arguments) { + use console::interface::Write; + + bsp::console::console().write_fmt(args).unwrap(); +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Prints without a newline. +/// +/// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html +#[macro_export] +macro_rules! print { + ($($arg:tt)*) => ($crate::print::_print(format_args!($($arg)*))); +} + +/// Prints with a newline. +/// +/// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html +#[macro_export] +macro_rules! println { + () => ($crate::print!("\n")); + ($($arg:tt)*) => ({ + $crate::print::_print(format_args_nl!($($arg)*)); + }) +} + +/// Prints an info, with a newline. +#[macro_export] +macro_rules! info { + ($string:expr) => ({ + #[allow(unused_imports)] + use crate::time::interface::TimeManager; + + let timestamp = $crate::time::time_manager().uptime(); + let timestamp_subsec_us = timestamp.subsec_micros(); + + $crate::print::_print(format_args_nl!( + concat!("[ {:>3}.{:03}{:03}] ", $string), + timestamp.as_secs(), + timestamp_subsec_us / 1_000, + timestamp_subsec_us % 1_000 + )); + }); + ($format_string:expr, $($arg:tt)*) => ({ + #[allow(unused_imports)] + use crate::time::interface::TimeManager; + + let timestamp = $crate::time::time_manager().uptime(); + let timestamp_subsec_us = timestamp.subsec_micros(); + + $crate::print::_print(format_args_nl!( + concat!("[ {:>3}.{:03}{:03}] ", $format_string), + timestamp.as_secs(), + timestamp_subsec_us / 1_000, + timestamp_subsec_us % 1_000, + $($arg)* + )); + }) +} + +/// Prints a warning, with a newline. +#[macro_export] +macro_rules! warn { + ($string:expr) => ({ + #[allow(unused_imports)] + use crate::time::interface::TimeManager; + + let timestamp = $crate::time::time_manager().uptime(); + let timestamp_subsec_us = timestamp.subsec_micros(); + + $crate::print::_print(format_args_nl!( + concat!("[W {:>3}.{:03}{:03}] ", $string), + timestamp.as_secs(), + timestamp_subsec_us / 1_000, + timestamp_subsec_us % 1_000 + )); + }); + ($format_string:expr, $($arg:tt)*) => ({ + #[allow(unused_imports)] + use crate::time::interface::TimeManager; + + let timestamp = $crate::time::time_manager().uptime(); + let timestamp_subsec_us = timestamp.subsec_micros(); + + $crate::print::_print(format_args_nl!( + concat!("[W {:>3}.{:03}{:03}] ", $format_string), + timestamp.as_secs(), + timestamp_subsec_us / 1_000, + timestamp_subsec_us % 1_000, + $($arg)* + )); + }) +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/runtime_init.rs b/14_exceptions_part2_peripheral_IRQs/src/runtime_init.rs new file mode 100644 index 00000000..04cca287 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/runtime_init.rs @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2020 Andre Richter + +//! Rust runtime initialization code. + +use crate::memory; +use core::ops::Range; + +//-------------------------------------------------------------------------------------------------- +// Private Code +//-------------------------------------------------------------------------------------------------- + +/// Return the range spanning the .bss section. +/// +/// # Safety +/// +/// - The symbol-provided addresses must be valid. +/// - The symbol-provided addresses must be usize aligned. +unsafe fn bss_range() -> Range<*mut usize> { + extern "C" { + // Boundaries of the .bss section, provided by linker script symbols. + static mut __bss_start: usize; + static mut __bss_end: usize; + } + + Range { + start: &mut __bss_start, + end: &mut __bss_end, + } +} + +/// Zero out the .bss section. +/// +/// # Safety +/// +/// - Must only be called pre `kernel_init()`. +#[inline(always)] +unsafe fn zero_bss() { + memory::zero_volatile(bss_range()); +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Equivalent to `crt0` or `c0` code in C/C++ world. Clears the `bss` section, then jumps to kernel +/// init code. +/// +/// # Safety +/// +/// - Only a single core must be active and running this function. +pub unsafe fn runtime_init() -> ! { + extern "Rust" { + fn kernel_init() -> !; + } + + zero_bss(); + kernel_init() +} + +//-------------------------------------------------------------------------------------------------- +// Testing +//-------------------------------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + use test_macros::kernel_test; + + /// Check `bss` section layout. + #[kernel_test] + fn bss_section_is_sane() { + use core::mem; + + let start = unsafe { bss_range().start } as *const _ as usize; + let end = unsafe { bss_range().end } as *const _ as usize; + + assert_eq!(start % mem::size_of::(), 0); + assert_eq!(end % mem::size_of::(), 0); + assert!(end >= start); + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/state.rs b/14_exceptions_part2_peripheral_IRQs/src/state.rs new file mode 100644 index 00000000..5edb9fc5 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/state.rs @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! State information about the kernel itself. + +use core::sync::atomic::{AtomicU8, Ordering}; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Different stages in the kernel execution. +#[derive(Copy, Clone, Eq, PartialEq)] +pub enum State { + /// The kernel starts booting in this state. + Init, + + /// The kernel transitions to this state when jumping to `kernel_main()` (at the end of + /// `kernel_init()`, after all init calls are done). + SingleCoreMain, + + /// The kernel transitions to this state when it boots the secondary cores, aka switches + /// exectution mode to symmetric multiprocessing (SMP). + MultiCoreMain, +} + +/// Maintains the kernel state and state transitions. +pub struct StateManager(AtomicU8); + +//-------------------------------------------------------------------------------------------------- +// Global instances +//-------------------------------------------------------------------------------------------------- + +static STATE_MANAGER: StateManager = StateManager::new(); + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// Return a reference to the global StateManager. +pub fn state_manager() -> &'static StateManager { + &STATE_MANAGER +} + +impl StateManager { + const INIT: u8 = 0; + const SINGLE_CORE_MAIN: u8 = 1; + const MULTI_CORE_MAIN: u8 = 2; + + /// Create a new instance. + pub const fn new() -> Self { + Self(AtomicU8::new(Self::INIT)) + } + + /// Return the current state. + pub fn state(&self) -> State { + let state = self.0.load(Ordering::Acquire); + + match state { + Self::INIT => State::Init, + Self::SINGLE_CORE_MAIN => State::SingleCoreMain, + Self::MULTI_CORE_MAIN => State::MultiCoreMain, + _ => panic!("Invalid KERNEL_STATE"), + } + } + + /// Transition from Init to SingleCoreMain. + pub fn transition_to_single_core_main(&self) { + if self + .0 + .compare_exchange( + Self::INIT, + Self::SINGLE_CORE_MAIN, + Ordering::Acquire, + Ordering::Relaxed, + ) + .is_err() + { + panic!("transition_to_single_core_main() called while state != Init"); + } + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/synchronization.rs b/14_exceptions_part2_peripheral_IRQs/src/synchronization.rs new file mode 100644 index 00000000..08edd68d --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/synchronization.rs @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! Synchronization primitives. + +use core::cell::UnsafeCell; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Synchronization interfaces. +pub mod interface { + + /// Any object implementing this trait guarantees exclusive access to the data contained within + /// the Mutex for the duration of the provided closure. + /// + /// The trait follows the [Rust embedded WG's + /// proposal](https://github.com/korken89/wg/blob/master/rfcs/0377-mutex-trait.md) and therefore + /// provides some goodness such as [deadlock + /// prevention](https://github.com/korken89/wg/blob/master/rfcs/0377-mutex-trait.md#design-decisions-and-compatibility). + /// + /// # Example + /// + /// Since the lock function takes an `&mut self` to enable deadlock-prevention, the trait is + /// best implemented **for a reference to a container struct**, and has a usage pattern that + /// might feel strange at first: + /// + /// ``` + /// static MUT: Mutex> = Mutex::new(RefCell::new(0)); + /// + /// fn foo() { + /// let mut r = &MUT; // Note that r is mutable + /// r.lock(|data| *data += 1); + /// } + /// ``` + pub trait Mutex { + /// The type of encapsulated data. + type Data; + + /// Creates a critical section and grants temporary mutable access to the encapsulated data. + fn lock(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R; + } + + /// A reader-writer exclusion type. + /// + /// The implementing object allows either a number of readers or at most one writer at any point + /// in time. + pub trait ReadWriteEx { + /// The type of encapsulated data. + type Data; + + /// Grants temporary mutable access to the encapsulated data. + fn write(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R; + + /// Grants temporary immutable access to the encapsulated data. + fn read(&mut self, f: impl FnOnce(&Self::Data) -> R) -> R; + } +} + +/// A pseudo-lock for teaching purposes. +/// +/// Used to introduce [interior mutability]. +/// +/// In contrast to a real Mutex implementation, does not protect against concurrent access from +/// other cores to the contained data. This part is preserved for later lessons. +/// +/// The lock will only be used as long as it is safe to do so, i.e. as long as the kernel is +/// executing on a single core. +/// +/// [interior mutability]: https://doc.rust-lang.org/std/cell/index.html +pub struct IRQSafeNullLock { + data: UnsafeCell, +} + +/// A pseudo-lock that is RW during the single-core kernel init phase and RO afterwards. +/// +/// Intended to encapsulate data that is populated during kernel init when no concurrency exists. +pub struct InitStateLock { + data: UnsafeCell, +} + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +unsafe impl Sync for IRQSafeNullLock {} + +impl IRQSafeNullLock { + /// Wraps `data` into a new `IRQSafeNullLock`. + pub const fn new(data: T) -> Self { + Self { + data: UnsafeCell::new(data), + } + } +} + +unsafe impl Sync for InitStateLock {} + +impl InitStateLock { + pub const fn new(data: T) -> Self { + Self { + data: UnsafeCell::new(data), + } + } +} + +//------------------------------------------------------------------------------ +// OS Interface Code +//------------------------------------------------------------------------------ +use crate::{exception, state}; + +impl interface::Mutex for &IRQSafeNullLock { + type Data = T; + + fn lock(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R { + // In a real lock, there would be code encapsulating this line that ensures that this + // mutable reference will ever only be given out once at a time. + let data = unsafe { &mut *self.data.get() }; + + // Execute the closure while IRQs are masked. + exception::asynchronous::exec_with_irq_masked(|| f(data)) + } +} + +impl interface::ReadWriteEx for &InitStateLock { + type Data = T; + + fn write(&mut self, f: impl FnOnce(&mut Self::Data) -> R) -> R { + assert!( + state::state_manager().state() == state::State::Init, + "InitStateLock::write called after kernel init phase" + ); + assert!( + !exception::asynchronous::is_local_irq_masked(), + "InitStateLock::write called with IRQs unmasked" + ); + + let data = unsafe { &mut *self.data.get() }; + + f(data) + } + + fn read(&mut self, f: impl FnOnce(&Self::Data) -> R) -> R { + let data = unsafe { &*self.data.get() }; + + f(data) + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/src/time.rs b/14_exceptions_part2_peripheral_IRQs/src/time.rs new file mode 100644 index 00000000..cd3ceec3 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/src/time.rs @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! Timer primitives. + +#[cfg(target_arch = "aarch64")] +#[path = "_arch/aarch64/time.rs"] +mod arch_time; +pub use arch_time::*; + +//-------------------------------------------------------------------------------------------------- +// Public Definitions +//-------------------------------------------------------------------------------------------------- + +/// Timekeeping interfaces. +pub mod interface { + use core::time::Duration; + + /// Time management functions. + /// + /// The `BSP` is supposed to supply one global instance. + pub trait TimeManager { + /// The timer's resolution. + fn resolution(&self) -> Duration; + + /// The uptime since power-on of the device. + /// + /// This includes time consumed by firmware and bootloaders. + fn uptime(&self) -> Duration; + + /// Spin for a given duration. + fn spin_for(&self, duration: Duration); + } +} diff --git a/14_exceptions_part2_peripheral_IRQs/test-macros/Cargo.toml b/14_exceptions_part2_peripheral_IRQs/test-macros/Cargo.toml new file mode 100644 index 00000000..a570f72b --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/test-macros/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "test-macros" +version = "0.1.0" +authors = ["Andre Richter "] +edition = "2018" + +[lib] +proc-macro = true + +[dependencies] +proc-macro2 = "1.x" +quote = "1.x" +syn = { version = "1.x", features = ["full"] } +test-types = { path = "../test-types" } diff --git a/14_exceptions_part2_peripheral_IRQs/test-macros/src/lib.rs b/14_exceptions_part2_peripheral_IRQs/test-macros/src/lib.rs new file mode 100644 index 00000000..092c4806 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/test-macros/src/lib.rs @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2019-2020 Andre Richter + +use proc_macro::TokenStream; +use proc_macro2::Span; +use quote::quote; +use syn::{parse_macro_input, Ident, ItemFn}; + +#[proc_macro_attribute] +pub fn kernel_test(_attr: TokenStream, input: TokenStream) -> TokenStream { + let f = parse_macro_input!(input as ItemFn); + + let test_name = &format!("{}", f.sig.ident.to_string()); + let test_ident = Ident::new( + &format!("{}_TEST_CONTAINER", f.sig.ident.to_string().to_uppercase()), + Span::call_site(), + ); + let test_code_block = f.block; + + quote!( + #[test_case] + const #test_ident: test_types::UnitTest = test_types::UnitTest { + name: #test_name, + test_func: || #test_code_block, + }; + ) + .into() +} diff --git a/14_exceptions_part2_peripheral_IRQs/test-types/Cargo.toml b/14_exceptions_part2_peripheral_IRQs/test-types/Cargo.toml new file mode 100644 index 00000000..a0be2c57 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/test-types/Cargo.toml @@ -0,0 +1,5 @@ +[package] +name = "test-types" +version = "0.1.0" +authors = ["Andre Richter "] +edition = "2018" diff --git a/14_exceptions_part2_peripheral_IRQs/test-types/src/lib.rs b/14_exceptions_part2_peripheral_IRQs/test-types/src/lib.rs new file mode 100644 index 00000000..371bb557 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/test-types/src/lib.rs @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2019-2020 Andre Richter + +//! Types for the `custom_test_frameworks` implementation. + +#![no_std] + +/// Unit test container. +pub struct UnitTest { + /// Name of the test. + pub name: &'static str, + + /// Function pointer to the test. + pub test_func: fn(), +} diff --git a/14_exceptions_part2_peripheral_IRQs/tests/00_console_sanity.rb b/14_exceptions_part2_peripheral_IRQs/tests/00_console_sanity.rb new file mode 100644 index 00000000..a6b549b2 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/tests/00_console_sanity.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +# SPDX-License-Identifier: MIT OR Apache-2.0 +# +# Copyright (c) 2019-2020 Andre Richter + +require 'expect' + +TIMEOUT_SECS = 3 + +# Verify sending and receiving works as expected. +class TxRxHandshake + def name + 'Transmit and Receive handshake' + end + + def run(qemu_out, qemu_in) + qemu_in.write_nonblock('ABC') + raise('TX/RX test failed') if qemu_out.expect('OK1234', TIMEOUT_SECS).nil? + end +end + +# Check for correct TX statistics implementation. Depends on test 1 being run first. +class TxStatistics + def name + 'Transmit statistics' + end + + def run(qemu_out, _qemu_in) + raise('chars_written reported wrong') if qemu_out.expect('6', TIMEOUT_SECS).nil? + end +end + +# Check for correct RX statistics implementation. Depends on test 1 being run first. +class RxStatistics + def name + 'Receive statistics' + end + + def run(qemu_out, _qemu_in) + raise('chars_read reported wrong') if qemu_out.expect('3', TIMEOUT_SECS).nil? + end +end + +##-------------------------------------------------------------------------------------------------- +## Test registration +##-------------------------------------------------------------------------------------------------- +def subtest_collection + [TxRxHandshake.new, TxStatistics.new, RxStatistics.new] +end diff --git a/14_exceptions_part2_peripheral_IRQs/tests/00_console_sanity.rs b/14_exceptions_part2_peripheral_IRQs/tests/00_console_sanity.rs new file mode 100644 index 00000000..5aa38f09 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/tests/00_console_sanity.rs @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2019-2020 Andre Richter + +//! Console sanity tests - RX, TX and statistics. + +#![feature(format_args_nl)] +#![no_main] +#![no_std] + +mod panic_exit_failure; + +use libkernel::{bsp, console, print}; + +#[no_mangle] +unsafe fn kernel_init() -> ! { + use bsp::console::{console, qemu_bring_up_console}; + use console::interface::*; + + qemu_bring_up_console(); + + // Handshake + assert_eq!(console().read_char(), 'A'); + assert_eq!(console().read_char(), 'B'); + assert_eq!(console().read_char(), 'C'); + print!("OK1234"); + + // 6 + print!("{}", console().chars_written()); + + // 3 + print!("{}", console().chars_read()); + + // The QEMU process running this test will be closed by the I/O test harness. + loop {} +} diff --git a/14_exceptions_part2_peripheral_IRQs/tests/01_timer_sanity.rs b/14_exceptions_part2_peripheral_IRQs/tests/01_timer_sanity.rs new file mode 100644 index 00000000..e0b3c162 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/tests/01_timer_sanity.rs @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2019-2020 Andre Richter + +//! Timer sanity tests. + +#![feature(custom_test_frameworks)] +#![no_main] +#![no_std] +#![reexport_test_harness_main = "test_main"] +#![test_runner(libkernel::test_runner)] + +mod panic_exit_failure; + +use core::time::Duration; +use libkernel::{bsp, cpu, time, time::interface::TimeManager}; +use test_macros::kernel_test; + +#[no_mangle] +unsafe fn kernel_init() -> ! { + bsp::console::qemu_bring_up_console(); + + // Depending on CPU arch, some timer bring-up code could go here. Not needed for the RPi. + + test_main(); + + cpu::qemu_exit_success() +} + +/// Simple check that the timer is running. +#[kernel_test] +fn timer_is_counting() { + assert!(time::time_manager().uptime().as_nanos() > 0) +} + +/// Timer resolution must be sufficient. +#[kernel_test] +fn timer_resolution_is_sufficient() { + assert!(time::time_manager().resolution().as_nanos() < 100) +} + +/// Sanity check spin_for() implementation. +#[kernel_test] +fn spin_accuracy_check_1_second() { + let t1 = time::time_manager().uptime(); + time::time_manager().spin_for(Duration::from_secs(1)); + let t2 = time::time_manager().uptime(); + + assert_eq!((t2 - t1).as_secs(), 1) +} diff --git a/14_exceptions_part2_peripheral_IRQs/tests/02_exception_sync_page_fault.rs b/14_exceptions_part2_peripheral_IRQs/tests/02_exception_sync_page_fault.rs new file mode 100644 index 00000000..64fc5486 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/tests/02_exception_sync_page_fault.rs @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2019-2020 Andre Richter + +//! Page faults must result in synchronous exceptions. + +#![feature(format_args_nl)] +#![no_main] +#![no_std] + +/// Overwrites libkernel's `panic_wait::_panic_exit()` with the QEMU-exit version. +/// +/// Reaching this code is a success, because it is called from the synchronous exception handler, +/// which is what this test wants to achieve. +/// +/// It also means that this integration test can not use any other code that calls panic!() directly +/// or indirectly. +mod panic_exit_success; + +use libkernel::{bsp, cpu, exception, memory, println}; + +#[no_mangle] +unsafe fn kernel_init() -> ! { + use memory::mmu::interface::MMU; + + bsp::console::qemu_bring_up_console(); + + println!("Testing synchronous exception handling by causing a page fault"); + println!("-------------------------------------------------------------------\n"); + + exception::handling_init(); + + if let Err(string) = memory::mmu::mmu().init() { + println!("MMU: {}", string); + cpu::qemu_exit_failure() + } + + println!("Writing beyond mapped area to address 9 GiB..."); + let big_addr: u64 = 9 * 1024 * 1024 * 1024; + core::ptr::read_volatile(big_addr as *mut u64); + + // If execution reaches here, the memory access above did not cause a page fault exception. + cpu::qemu_exit_failure() +} diff --git a/14_exceptions_part2_peripheral_IRQs/tests/03_exception_irq_sanity.rs b/14_exceptions_part2_peripheral_IRQs/tests/03_exception_irq_sanity.rs new file mode 100644 index 00000000..6e2ae8f7 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/tests/03_exception_irq_sanity.rs @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020 Andre Richter + +//! IRQ handling sanity tests. + +#![feature(custom_test_frameworks)] +#![no_main] +#![no_std] +#![reexport_test_harness_main = "test_main"] +#![test_runner(libkernel::test_runner)] + +mod panic_exit_failure; + +use libkernel::{bsp, cpu, exception}; +use test_macros::kernel_test; + +#[no_mangle] +unsafe fn kernel_init() -> ! { + bsp::console::qemu_bring_up_console(); + + exception::handling_init(); + exception::asynchronous::local_irq_unmask(); + + test_main(); + + cpu::qemu_exit_success() +} + +/// Check that IRQ masking works. +#[kernel_test] +fn local_irq_mask_works() { + // Precondition: IRQs are unmasked. + assert!(exception::asynchronous::is_local_irq_masked()); + + unsafe { exception::asynchronous::local_irq_mask() }; + assert!(!exception::asynchronous::is_local_irq_masked()); + + // Restore earlier state. + unsafe { exception::asynchronous::local_irq_unmask() }; +} + +/// Check that IRQ unmasking works. +#[kernel_test] +fn local_irq_unmask_works() { + // Precondition: IRQs are masked. + unsafe { exception::asynchronous::local_irq_mask() }; + assert!(!exception::asynchronous::is_local_irq_masked()); + + unsafe { exception::asynchronous::local_irq_unmask() }; + assert!(exception::asynchronous::is_local_irq_masked()); +} + +/// Check that IRQ mask save is saving "something". +#[kernel_test] +fn local_irq_mask_save_works() { + // Precondition: IRQs are unmasked. + assert!(exception::asynchronous::is_local_irq_masked()); + + let first = unsafe { exception::asynchronous::local_irq_mask_save() }; + assert!(!exception::asynchronous::is_local_irq_masked()); + + let second = unsafe { exception::asynchronous::local_irq_mask_save() }; + assert_ne!(first, second); + + unsafe { exception::asynchronous::local_irq_restore(first) }; + assert!(exception::asynchronous::is_local_irq_masked()); +} diff --git a/14_exceptions_part2_peripheral_IRQs/tests/panic_exit_failure/mod.rs b/14_exceptions_part2_peripheral_IRQs/tests/panic_exit_failure/mod.rs new file mode 100644 index 00000000..b4ac73d1 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/tests/panic_exit_failure/mod.rs @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2019-2020 Andre Richter + +/// Overwrites libkernel's `panic_wait::_panic_exit()` with the QEMU-exit version. +#[no_mangle] +fn _panic_exit() -> ! { + libkernel::cpu::qemu_exit_failure() +} diff --git a/14_exceptions_part2_peripheral_IRQs/tests/panic_exit_success/mod.rs b/14_exceptions_part2_peripheral_IRQs/tests/panic_exit_success/mod.rs new file mode 100644 index 00000000..54bb072d --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/tests/panic_exit_success/mod.rs @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2019-2020 Andre Richter + +/// Overwrites libkernel's `panic_wait::_panic_exit()` with the QEMU-exit version. +#[no_mangle] +fn _panic_exit() -> ! { + libkernel::cpu::qemu_exit_success() +} diff --git a/14_exceptions_part2_peripheral_IRQs/tests/runner.rb b/14_exceptions_part2_peripheral_IRQs/tests/runner.rb new file mode 100755 index 00000000..ef11f316 --- /dev/null +++ b/14_exceptions_part2_peripheral_IRQs/tests/runner.rb @@ -0,0 +1,139 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# SPDX-License-Identifier: MIT OR Apache-2.0 +# +# Copyright (c) 2019-2020 Andre Richter + +require 'English' +require 'pty' + +# Test base class. +class Test + INDENT = ' ' + + def print_border(status) + puts + puts "#{INDENT}-------------------------------------------------------------------" + puts status + puts "#{INDENT}-------------------------------------------------------------------\n\n\n" + end + + def print_error(error) + puts + print_border("#{INDENT}❌ Failure: #{error}: #{@test_name}") + end + + def print_success + print_border("#{INDENT}✅ Success: #{@test_name}") + end + + def print_output + puts "#{INDENT}-------------------------------------------------------------------" + print INDENT + print '🦀 ' + print @output.join('').gsub("\n", "\n" + INDENT) + end + + def finish(error) + print_output + + exit_code = if error + print_error(error) + false + else + print_success + true + end + + exit(exit_code) + end +end + +# Executes tests with console I/O. +class ConsoleTest < Test + def initialize(binary, qemu_cmd, test_name, console_subtests) + @binary = binary + @qemu_cmd = qemu_cmd + @test_name = test_name + @console_subtests = console_subtests + @cur_subtest = 1 + @output = ["Running #{@console_subtests.length} console-based tests\n", + "-------------------------------------------------------------------\n\n"] + end + + def format_test_name(number, name) + formatted_name = number.to_s.rjust(3) + '. ' + name + formatted_name.ljust(63, '.') + end + + def run_subtest(subtest, qemu_out, qemu_in) + @output << format_test_name(@cur_subtest, subtest.name) + + subtest.run(qemu_out, qemu_in) + + @output << "[ok]\n" + @cur_subtest += 1 + end + + def exec + error = false + + PTY.spawn(@qemu_cmd) do |qemu_out, qemu_in| + begin + @console_subtests.each { |t| run_subtest(t, qemu_out, qemu_in) } + rescue StandardError => e + error = e.message + end + + finish(error) + end + end +end + +# A wrapper around the bare QEMU invocation. +class RawTest < Test + MAX_WAIT_SECS = 5 + + def initialize(binary, qemu_cmd, test_name) + @binary = binary + @qemu_cmd = qemu_cmd + @test_name = test_name + @output = [] + end + + def exec + error = 'Timed out waiting for test' + io = IO.popen(@qemu_cmd) + + while IO.select([io], nil, nil, MAX_WAIT_SECS) + begin + @output << io.read_nonblock(1024) + rescue EOFError + io.close + error = $CHILD_STATUS.to_i != 0 + break + end + end + + finish(error) + end +end + +##-------------------------------------------------------------------------------------------------- +## Script entry point +##-------------------------------------------------------------------------------------------------- +binary = ARGV.last +test_name = binary.gsub(%r{.*deps/}, '').split('-')[0] +console_test_file = 'tests/' + test_name + '.rb' +qemu_cmd = ARGV.join(' ') + +test_runner = if File.exist?(console_test_file) + load console_test_file + # subtest_collection is provided by console_test_file + ConsoleTest.new(binary, qemu_cmd, test_name, subtest_collection) + else + RawTest.new(binary, qemu_cmd, test_name) + end + +test_runner.exec diff --git a/doc/14_BCM_driver.drawio b/doc/14_BCM_driver.drawio new file mode 100644 index 00000000..d5b8e127 --- /dev/null +++ b/doc/14_BCM_driver.drawio @@ -0,0 +1 @@ +7Vpbc+I2FP41zLSdCeM78Mgtu+k2TTakm+YpI2xhqxGWI4sA/fU9smXHNxqSjYFON8MQ6+j4WD7fuXyy6Zjj5eYTR1FwyTxMO4bmbTrmpGMYumUYHfnRvG0qsbSBmUp8Tjyl9SKYkb+xEmpKuiIejkuKgjEqSFQWuiwMsStKMsQ5W5fVFoyWrxohH9cEMxfRuvSOeCJIpYOi/DMmfqCu3NfUuufIffQ5W4Xqch3DXCR/6fQSZaaUfhwgj61LIrwR5ywU6gb+mK9CsQLxJQtZx54GQkgXDDvGOXwWUrHrM+ZTjCISd122BLEbg8r5Ai0JlQBkNkaJDbiIOe2YY86YSI+WmzGmEsAMmnQl5ztmcx9wHIp9Trh7+nX2rTd9ZtMvX26uru2/rsz1mbLyjOgKZ75KPCK2GQiJH7E0onXM0TogAs8i5MrZNcQdyAKxpDDS4VC64rx6x6nXzFEsOHvEY0YZh9mQhWBjVL+NbE2YC7wpiNRtfcJsiQXfgoqK6zPTyJBfF8NEyYJCiFi2EiKFrJ9be3EdHCjvNXtyZD/dTyYj3A8sfRyi4SSYfjuz9nAlxFkkD2UiYK7cNVPz0n0xOJaE/i2LpED6W6B5Fvq6o6eCPOYtpXHNYiIIC0FE8UJUICGUZj6HRMC6Z+NeDQ2YGTg9Ezmvgfg9eKlZ01SuyfHTnTp+ht2AXw70x+Nn1PDDGxdHqV+H8EHxNnQDDm5YxTVo4dYrfm+M9iIYSoQo8SVyLjg0CQrpSAJFcKgmlsTz5GUac6+cndV4ah1JS6siadeR1K1+E5JtAWm2nYjvzMOWsehXoDAGDUnVcxqSSu+1hoVVw2IeR2k6/fIjh3bg1pBCjtG1D5lDdkMOOVSiE5Uwc55Wkr+Mloj7JKmTUKGjDXwnztFS+ZlgUTpnFeYk3GcKOTmnwMttwpGv/idXJgUBWkrgaH10yxERuaisXrIGfiHVK8x5TZIJLm6+XqIQCCcvGJhX1UEWVWXvclhaPnKP7XJJfcFNKwi4XELG7jNb+m6z7SxZ6nLskxhQfghQCAnJf+p2uz833Y1UxiGaU1xSOZyDpW66yIcIhx40gwfCn+IjribiJBSNjiuvo1JVq6UwycW8Yqo+xUBrQZM9kCyvWRlMY0Y3XiuDhZJdLqb5zkoOYFtEXHVM0RzTUb5Pq9TztO7nxPcjmIptV5lKw57B0BqqrN5emXVOsMzmRW00vgT1C6nNVxEUVW0MMcAZpfJ0bcLJ89uroUeeG+8sc7hcofFvJQ+MJjZOI9ormysP4f7CbdpcOW4fzxcfxLrtXoUy9Ht2Qyw37X9bC+Xe66wbyuhQPhWC0Zwy91GGA4qDpFhIZ8L8eQJHUiFgVESkwqQLrh0OxtZ0JM/YEPGnPBu4Ujq6z2zB8WRTHGwLbG8n0AAR3xYsyuF9vlgYvNhMRpnRnRjHbMVdvEdFEJDQWOzB0LBXeoRWj5niPiwj/xxTJCB7S2trCgll7ppB5ynEnzPoVqqpYVX3EOmtqjOLj6Uqxiy9xn+re/zUGTVTSZzmd/odods/5Sp8jTmJAswRvRi/tdieBPE7k03k5usMLfDvK0p/k4lfoux3HLZkVyHd3mA/3knWD0K05FpvMPIKqzn49S9CAvtPJHDdU59T7ncrafE+jvof9kZHr/bGQSPPa+iNg9Z64+BNvdEjaMlC7zaQcVRoinqpKRpWvSnubmRZZyz2xbxLNnfGvPnl3a5wVjvNr79v83OO2Px6NfKVbS3e2vps81VTLbe+7EnToVjb60yrFGyv8az3EL5DhOcxuZlR52ZO9aXX3gGqGzVjh2ZndtN7tZNhZ9Cj/7PE7JbBzByIhObJpy6AQwhfq0g+pgl96ZWVYJwgeorkgskXNEIqmdqxuMbg9KiGXX+LeSSqob+HauSD/ahGJQjeX9qzIvODeRysrO/xlvawzKMUe20wjyNE6xGJiK7XiUjPfCcRMbVei0QEhi8/w0rVX35QZ07/AQ== \ No newline at end of file diff --git a/doc/14_BCM_driver.png b/doc/14_BCM_driver.png new file mode 100644 index 0000000000000000000000000000000000000000..642205b5a8b809128684ed994bc906e3b0b51c94 GIT binary patch literal 301850 zcmeFacT|(x_BI+&EZC)3Xet5%0vnMc-E9Fuiu8_(fV9wi*R3d0RHRp>NtYU02r5OT zM0yQXN(dy<5+EeGD_cBA5BeMT?C%?Q+}HP>8o%{iZE&h_T8x~jrH`s4Hv z2xQ+i#mgGtpIQiHNA<29;FE_QeE|^23COj}7qvW0W>M}hw7W=RUkl#WJq*5mu}<%{ zec|Q%4PkVJHjITSg@nUZHwx>6uhv6n;XOw~xcJ;ck5}Ec*SkS;=+Jl-o&;BosUYls z4{=QPmbJ{wjciVE#=83_$wd1vEN8rtpu{eR>wXd`%Q&7&SU z{`cSgK4Z$M6o@6~|AGurwDb=84Y$wylLdSeLOq~(=RaS-31u3(^0Q{bjQ>c5e@k$t zwr|@%Q2&MspQZ=U8buWz4gRju|9&?aM`r)I^anp^$kPZm>FvGp-%tEq?eq@#e=hy5 zJG?27X!ElVPyJIvhS1PSc>iJ*__dnOgH>PhNi4 z=YMZa@-(gN|5$oR;8{Axk)n`#_5Xh2?`j8b;J}s}_~-iDasyj#V9O0`WdmE;z*aV} zl?`lxf-O+61q!x6!4@~L#SLt616$m{7Dc#45pGe0TNL3|rC_U4uvID8suXM$47Un~ z|8FlCIu?X8eD4MLA8UhK#lx-Q;Z_g9Ru92e55ZOs!T)btiBigHciQ`~!V;Z1*uVFB z1zx9fn;Yio_!#p0-lH=apb{eNEF!w8!%6-cXj)M^UTx0st?}i-A@usmXweiv-% zL9d$b)0B{F-+Na6{f8%Z0|&fwqkAK;8VtP9+UWATZVvhR?TjPA(Xo$rZ|ZnaI{Uc@ zB5oF~%GLeGWn-Q4?6jBU){3kS(v?e}6QeN&EkLiMBWTcEqXOf=i;Wh)DHvQJl}2?yYZK|!2Z)SL|)vy|K9`)ya!6SOy?!c zHcaz}DPL#;c@ruOH|+Uo0Wj~HzL=0r;%^9XcQ2T_;X@nWznA=dE0w7B{5(Y<;@fx6 zgn*%Ly*hX1KR53Ca@5tqQ1^CN+HTgm6OcDj#65@mo7NYYKtr53OT=#*;zCcRKzfc| zFxYI&^4EZFln$4eAO634D*3=FK97WK*v|LGf#s^J0(qS#pgPzkN654=~h&$DdMu*q9$CmJg7>2#kgPctYXk9sUIR z6Leb#^Wwf~{ev#(o*cHle)YSS|I_BrKLk^oeYwlDc`h!h$GY}8YQrHhUInJ{$Bknz zerF43UW1`7-WL(uw8QcjfV`h#tF$)^ZWZk3M11JS%|^3fpbZDr18hQA^X_e$E9ErM z4cG4ea~sFz9XJ(C+>KJd+9Jz2FS9{-*U4reHsPiiMAD z5`RO8&s)xF%UNyM!j`kza#kC@CUDDHZDm&9ZDA|3+RCgpQmn1aYAdt)p6YMG!2iuK zP(GiQ^XlI4xAxV{1#q(UgdD=yqC(HPG^rxYMvyiFa0k%mZ@hSam&(hhTmx5J$a zw6Z<;+15?EZy- z-`CiAjnAQN;z->M9@ZPn$GovcYO{!`ixEr3@B~QUBQLu0i0})dVguy|PSK_x1}I8< zkXiZr;Qxsu*S7;)CPz~lzQK(AfU{0~HUXNzfAYj;GOqYcPtEsZ3hHw1n?CL_@fY>7 zFS@es)yCB?)2{ozCfHop_|(t@syQ#od#ju%yg*ZDex5KE!wbP^$Hp-2$~JU=O`k1#+F~67#Rg zg{wHskuSk_?&{E1(0B6J8vije_RY-g{7XGs@#F8n_NtyUO3Xe)#3bux~49^_pcf32Qz?4+lNipq+AZ2i2z#{+g_&g zJ4R(B6VL=i-cH{Qj_^mD40Hn=Ln%Y6ncU;rw6nFoA~W$4V@UsC7JIm04TVgMu`T-e zYH9{PR+p;w7@ZkU=Fu-Wz@^R|2+W?Ppj^PO_{%x-S8sG^UqUPye((=J&H+q{I}aS> zwB=>DU&zRyonlK@j;kRGns}fqR;DAuZ?8NW6&~L!ay44t;>m*}MyLJo#mOpK1CL2X z9DXY&P5hl5d{)|m<|m>rjSsY?nysNFwLj^LxF+#Vu1y#TuYQr^z=e~ndv)g*a)cTh zll@rDYFHQ&rI3uyt-_YgGE>syr2HlMbAGt{gfZYx9*@2cy22Obx}qNx<2kASYQPqC zJE_9IE1!@N#BEN4ZG8D~9|tqXUQaoT#0q6||Le^*%>=WtbX}8>lN|dV-+GS-jmq2{7GBVwk zI-W=vA|nuy1vQWC6+(lPU8fIjvgBJlj6&W%`mIK^OBDFajS@1(%n>U z0&Li`_+y4yqZL1~uwzN2&d9lyt>e0kN((YuH=t@FTZ*qZ12?B8M>@?-S^W};NL*s; zaxLrQ`80_3{$nmSTyFKu)v$HRn$^kpm3pC!M_HLkl9H+&h0mvis#-1#`75KPh@=BU zPt@cn=QHBn)~3(dMC*A3UKyK`$j@ zEN<<_`g0B}^hJ!ZgV^zMCh>PC4H8HJ_T9Jd7tiTWt4GleB1}ERT30c#^CRyGy7b!w z3bbhT%}SFBaZqB{SuG>y_mPeZ$9QyP#8Ek+))DH!5+TYH}`+|*oLHd8jrjM4dIEN3ztMlRFH zw((REpL2;UQnKlZB_SVAM3IaqqG+ZP*`tj-Z^ctI8vV*z4uraz@oh`;eH(Dp1DP19 zq29zFYx~(IHTW7IeW@E9zn1eX_)j&NMXl#(jKUb>k9SI$yurwGOnaJPH{<1|nhI({nhGjP zoRmfkan*e@&RJg~YmWH!_|{LCPFA+aPGw^X9%=4K&|3B>5bb$vwqL5Ii;z(?qa%gS zsn^?(k!EZGx__Hg~$BuYSq3thVc|MI4Vc|hCAPVEAwKHBtA zQ+~zi9Wo2@K3_+Pu02nK8}>9;-CWNn(zlsKirxnP__K>WoYsgBk&cTs(B%_>R<=zR z&P5H>e_`Xc*Nj3FaeY%sVL=@JXUNO5nvs+w`q1&pj0C4odUweW#@}oUw_Uzmc^PqW%mLf`-1fs8S~V^5AQQkadeY#R{6}FEdZ_?fJ}0eQ=!Na*RQ& zo;O=)>&uyo$Hk;{m5!I@YYp}-1{ja89!X~DvEf4`yG98*Voe1frAMu(v=AvyIuwby zSV1mpzJQ?OqK8dZMaA+f!=N5w`Cf|%VV0_Jn6O?RNmh?0AKMIp%Tf7>sSvGpv z*nggMH}ynKI8NW#S++`cF_AAZfXk0oV+V8w>jbA42s!0INC=ye=0=94SXJ#Eu8f13)W~2IxP=d7o|C&3!+W$R@azmR5*l_+^rT7=4Oa>7y@m=n>^*iTRV{u z*7su;{A1=2c$He<_=_Q{%NmUw7_^|j|n?Yno>eJ6xmVUP@^$# zo)_xXdA8Q}O>2WAP`0+OD&GOSe)sntGqE!oO?Y4T5YGLQm6NtSiEcg#q#l}Q!R~Vv z?YvSs`JJgVZCZcySryC~$Xv_so=Pw3ub(oyv8a{5oA+)SvfnnfW&E$ywVty9j1`b* z)l-t?!{kWKj|~LLFX2JjszKSVr7#F#yh>x#1|c(G!dQjP$QciKPtkMVomF=M&ucPX z-0gdyuh_{;GcN~(l_J6aCNF38)$2DPw!+B06?$X2cnRbZg!a+ilIgRbNo2#x_|Fwn)A*)xbnt*dqIZ|8 z?j!MGuTi5HS`yiT`;j3`H)->OR1l!`g?4a0 zlbvPCM9(1wVP)YBDYdn*5p8sDGfx#7XmP)sp?dc_k_$Wz3#2&Z_lTDD=1L zsA{OOTAFSvyh~U$lsSg$9B+N3BGy}?f+K?jgfkM_?`^!=V`KJULMPj69aErCmyOBq z&0v7f_~Ok7GHk^yl7_{mIM-UJs9J_JdRp@pf!natxS^e2z(o69qD5TT{CaA^`N#zB z62&N4pZW>iFn+<;rbE|x#_SM=!$%iMG5F_=6Gw~~_yrJ79g7TR*ky0KquW$vGqKkh z3<8vS5a|pf1|}4ruS30VJ$e0hg?$aaV_(cv^Su0S`yetRI0(H~xVU1K?21MhB>G{z zcVS=7r~3eL4$O6nV|_=kZr;gm?_%?kO8T%z)arIJjc}jJ(ESCh+kk@BpfK6Tyg7Vq zr$7DqHC_4rwK>xZT^Ze?eRm@2*B1rVFX+#-z=mIY(rbD_L57=^aIbSATh}(u=@aib z-e#xHP-1?xsW)%;K(1w1){O}F7-?wDT3AL$T!SAa&wYqB>!?URf8^(kSg)C*vOXR@ zG7A_Bm{4(Nk>mRbm>97yMtE3TwZNOy@>bL|G1!9|^3&xbCROR)8T7ar;*OH`L;b9c zZRkR^nq$k%8iU_{7JAq%({ zaV9eAVw8?i#wUrdFt)|wL{}TS@{*mIa}vfOtgEhFHAjhDIl1KqMqbc4M0iwj?wfA= zaX4W(uZpV!ZI5OwpNGq`E?hhdTeCOtJ)5W%t(t4o6q$QO&kL(qU+I$mYSO${!MJ+^+P+glNWjn0{J8LGy`)cy38g-$6gf+*{nI* zTq*j}?id#)T+gW40Dz9oa!Jt!GX9v2^u{ELr}l8$)P1nOT6SDT^1`{far>HM$2e=) z+h&W~hiezZ;m0*qE@;P3s*0yO;X*{3kDBfy7Ilq%sg1{lKA1EupR^t4t0k=@inesJ znRUWa`HKDLCyuBL8yiB)Tv>Z?X%;wDgsItm?XeD|Y}RV*N1ujcl8tXhO-1LB2I3|g z96*a-S3kjKAqLuS#ZSn@^?2z5FjhZKkYPX*Z_V0hw4#z|2meH@YIh}NYX{^I+@E$w zkp*JCTPspEGmn`q>}Lab^w9k1Q$mia44i=9$;s5_T*Elxq}piv3%mV>@HwenD1Qcb z{}|0SQl{g9SI^e&16iD&^LuR@W+{yuU#8_q7eM~1z%{NFS25X;GxpW&K&aMX8&8zW zgk9m%;TE+>B_4K?U(UX<*r}xaO8*+u77m!H_#YY{1tNzvVsj@-aadxbY}K6Z@}icc zVMUMAd|M+&*PuTtT3@gXbWua&@Zvk|+({!cl&aD>TY zo=7@sa@6bFD3fZ|Na5E=`x7;v$;uFI>TK1;n$^6}Nuoe?(q8L+R-A~^I=4Q*HoK_C z+44*kru?8hs^`@nA!d+CaJ2ZX&y47f4YUo5k!Hyk3H7|&;-b~sg~BDKr}Zq*=7yxI zM9WssxbBz`xz*Y6Y$6U$!BVrdY`>)78(Am1x-kSp`-1?@UhbOXh57B|V8G3&rA@{@6jU3CgzsiCD0iN+)OX!xnE}DTQ+c> zImZ6&r(t=%dtt`;YmWBG4l{+0eO=L7@NlyW3a)tQBOzW{(n36M5u7pIXB zzQb(sekKJF*i@@`V@(yu=OwHbv(I{#!gwtw{)v{Nt*2cfTE}ty8ILZ>Cld~PQiWah zZqWl&$6%zsj&Y$vbK6|B3gL9L)_$KakAuucQ0@)WxU0H}f9Tp{QEt5=W!Pdnm)LaW z^xl}7`yB+-TLrA?BJo_JTa>Cyj%ycRZHuIG^e5hjPXwwx(r@-GC|yBVCVNY=d%38e zUB#sTopZP;Q)qY^0-V)yyabto34@-=iuI#f&#w=6ZNsg4FG*qFWNWUszef*;dqcfb z`n+d+5oOXc_JFl;Y#N4!rK(C)TYSWZL?FZVdD$(=#aGGDl`j##0`?-lMGx#?O~>Lqm&cwABpA-ZN>W{3tPAtK+p4xaOy0`T?4)Qj34tguFJ6&JDmBZFw zBGmEtc9zHdcqEyC>(=9b=p&srv+5FO$Y2OzX#rJ&I5)k&lm@tdnr&he3sqMRy~yDZkB#i5?^{N*){u9ewIXxYUlBuNF`I8 z?^o!0(LjQzJ*ouv@R{nKT(Z>bBu-RuPheGJo_|%=47mzgBgCBG|1u-FhyOWS3GU^y zPj>+SvaA12&T@`ll4@}^v6~oAl8!v7$y?N2I$Fun_*fxPLz_O=)xHUr<)Q|!(7Yhv zTTteTt!LJkrXrR&k#4@)E`zD^BGNn|>vAu=QA1SiunJFoI>WeuiGB65m+fcE#5jtd zk>gv@7S(sT1d>;iwtL-kgh}NLYME?e$o!Fed2o)mw#zF+hXxBkq0!=S&rUK~F^zVz z9H1w=Cf{){WEvSLG>sYW_ggcZ1vIYtFip1_mEom?!>hugawI8@l#!_IyRca7#o!&g zRPXJ)7C2^L6#QW1{1xRB>Vqfc9d;e8zWbDx&R`J5dwz7$(A#e~e#qOh6&^7t^)W%D z0Is8}i<>P*7MmiIKFawP{M>COXI0M0?dTH$8_dnT?YDPcj9i$7rVUIp+}tO;DxyMs1O=`7Mo4yV{_xn@V(|Z ziJ1|zhBYG@!aI>ROX7lqGQAqWb#u?G^Uljs#)_v4@lNI!OBrL7-&SNiWBTlY{^%bC zmB~K8Bf;^{y*0M#eF~9KX&YJI12p9wWGAQfSPHJ-YFHG!6fn=A*RI33 zx^M42=B2ql|6$>TUV4f){loMCJ&fbK8{1x)4jZ3C$aQu4&NCgUf1JstD<+CciGsS? z$av+#ZS|juk}_mO)*mpthFC!a;g*RiI^q8CWs4`e87xI6-jl-uw068{@$V}06e@Wa zAM!uc+Dp(edp3Dz$A~KHQA0vs{@6Ldo>)`ey@0H;I0cTMMeyS@inlo&kdu{m>xWmD zeR&2w*m4|A5F+g_V;``q@J;Y~7n@3v&Y&rG>F9IH5z;S%uEEt_R%G13R5o%$bkTct z=xfvEq4aB|?7m{CB1S#6x1*=_(v+WaX=DE_K=xuj7?3lCeI2?9AP30v2fm^kN%C2n z?{%9JXj=2BHQ8Bzk;vX}LD`w$=d-tF{T;J&yMPw2qA)rwLdOUHXng-;8~e)2Z0D|S z0jR0pviVs=!}Iw8dqk-oKi!8UR=jO}d}p?o)#bg?xDW~Ay+HGhf~utqJ!Uj7u}u|nNf#1a&LKILO(a@{AHX#N2l?V`ZZ_Yb3nb-GIw z*=Zg01G5^jzI>B0zOC1BJ2}{yrEtc6hFTcIU5)1nE5f@_Wx5||f=aj8@DqL8e+|m#`xCi*f()r{4Ljp z^BAX<#$%_F!vx&dhXo$0ENV`leSnM$2gK6({EGSP-~tuc>Rh)yviB}Y<(xlfe>Ndi zO*UBDOVE@#N@ePFV)P`n^7y#RJ90Rze8R%8F6v30)KG8}8|lK|6QUVIoJR`;~!XmNC3;L$`W*Gt`D-@`)~HPU|z!e25XM^zy~u zrmJtaZy%xWRv$RIDPKKPCf`Qua9{9(oa!-&lw2!bMX`^kBQM#iMEH|eGmGNK+b!+r zqRCXgn|oj>Se(4<6~B`U^}@AzZ(5qqg37YU0aV&#nvYTJf{#ytcSomnT ztX^5eQb)^YY~`>YK_$&_IWC;>;kB1BfBO;q=#hbH#{ylP>sYC{i9pV1mnB)7UQhe@ zGJAkBO+H<8qLd$LxrccIDTbMyuOm&s9*HKufC?Dd*3*4@r~X8!^75ePxNmA^m=y%t z`TB-1?s;*vBYvjhmXQaZYc45plHqFD@nh7a&1J4#lsoS3D`BrP_(xtnLQ?_aGAtj} zAK#Ci;xzG+eJJB%nnv-%%=y>r4*O`+W78oblGO!QBIz;8GB=PKrr4Nd+bPE z1`Bj(3J%So*-fM8fyA__FCYz-@n&&(3bN0_EdovWx zsEWTzk8k4(UGh%$BN&G7g!-SR)}D$G?rsohBdRP^A?eJ4Ia$Bq4q>9Lb4kU7N*R_( z2)=N;FF`lSi?cm1-6}){BKSZ`^F#5fqUBOOj|mGY)1XI2jHW!#t-qS_FFRR2x)Hzi z`5-;3#ECH?4$-ufc<1@GS5tAAdL20Iv8b+LRfm5;zf@D=dBGmVc zMWSbSb0xH9u0dk@HK|D!=f8BVtpF#;)~}Xs=qg!svmYr(CL?N1b>zo!2V^;lo6jpx z<`hAp*8C27I2ur7qzFb$7pnIq`NKXPckCL$^qb=f@kR6VnH;c~=)Do<9Y;GLMqYvs z7BnEatDu5hI<~No1Wd+sn({)TljJHXqmEt6x>}{3&z}e| z`LB@J3(-5`Eq9p23oXI;cQ)?MWH&6svscZsDX{r8Pa|~KYSIplErydhHOjMAkH$j= z>7o;kWbT*F$_+CtfQv-wJN2~>%dM@v*Q=OXFn1Qyb5A|$(p|5;S|ZAugVhX^<6MK5 zUaD8nyess8U=aSYXP8Y{pvI+dSV{`glcR?8m|NC0sOCW(U29mxl?+g}h4+fL+Z$l! zKgg&x7&$i^uPyd&AJK@Be2^U<{*gOAS4*?w^*4WFMVK2KZ483FuF`-Aswl#0*&KRh z%>zf3f=-hLs>a%#?$d1_X@E3Q+dqD>tAN|7)!VhJHk2+-;TO+C zgs72ezwAsvIl7ERGIDXP>EY#YCLO4Ai;IY6<;$#gJ+H^+V^KEPGbq_eQNhZkdlKko zvN=bx`(#S*o%=14CCN$`{|Y-R@pd~y-GGq4gybMdJ`}~1(&Ldu4Z_>Pg8B2|C9~rL z_T@Ypk6yRGCO`(gIjUI@h6n|HG)o@h+Pdq=mARsVs=hdL*ltzfRmOSb)X;I#EKm-! zzF*A>dMeqV+8?m3A^d`sWvIA?b0>W%VKe@hLs;AM*0; zYD)h+TN{CdIzBN>4?<9JpJPipCn~?kCv9Y$;eC<-37Qs97j5YKSkXBi6j%&-q19vE zMdl#(M=!IuU_{;P&M6D%dMQ-qokbaRd(FOSQFUxDoH$vMT}U3T%dJ$C#V+;wVc7Tu zbyZL;9J8~K!B3d8M>u>JZanGFz{nc&#`F$-SlegIKEwhHtJNEK^nk2%Zaqfx46fx6 zE{trLhhYZ~usdfD6ZThCT|w#7l%Ge(u@nTGsY(~kRz*xCLH(phU(*yi7N`u^s2KYQ zLUfPVsc-*n_2(uHO*yT2Pxt0M4(3rWfeg|F;TT{;!fBc;uFLg3jn@1HNfndDoJo)E z)|RanDS!EY@C$16^Jb5!xY|9ZjMhnasnSqrP_hwXNcLH~rVw?;8$T=r=U`Af?}*0f z(}YgKj%s_Y{!L4mX#3e{E!L`Fremsf6nXRNKO{Ah3&);Or*%G4K@Ok zr8O1TAo&UNZ9ME@iTG(2-q+pFo-qa37>Lk~sLB@m`z$Z(YQwo7gtfAMjqbHgm9=Xf zc1`vZwq5Zxcg{!5PEHrTU{%plx=ZsaNeU$!;ItGFAL>E}>7 zeQnRQ-RXPMpBkqN*KBi$gxV$K6PExVD+FtD9Q^1X+>~FFW^1x&NU&xK$oc!shY3r{6P5t@a zp&Kd?>`N*3C!SNWLW|l#tiCtvSxWo8@`tuLfG}-$7BDO3-ud{lQYF~AmW_~fwSX7W z^IZJFQ1_rim*VLAurNHWgB6Lxe@!^Qh8)~Jr)iHMBH~wzh7xOtN0Qz3b4%AGV<%9= zTA4y3St{DMriIyee2MHIwkRkm)ha>kEJAWrF3!ieV?CS5COMEnDIA>5#`cX;A5m=J zjeCM~gQ?Uf4t>|;l}ydsnR9-oj-+|E08E#6qQ_jQu3=}lWJw&|Vk0Nv$;nIhe8iQ} zs^mu%Qwf<%1h8$^#sq6j0VB@;tH~31y5S*QO~piuOA8OHmXm#@bm>P3)p#$6W%Eny^T**4c2yAsFpRFnL@7vMBRyygo$`ghUqE+g2jtLPHn z&6jT&|4g|{Q|`Pok;yX2+d$twpEM9!SnIPVOdAOp>i!rIZ$BlG5ELR}8m2Jpu`)lZ zohQ}9>f9&;lRl`aDs0}jPGqm{*ac$wZSn;z)=XEp(f z7&k8F*4i-zH6;Dry)0`E@sozwa{c-@?;bUpJjQmo73ir}qJ&U~JH6KD3UuovZE~f! z4PQ$TsAb~&;gTt{#Z5xh+}%cYd2T&wmbc02Q^C(TDFe5$ti{Mr3$Lb6A^ zIZC|yM7p+*#K|oU?m^bsxepz`gsbGLAx~nO$*OXwy&%CuUZ%gQ4X%ZShG=``A58Y^ zUdU)zlJRw0c~bZuI`G0*ms$UAVY#K^#2+{EXdQaqG=Wp)xQ;TD6 z-d~%@%DYS3Dg*~HN+0ggnu>Uz6bh2|ycV2KrHT;hX17=MI-w`kum_qh*TVkT z_~dzzTKvm;4d|EC9Zb6=Mmx>M?RED<=N(09$|nz`J)N9$M=@W5B7}#$c%)L|{5YTp za+2QdLaqUlF^4Gwh?CLPgw0#O5jI0loq+V5Ni0*_6iEaB+{GvW5npfHnL3;_5WPIv z`<~dCFE!VlB~vx>d~vKZkS8+lf-5Y`Z0s>ln2VGVrVtf1(3r)OppPdUkXt*UqwoHp z2!TA;adv(huBN?rM7t_hbI1Ni7o!tQ#bi)*5%09w*nn4M#2emudxc++f+;{WXylwd zEJs?`e1bF_cI#dnt->Kh@X}uonA_}^#EkXcM1@LLMwXMX1Gk4S;m;cKphilu1{mE^ zvc&-Os8IDff@Prn60hz2W%{~iX`9L8`WN#v3~S@qSxsrmg=*HN*?m0pe8>}1!cEtU zuOdskS=idM=rcmE*^`N(8j2zhAe!o~EyH^^YVVq|z6uYk=!vytH=~f_qS^J9LF^8f zXREwD^+Z&%wIPCe@EI@uhMgQWraDt3*uHSODWL<6+8ysRF6g@wQvkApD>;F#`S+-LYFSwqCs4#&1W|E64C{?lS3F`8zLc1;9{jCf_5 z0?^7IE@D6+(%3uZ=?+@#!(T`;plyp zk{XZ__ziUT>!oHk@xge{st#bK3^@dY3R`sHzFJX%r6wUnonO!#6E)AVo!f?&JhQ)_ z@VR-;X93MqI8(`gxpH6rYK(QZ;QV;F+zXj#XuFcQwf6DSy|ru`Q6L&FhI$&~6~zR# zE(k|2=2nKwE!6dT1}%)(cv<)W#xOMh1Zr=dMW z>!3=r$pj#Qth=c;Fx|1w0b~r_oTOxwkSuN?`%eenM`F|lLBDKpUW%wU< zwTE6uTV$LMlN^0hzV?v6DM{^C_0ET~tN>Wq%0hl+ z$x$A&W6rXe`Y*cnE&BIb5hT_=kDr34!l|9fT6+cW(4Bv1;_rU8bfw+A$&WyCFKmm# z)Pp?R5Z@Qelh`#W3%;6MI5cS!DHBb5oA*qV=#VFFF2=X)LO)!4w#&cfFpF(lv2Co2 z_sz;HZ`u`aeMpbivshB#H1QD>1E9IDlQ%Qw92Aak)w>(`ph>n0_tyJ1jN~Rr^sW>} zf4qgPcR^*ckowB^*QVD1c6W#QEu@w@{R>$KA}6(fwA9^)&(CkdHM%ibb)A9`%4-A} z_7RwouXj~ocJ88k+lA z0jqbQb*Os`#*>2`51Zzwn$=s~fdrX~GKD?2r2E|bocnOp+y#CKB6%mS9?&P*EAfMp zCya9-MtK-n+^gd8kYY6fk!!x!NxA2DnEKsHleb;G0e~m%ONAr{kJ)bf@aCsBi=yp_ zpeJYLOwkWNPMXDXMGKI)doX|&>}h@d7hX*Jx zo%C$GV=Y7B!rqwV;$q~d zvMONSBnbBz^r#m|y`&>YUNT#nfveW1^x#4LoQK2R>q$BSG!g3A!6QGB)z(xZy4O+t zZT3}(X7v*~!Ggw>WgcR5v>IQz=_uGrO6$tNs_x~=D>+sPo~>Dq*aw!n(j8Xepbg(W zw|m^(9OJk2Q6XK_{-~2(HNGKd9%(tux97Au-Fb}_yJXaXM=l~-^iJu|-reFYfBL63 zV06(leLh4-k0A7cT0C%O2p>S{dPduLM(r6W)6No$u?3)1_$0 z8H9s|>61HHot1K7ZUr%SUp-cW*8ma6IuQwsX#AUQDka!}CQ$~*kmHgN!bZOO$;Ad| zQCwE5i>>hSS(*=u)yxMZtDAjH)py#+kaJlw@iEBI3ucR#T9>fhsTz=cv`?mbPo+)X zk$C$-9vxHHmf)$S%w&H))J$ZJkU4@Sh!D=0W@{t;jmcLTNQjWVezB7AbraR=rMp9` zm)EEuN85)4dX%;3x$_G94a^aRfQuA2@g;S6e3>6jH(V$i^ubU=WEOd)GePCu_}kcOdp;MY$}Fii#UCHSU!tqEiNB+oE&PU_1Y1oJ!dv z6B+SG$1;)&o6pCZf_72IFY^;Hp^V|tw^JtlSc098%E15@(}khmUcWd`HTzVTe%Z|) zm!4|&M%K+#+>Fk6Rn|ZaMVjvM+*e6re4rJ+s))sh4|O$)*2vebx8!U<(2_>GGZne)%NhniUG$p?btPW9Be|yr!Hce-q=%fxw~LRjgYSyhYU{(P`-{ z@BCIqiS2Rv|B9zo!#M(Oz2}qI=C9X#^1hC;^&{a5<|lMbOLj#Xe~o@yIO;VaUR-K& zx7bcR#3jct{TVHD#C2&$&`)TYUVF9U=zK4Kn{Pihl>*3aX;!J(GP_9=jb8hHtBg>j zEag0vVGUl?IQTWmko{4`WK3246tGiRcSBCSp*=;)S%`PUWA#B#$pEaIfm#jH^9xPy z_sNH+=z2*U!|PdACb0vj z{i_pFrRTLrs$q5oTKo?Znd^S8<52AV+Y$T3Y~~#WwmFpMO4;2G-KX=|g=mou?h-^a zCKMx?7*r%~_z+Rz>BF7CLA@ZcP~GsmhrBMmUd@tCw&^%87!-B;-EQu)%j3)9rcJX= z$@^sl-H40gSw{vOz^c_hGakd zM?C@;>dgyU2^CH{Td{s?QZOt!ePFOX4;tA(4#Kj*P_D{-3h2qWle!1&<_Ru_EgX1~ zuk_ciBr{`oF9(qIg}>i#>lx9ii6qOE4VX6tUwmn88g);V_iLw5$&r8@i#gA!BylW! z;-!Xq8r-qIG&&MM!yys$B4fVt$trvUm+sy$awglrPziIgsej*7K#+VAAmcL`!XNP$ zRQZH-TgiIX3THNi4dD5`{StPLh#80uc}?Xt`{owT#5vYqnGjDZh0QY>8QyA1A4t&Q zeX4^F1UGv)vE`W)?pbhx?pk#_F^Ys5qZ)Hqi&JW{KEP9)bR*fv2(k`pvo(~~Sj`TV zr)aTvWmogIIiOMcC)2F)z2|vQah^?GuyDWAIoPs$O3McWlvxy~gc9EuvVCX$%)@)m zL3EocJNn&G?h3QZjb-*Sw#Xd7dFI7-V?QXqTpo3oF`>8oUkst0z?YcN&#n6*=ct9F zV>u@IAP5}w!KSAs!^c2miJ?)5%qz7HAFdaT9(=kQ#<-*p`hk?i)k@hTpvvuc@3n*Hm;+!9$R(&g+$#h{M7%e+gPRv{S3AV>J1(8IlO-j1;V`2OJgc$pIGoJod%g(akkJ6ff1AvmY3 z%B>P@^#gUT_yDb`S(RvL=Liu#r6@Iw)M5k1>@}wQAr8`8N zLb_VNdL+sB+7c+r#M^{Eff(_PG&`$?0uCq>6+coGJlCFXQ@zkh!N+P7+JabFs&Li1 z_2x5NAmB*(f4x8jSz29FlMxyoc>5{SL+IQR_R{^eUD?fsL&1iG<1++^nH%d>uvYSScg>CX2n-%sXN`gv6WRk>Vy# zKwT;f@NZ@CtaK!QMH(WURrH*y#6)lT%vuvC3fnV8z2i0Zl(ZkYmzXxy=nBDtid$$X zY=()~qu0v?(=WhYJ>I5xvZ3%8`eC(;rb&8Xvqn=SbZ7j{d%Lp@BV7qUc`uY5We0Eyw8b(h;wtIj>ba6Y-OlqwKVDTBSnOiU8o~d zfU>Cc`pQ>{vEKWQl0GY6-dLJ->s#>Kfvh=ozbrStH+_&(MpKQZTnp(cZp=nflar;E zrLql%ydwn0I>(VAA9<3i$JQMIn7V>eiNA&jr1F-7PQ(^%&yu80Nf1ElWyFoma_`Ua z-iaaa8*nPlYs^k^Tzv`|Ebqh%ZlYc`_B-VesB#=H#Ne-Qx~KQlF!0sRk+|cF@0vKr zp7RUxp|bJdn49DIAJ|bbGnFX0Js?mP&M0wh{6*ll+n>Sl1vryS3C2(=u5t7f>U5W+ zd~}kOS*_`9%+P?2(J8t&`Q?-C;Ht#Q`2yIGElxE3gb5%>p6u%xkccw59oxLhd(*v9 z=F)g&e8J<)B;Rvn;_!llX2<&oRY|KQJ->-w+i_WH`AK1IxJ4m7ph4QX#gN`VJ;eaT zeIZ}i;7R7;nEhFc_)mxpt&(qbZU<&w& z3+FZNX6Fg#Z*$0sdg+cj9>nIXz7FU?g=n#s&W^g2V!`~Ghh=4W=P|3sdM-evIX>zA zj_fUBt)jAtk=z*~?gMPFy2u_=cA*;SSJ|I$RX(sKdrpS0P8pw|HZWdPuNoSz} zHNDpI#i4<5(2hmGu1@;ZcEP_RKj77xs>{HwQ#p%{S<$f$B)ePXiJVjl5 zV1QqElKl>EL&|YtD{)~O9+k^69xN!KZYsMn)1t17n{$WAOS9J zIcIpb^6QxJ-1&|$M>G}8QA^n?vx`V2Zp8YU^7RY#FF+27K7~?;jri;_A5wi`qQjfg zX7)gPtWw!NxMz6Xa(%osdK^$PXCAO?K0==AaRdpNdt0e;bbF|FlVIuK(Ve{Q21sd& zme2af#(8l18kSI*;e8f~GN1<~T@i-pS_D@ok>i1*gvKdTKXy@ zGaM?B82yWZ3VxWKkr&hy^sLFYGq=_f*S@A67{}Nn!jk>ggt-&%v`_b!8h(^St@XCy z?zD)vT@zA7w4sSf_i9ajmal+D1p$j#&nP{=SSBf-tCCrD!A+e-Sn7RBjT0-2Lb5`> zLOgMI-^JWs;C*G-lckJ!;M{V7aMYKlW5$bRa^} z&7!Dtddjd?6GKRT@s&J8rsm4fcrk`Tc*6pcsCsI&Gp@& zh%D!Azxl0XC;n)lrFAg7J{hP(8%gVcewf*a^Ns^=P-NN;fPd+-ZtxtaJnER5hfaeu z!iUNcu;BCI=xXXHPb!6MQ^*O>Mu#d>vNbzTo!1X=5 zY9|muZr>HV=~jFv48Q?jf`aR2c4oT)5ca}BHm28%0r3v+c8}*p%Rbu89g~vU%lz4^+=ou6?*)aZ+e>YNzs-2om;i4yJoNe(FEW&m z4S*zEYP&&Ar%EP4n}wIlTz}ritoXHYsAG?>dr4IR6*~aJVloEM(gTS$v^2E!hYtqu z>&VUh_7x1T<$zpkn8(4tkn0XTSS~9Y(+5D!IZ{M~2Xc$uT|AKtXA)|^SHI(l{UF+o zy%RVeHIBVS!XiQN0) z-X~X>4RQmd%D8CR7(9q5*w`c}i~-+$YKZccv;r=fr#5M6M$)D>2^HU_a;SxMx0T&y zxstf$PxJuGsemSr{laqoK1qSBU_U2Pt||TMg%GE~fjj&Cz|ANFS6{RC^7ti1HCgE#S7UupBzs}n$`y<0MEKm^t;Jpo(zKirN@YVaqRU`GPH95J0WfZ{z~Wl#UI@tYZdW1eyb_D#m~Ds=Hh{(=ArGyv|a zOR2l^7hHt(iO-S{-TS(F|G}JuxCb(xVGdxy*{T0(#L9z!Wq2ZXX7g+71LR!+GVQt$ z`}0qUtb#&JlRHK0@7t6=%aI}iIC@FV4uhXR{+qw2oQ#BpF z2gJF{7$_u5maJL(65loe8qQy|4)AOcTR(7Yfq1Zhe(`g^xI80|+Euc@)-~BPPS5kb z`AmlFgYUR|1AP`A@>s|REn;TdrjGrB71#%`dJjaU?8>HRfnz`kOqtPcfBql|xTwl- zFu?ivFIbp^9{`8rEcS~hUlipbf(k7fd_S#B3*7h76^(rSi%mJM3TTW`1L*tB&pfHy z>`drX{YfZ&U=gi=E!_O~zkBlQh#Qy<6rG)M?%8IOlz$IwT-2z^E@soS6G$+3Uq2E+KbKX^CPVpc$S7n!txik4f*X8`7m$@ojT8^|D+T7F0c>Unz4#M*~Z_CO&JAW zIG#Tt_KPx|CD5U?yV}n$mwn0wI4s+r&(b&h`t6es&%i!~#ijpz;pw#juw`pLhM#QX zn}FvNz!%<^4nExcYyr5X=qYSg;!nm_1QwC7Zq4g9g`nS2sB91DXor9T;)d=%h(i+@#o`t6ew3SgfuSVw96wC)sZ zun*Z;*MCKFI)E?i>v3Y)%<+FH20Bct%KZ7Qp}%!STTW`rN&W46ww%C{p4q< zIn0)m`j6CQE0g*uBK|gC+V$HfTbb0)smoR-wUtRx{q7dr`w=v6!M&gSEER%n!Mz{x zGEmPJ-1{k#{C^DYm6_J;|K1C*l~w(8+JBon{m)sI?tlgL^>dER0jbu+!#O{MRdvNc zexXV+&`$1qk{~81#sv`f5h__zv(Lf77R^4baPC0|PItN^pk?mc^GD%s!9&eZycp|?Bne$LS?I4Wk_JKYZ^ z=)Ou*9=7Va@w2%CgclJ4_ z{y6V(uJ^ru@6|u&bhRsMeZQa2Gu+R8-_PH#&hr3Zp|%#H@QGU*P5Or8KYR|d_3yxt5Hb6&7(M!wiVgs$wP#%? zOU^1%{TpvpJOsb}VJwbJYtTvK$CvG~{vG_9H8e%pWgcVcQ`j3SNQ$8{{8ay=)gP6;$!r{CZ!Pn1_Sq8g5SQA4~8+h(W*Zl6^`}q zaKN@v=kI^%`@g+Y0Nz;#BQWBdTmI<;p;y_G+qK7IL`wntBlVH?DEbah@=OGNJO&KDs>o}rQ`s+CUI*xx`-e1x2 zU(>=5(ecLnZ9dd&EHXY++>$wi(az@s_e)l|&?%tjcUlhRo=|X`*?1Jb@qViv$#stT zl*8l~-y<~H}Ex%IbNQG1s2F;cEC zo#)1*vUCc0pIW$f==<|kSMP-t47jukmYHjD;t((^7F+y5XXp5C1^+m3lbi*lWnO07GIu`X;he)RT6>RjZ6#y7|8wFOoIC?fuVl*W?<35c+m2(^aiQLFbt zm0sB7ykkrcwe8vtp8`dDZqs5S!%$0#uETIb{AHby3(|{MbNU}igs&vR3OJklcETf> zjq;Rm3N125j-fM=5&=21h>gjkrbX#z#Sb@>Td_@Y_CFRD7f~6|3Q3z`1dHmkmnBk5 zqx45)!xZUm_Lh3<^_4%slkk=#DNvK(f6qDiNbEqQL*Ii-r8@2_GrjK)22x!K<*yxQ zl3}#(vQ@k8IzxP z`vV<9RgM|dBz`k0sQj#8`PwL;V@Qetkw!E&3>bBHV zp3#!dKGyveh8?P!=6J!I6%SLtR`UoNO%BTodj3v0CPEgd$d76Dm<$3aaw1hm?%AWyn-MVk_$-_-B~k z+fG9bAHhVVJ@Vw8(klXmd%9h|)lRyg!f209uw+4CemqDR$u5m zCur4EVs=JD2D7@nz$qWcD(&XtFi|*HTD&@wB8X|m(Mnr(WSQIfUN?UCn3I!yF(kX& zb*@X$y084RIc0}ghFt57d%HsNQ^tJ+ikE+T$R?5X>Am|(i@P^Ar6_MUBjbZOCRb^8 zab|=`Roj+$Ub4doN<$Ymc*$SK(l`7L=7%Ykmq=^W?u(5vrEw7!EVFIKFhp;mkL$xqj#DaCO&Q0 z73~O~17-LY9adOP`D7bCA9^Y(s23l5xbde#Vz}Q}GG4s4%6omfWDAYg{6wR?1Ye}{ zcy6s*n%JhXW=+f5yOwp*Yc8q+K6MZ!lx@dg)2FY$Kv9mJdt`cZzWqdEU5nYnLA!3p z!SgZx+o?}}dTiAnAS&WuSMhLfn^$%Pj?J!>^SHW6Z1A!DnwEt#rBAt)Le$e=(6)c= zz6pz*dZ!x|bi1<*-HJz&^L;AW-3!d>_8LcCUFvx7wgB#ga3ZP3>6Xhtkb=}+eU2&k zm{jqRw=cKeuHlQYr9oLm(F=vv#LZR`<;0yo4Vj+_rfzcnsBFv zFWXD33)fD}Fs>7{=*%%&GQ}n_>bIJG4pvK^br>rWJIU{pHk=Y5(tgyXpOr)bt4rUV zG2_$7q=<1}brh-PV=06sv3kq%Q+oMhS(wRZDTT8dt!_(W8G@>F<6UJHtd{%Qvn^xf zF8FhnI7rE-Yvx$#T?!EEH7{P7<-snYTU+G16yjRsFx5vJKTX8>oVis~c5=SwUKxCN zjeNe@H{;WJ^W%`fhJUMB22(N`t{9iwRnha^A8){AJ{;rzErLW9AMIq?ib*N_jTDCi zS6<0cI2DI4Xl9x1o$Yp>z|G1_j5R$?|9}D`Ej&*b^$ll;5 zt#|D|CH8Rd@wmi{8Bsz8jnw>&S!*hJLV`VMu{k?LBA3r+i-i4n!F%KLE%T3r#G31! z;N6^ATU{x8|Liy>n~GJ0SIcQAR)xexPT8-F54Rn7X6$q4!^!yJZ@bJNNr=jvF*{xfv`z2C$MJ)BU%v#h#2o zMy0wl_<_&4XK^Hjy-zt6^7sj}GyP z_rW)7V29hSZ$^fT*nFvPKW^=(Nu?-k=L&HKuItG=0|poDJFP3*6K)425hGV#T?nL( zk8yJ{e}D>$kt_HSDD(Jt6cD&A9JdxhNZ7Lw)`x+X*% z+qLi$H<4{G3!-MtWpi%)iP6o^_Xm~*h<1m`8AOO#>$l11mzY5A`cP`JWjpozxR)yV z6@lzA-rW{?Lvezxi__^ht@Smi3gDUPy?}z77{b>f>M}oRHAP@*aoZo?JTu;v|8b@- zH_E;{cee8ZSM>F3*&nw>IB@uEn`_6Uv^R1^*<8!{^3p#snX$|wPdc%PW7eUlo?h%1&-g+QZ}lU+LiIneqEDI*Z)T zA-GwHiP!D;$1qq|Kb&tKF#u`Q1%edxcCOE>EsUEC$}+kRT2_z2#-WN zk8?lcZTWIn?$l(Z^s3N4*XfV=_>|m%aI>8n!aVXF7*dgIn6$fFR-yaaYHwQQe(b=P z-{#6wHH+O=Oy?rO8?3kUPMx`3SKc;MZ}3_%$7jRQoM{QiB=3DBF`mOql?`2t=y02L zwH8$=A>oeoqSgw2C@#VW0{qFP+Dg(JpdouQfRH{kW#feg7?x4_5b7IZ)|LkaZHJrE z@3LAJSc^e4&Y-P75@FWxW_!`<;)ot3zP3Fn;gc#|n+u(0s)tb$Zab7#(EL}WhLLfB zGVQ||S2^{m(R(yfVQc|G<52f!@XBVrY=O&k`AAXW^4A)@rLpXkVPWvWf!YGw<=m`p z?4403m7kbV)4s=D)Hu@m{8&iZ%}OKsP5###^Ho!**ygJg+;;O9 zPB)z2ew5_UAMkz_${=d%MC}!Px6_EB&ILAGWjZybAgH4cLl9e7<=FVi`nIjlAgPQ- zy5O~9WY}yO`>G&iJi$cIdQnqJHS&ucln){Mw4r$^`+YmxQ(`yD^w;cijiJXZ`h(lt z+OOl?lY^no$*b$7B;`Quv*TP#rj=~=xTs?-U-WnFyRTHMZ#CNM%T6sMIKR3y;mh2k z3H8UBNQ-7D)_A`##y^z{6XeA1CUKLO>T{%oGiJYzn~bGtS|R6q-LRDWFI-vQA>r|OkR`>j{+QxY)MPq}-ui&xBZpr|jysb^fS zE+=7@EeX)Zz-|V3XgfFD#dr=-Hqj&`6)g_;=8YuRKsM3t%Cn_pcbWX%{25w!+l ziZ3n%?yu!5eE+S?mxhK(*Ts4)+Bn+r2(;??AM5_C(c15DMLXzU>N?MayTc)0p5Jqq zvUI|IZHf1NbJ)zvguC?eOp1Hb;zf7@Q|0t+t5BF4{Ek;qRgWG17A#V6$;5iM4%H+9 zU&Ej81!Y9Kx-eF9UkqFP&ec(4X`W{qVHYm)$%p1I4r9xn8AtEcCrdXX)NB9Gp9T0W z9noueeaX-}3#w~D*zImrvT3`QYLbTV;_pFR3e?sI)MAAV-aWSZTE*oHe!C`ACg$UeDS-hmoZ0GgN7XE3+MP z$E=59Lw)qhd{k^j$j9^*&EMYL*0#E73%S>WiZq z&{FE^L3Jgm@)KbHF@oVQciH>|H2;JqN9HgeNh?aE=csq_T<@`;w?Ky48^Wu8P1Oou zq`Fd7_{28%8+#MA5hPH0Hfm_fK5V#YM)qYo9zfw*l&iHb0A=!p~@x-zi9)6Ab)i3PC4BLFR`KIbN*29ltB*} zPAps)h$w?IdCe{vzFqHQ8R{z2${}w?s3la_JA~>DcL*HPp3IrzYs=rtP<&6l_3>qT zskL7#>eu7}1*5(9dw_c2sjnC3;S#Z-y2!6mq|2t!s^JoscNw(=Z>D)imQZZXY&QTS zhn3p($t=OoF(7$w{9W5G^_)+(k`scsnSIi(TASflnS?!y=wMN%^AqY1a z3hNf1y(2~6vWsStc*7XE_9O#rsG`f&-UR_xeGKA7+Nf6Ko*d|LybcDQ`fVwnJ7^2m zZ7(Zov3^HjNR0P}Th4d7Jg2u^Ts%D#Mj zRVF#tIT%Z%{muoT@AJx8#EjuvsG&)8L5*@c_bo_|h5SYHeeJL6PJNU8(v@%j>I&fw zpiOtia+&M%p$22ojvx0FGn_yW-Pi@|yz5l@e3;rO3DNRNJ*qmwKLtI>A}HK_efK*Z z?O-p{$}pF=;M>TQ}GgmLsYfJG$t)-7U>}jgyeijuV+;=vs!y=y#?!~LViT>yJ zsH;m&5Y9oY^S5(f>L8`J3vsA(_ds2wY2=yL8YK3l4#8S$Xrx{Ab;C#TxtJ&P8a@z* zd9~aYKC9nKTs8gp@*HCYi;(`=ONzK~Q75?aGLi4?ph9RN&mWHV-;~6BTO6Xg3>a-D za;xXZ8`nkab>>*N6{|sc#(RLxQ{R&XB$jzh0G89`b; zf>OO6M0&%)oAccA0Udh2Y>A0%_naVGAP{XuNKDx1eOTg$X40NNgJR{BB&yHMhSl#h zle3!9_IVZN=pVHNgqD+hM<`xia;C`&PIilhBczivFq=qp3NUGm^A=M{F`AhmNuyh= z5~bZ7C+2AZF=(#3;g?ks7S@ty=Yby=R&=Q$FJ7 zAbwiSb=j+(YRR@F@lG?ASwgRG`U)d~aOVREDfWypj%Gfn+S-(g_Q{yo`G4qi~b zlW9-~32Lvn%@@Tbeu=S6C5K*bruB<@_)3Vui)?^en%zzrRzIzWUl}%!0Zi-wh+T%{ zRFwXkB*U5zmBJdHl!Dz^B)6sZLO_*l?>Ekc=dVusN_zncpPVI2RVKVgM6)^L0|XJP zioM2777v2f+~&*JjT*c4ucw?uv9cE`#ALp-@w^cqsIbK-i_D7_25Py-cp+o#1RJNC zP_+$%uQ&%!NKxJq7J1we^TK+iURFdEHE)C}g)%)8x_Mqij(_z*&>-}m?E1H`?ZOZO zc`vGEL^}>Vs|Rq+G%z%>18_*pnk(cG!?(o)$;@_3pMn%jYsw$1QLUImcwx9wDR=|G zU6~VsBY<(b-EVA3)CQnUwH2VK%UKs6CmgtAw4I1B{c(4u@)8QyF6R zIyL;}mFZl?4o5XD>vN2P7|1QNj#P^Xl&%F=hk4MWLV^y$c3vruC5 zQ8KDXJi)bRM@iUQ-0#JU5wJqo?_ul-QB{+#{IqstUUMr0S7iV!ub90~Wj&TV7#+Z; zlqF5RZEe0%I>fa*Ni#bYEWHeR)5Ki)$w_hYQ7lqm>L=*Fy4=3f>*g|S&~RDOgVPDC73i^=+_g5>Y}zV-QSstC8Yd}BvdL9o)jdFBzZK(~|L zUHW4tAT-4NX@Sr@>Fz+NSqJJeHwFMvG*Ofbs!{3k=@f`9-TGddZT2&UUf}Jh8I`Ro z+!Xa2xLh82_YT_@?J_{~x?W!sD4f0qN%g|35Bu-D7ixQ2^f?J3Mu6_`s_6)EWslFF z8S4yM(+fluzcx z0sj5m;kx03a=K?N@pPo}T%W&yQDaY^K~CmwygpnPo*I)dZAjsz5A>1V|E+F*n9*Y~AepW%^!rnKQ1+m6VE@6mA{!wZ_XXV#}1)}Z>m9!5y@kP$Nl#_iA$NP&3^N%TFm_?~q;F0vdPd6gqhW{O1i| zpk?k%e>aR6pBw1nitD77lutRg8HRd)tCKGNlyB)eqS*@*4fXL1vp?f^Eqqf<@{J+K z4QDLHW3=(HwiDfj>b%BLwyI*#XA zUl~XPSjMgU?rIs(S_WFp5Y>F45>o9fvKeX^ZKGu3=UtE@AGCn6v!C(e^bmbCRE~d4 zAi_sFt+w!lG0l1!zl8(9;wB-aPPr5i%^^czj}kEP(U_sA0a0j ztczhsGqCf85w+`4@Oc{K;Q$8BS>VBKuvAbyHmO2YLJ;i)`bv6&X>jSSsimqQE?-Nx zZxOwK_nKe3k_|Y}_eR*|{QuxIls|5To1XH=s@+0Zh`AKLALdOCdNx+?>ZPs;PX`gTdpl%)7#}y(N zz*QUFD-TCeeCckZSZ>midqx&90kk>I7MVB_&i+|%a>PDSEv z(ls*lrYL>c-5lB|0Z}|S3O#Et``Y}4Hv0?vtj{7M<`pTDag1vzK<3(6b4jW7>4BuYwMv^*KNU&kxC2VQYlPa!zAPXoQSQ=k?PJo6gsRXSs}-U} zADjNb559E8!Ss8=2jZLI?35^Tp&C%daNDQUVF{o4Y{nkc7wti;0sD=&*@^T=50K5l zSCrZZhm1j&!zV$1{-{spa5AFuP-+lyZ5hVCAEG3T=|2r8i$(E~KVsQ=j&R9RxN#7$ z*1CtkW5aC`-$E=m$%vrX0%JkbHMTA0LamHyRNuOwA^elHS$Ej>GUj=Rovzltf^nBo-F{z=X%R5#V%%b zgV88aT}YXM>kScy=A{Jyp6XToaag^_bhs%2Pl9OTbogy5+$7OXU|$*5N%VMZDTS%J zs`kNEW3@;Z#)?unlP~+rOo+JF8s?A@cn|kF`VF#Ws81d$zi}h-Zp%|V z&^!!YR57z;LYk;oMzOY9MT%>~4fOhHwg+Mp|MAzhaP55ILMM!F10cC973c`YF)?6- z-z&ZLO}b{byvi7Es?NY?#J#eDIos2*1(?y(J_2NK^c#Zz3t+s9cXpco@?=~0uzaL5 z!V{tBNKd#a%tPL<&&)3`h*gJSy|cr7uWwDXJ>aiiFc!?tJKxmC5FZUujw0^;;4#fC9R zu+=-awWrS}#h*X#&08k1(bTdtk(*WBfk^Pe?(TJ}U?L3_O0+J3@pG;g;%0!LVr}CIwG;SaqUOq!*9&|+FzdYH=RS| zzFwG^@;mDk+$_K-sZs?IPIm*hNc(m{?xvjUyz=$_LDMW6C}Y@F#^J=eCZHn1IZUH8 z0`;$fQgw5*$x$*UcL~ITD}{MSgmN*aCAoK|MVAID5~H?-Q=6@7mMmXh5*VWecv1pk zeVY9Lo0G;Ak0Y31b|t;Nx7`;)QtIdk+}cc$Nd}4ns-*m5e;%JN!#=HjpK_T$h{Jr-v~GHs$P;m77K-l{w^>9IDyP-zVklEWwM-jE za%H-alf2Ya)nx$aHM?P?@K{p1dji;A6jQD|Nl;%%N8YaHKCH_Ja#5h{wv(y3=I5Q$ z&*3jZgk>HnQSwjn(ks*L6DR|v0`BNLZyzZy>iG2&Vnm;4^?|G_ayCDYXB?_;XT}@2 zOpVN2bmF$ddsNj8g9Yu!I|U(W`Yj#X)}zmUlR`*-6r0&+sRvQFHm6eUl>~ z&sH#+UQ=D9sYAvejuacuTu($DHoX?_;ib#HL9kh`=Co z5;ASbC`wcrJ*re{1X_(QhWO$xh>hzsW}_A6=k3rtT%IlWP>EGkp_(SxcSFxq3Ml

wc?1M`GZ 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 |Sa*w9Rq?_3W%VrQcY0K= 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


DMC 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%0AeShxR?4Aq^zV25UYKlFLH0Y7Hs0u& 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 H4j2CiisS`8 literal 0 HcmV?d00001 diff --git a/doc/14_GICv2_driver.drawio b/doc/14_GICv2_driver.drawio new file mode 100644 index 00000000..3b77ec10 --- /dev/null +++ b/doc/14_GICv2_driver.drawio @@ -0,0 +1 @@ +7VpbU+M2FP41mWk7k4zvIY9xLiy7pUsJ3YUnRrEVW0WxjKyQ0F9fyZYd2xIQsoSGtkwGpCP5SDrfdy5y6Nij5eaUgjQ+JyHEHcsINx173LEs07GsjvgY4WMhcQzHKSQRRaGctRXM0F9QCg0pXaEQZo2JjBDMUNoUBiRJYMAaMkApWTenLQhurpqCCCqCWQCwKv2OQhYX0kFd/gmiKJYrnxhy33MQ3EWUrBK5XMeyF/lPMbwEpSo5P4tBSNYNEdywKUmYPMAf81XCVlx8ThLScScxY8IEw4415Z+FmNiLCIkwBCnKegFZcnGQ8SnTBVgiLAAodfi5Dr6IPenYI0oIK1rLzQhiAWAJTbGT6ROjlQ0oTNguD3y//zz71p88kMmXL5dfL9w/v9rrrtTyAPAKlrbKLcIeSxByO0KhxOjY/jpGDM5SEIjRNecdl8VsiXnP5E1himn7xIXVbD9jlNzBEcGE8tGEJFyHrx6j3BOkDG5qInmsU0iWkNFHPkXyumtbJfLrOk2kLK5RxHGlEEhko0rb1nS8Ia2nt6Tv3t+Mxz48iR1zlIDhOJ586zo7mJLzLBVN4QiQSnPN5LgwX8YNi5LoiqRCIOzNwLykvumZhaDivCNnXJAMMUQSLsJwwVqQIIxLm3NHgGbowr6CBh8ZeH0beC+B+CN4yVHblqap8DM9FT/L1eBXAf32+FkKfnATwLSw65B/QPaYBDHlZlhlCrT86C27a9leB0OKAEaRQC7gBs1JIQyJeBAcyoElCkOxjNb3mt7Z5tPBkXSMNpKuiqTpnOiQPBSQrsYRPSzQSRuYefcrEXv9JaARyjHm7Eo3/HduHKOQd5lwRjHm1MYE3F2JnBiT4FU6eSuSf/OVUU0AlgI4rPauKECsEjWnN7Rxu6D2CnOqSErB2eXv5yDhyZLWFMzb07ksbcv2MlgRgiqLPWUSdcO6HcRUbKGsTEpd5tNqD7NlMZfCCGUc5dsYJNwh6U+9Xu9n3WnEZJiAOYaNKe9nYDG32ORtCpOQZ5RbRO+zf3A3KUUJ0xquuY9WVG2HwtwXq4gpcx3hsxY4r99EeC3DYMEZ03opDNZCdjOYVlWh6PCSDgWyjcEcYr+qMVvxvIj7VdJ+iyjruu0oq6l3LMNVo6z5FmH27Az6VhJ3N5/TeXT5EFy709kuleOPlTt7VjsvZzzF8Bp4nsTipJXwrIGmdOl7mtLF7B8KCrVymWdpUbP88u8pVN4YNk2d4lk9jQsdzIOcI6xTqqrg9Gw0fm21cBS5ussHeMEzAwv42wrjX0lw16yyZjFnTXgJo0xfXO1Wlxxq6z5I7qrdHV2CbN0lFwvoBYESQvhI2B/MDeNtfNcz+23n1aY/TcwdHMp3dXeMFjS88BqKd2C8FyKwJEl4FQtu+HxgmsOQm5T3JBKW84pUBjeIXctgKto3os3DV9Ebb2pD48eyk/CjX1fr8k7tKdHdPpb3yueKo8FQeVmn1DQZWdEAvhTzVKTrl8Uyd1KIAUMPzTV1QEp1F4SXmLWiqd9mzUlZRpVKit3K5+pvzlqqXPdFVYw7OGSKqpxb1Tn3p5t35Kli9GFTxf/xVom3g+MLt/1jCbfmPuG26rx7uPU+Yri13zPc6l8hvo5vcyyKTNsPQRbnNxyzQTujQbvc/1u0qznycDByJn49wVcsu6mTTMu45ylc0XHLwJt6MfAsHTXsK0B4zoyulsrvwkdHJVF/Tz46pnJ5bH8LceD0b6o3/OPK/w/WhywASt1ZCpLG/TFBbMYAg+rt8VPxCvNKvN198uV8Xd+u18r/YKGhCfQnO1Yae3yNy7vbL9sLz9z+24Q9+Rs= \ No newline at end of file diff --git a/doc/14_GICv2_driver.png b/doc/14_GICv2_driver.png new file mode 100644 index 0000000000000000000000000000000000000000..5fca9042e07eca8ca39ea28bc6713d10cd0ee6bc GIT binary patch literal 258574 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

wc?1M`GZ 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 |Sa*w9Rq?_3W%VrQcY0K= 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

8{nhgY3*Zy&{>lW{bdOR+00s# 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%0DRnSupQbOTh}>2H@!M3H*=bp;RV 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 \ No newline at end of file diff --git a/doc/14_header.png b/doc/14_header.png new file mode 100644 index 0000000000000000000000000000000000000000..1aaf24f7501820c9be04f04d0631365ca77bc90f GIT binary patch literal 295219 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 xr5N0nd{ z!66Wsef#d^8I3jT$JHMimWt!QYZdmNjCUF}ETHa~FMi}?s5-<~?88hN{HQ2F#gVL| zS7uD6p-V?X|rOh^T0e)df95pBLi{N-$_KV*0*(b-+;A&D2S;y-X zc!*5$;OX4n+D97#=7m4_$0kS3X>ceYxJ>r=LOOF?`f*iIC0?czk_&~VCA{#O=NGJ) zf_IT#e=NRvinN2y23|mMn|J#x=+sSJ+@1EY$kd2$^6QBLVvYGPW?%~_e7Jg9vSaxt zcjPKu$2YrI>#lwPxs(4ZNq8yAD~-HZ&N1H>Otwc5Vqq#w`xrNu0r>+3Y|CHRUSCbV zj+8(DM?qLmpcIk&1I7JWV=Z*`_etQ1!;G3mJmz75G*EAZvhh5r!BQXq+=&5GTfJP!kIs|wM zB8685e?4S#yglibTn&W+j=A~KEEYZzuD(~y`Q>cM5l*7BMYKnjNPnnx!lPe)4~~te z_jvkhb{|Eq?CKphl%Kt4V{! zbbM(*)guf+Dm{0r@F?R=TquAT++pOlHS+9Btb->gGK#J;=J+F{&$#w=!C?dm?dq>b z{h>dy?JVzgEVcLh)AfJj+^o!6acYleHV8y5NZ=8R*%s+A=WDGF-(yEg^9nQA*mYVeq zc?j8SK5^U@h(JGro-D!1(8BCAI;$GOSXDC zXf7Lk{XRC@m1k#YJ0Xo=@3_;rLjm%HrS827EgJGFzTuc(scAWt8tOqxl_DF|F5-_5 zbLJ4$MFt1zuC1h4V7f_vb_eUt{? zTI!ONv%kgz7n&GN<(BI;R_e`=`;>}NoWD`HhXtzqvZs&YN{0eion$aQt5_pG#Aw9l zTlZ8ybrhftG=OJtKCU;;t+zv{-_O;PQ zqHF-oae&2vo8vE>l*SYzl|A#eLCHlN=jP)>JK|1X2*#pxZ6Fl9w*I0|hJyL>0jU2> z*3p0h=JheK%`OKAyh3;7g_^^CKPdE$qb3nifk}*KR8nxA@4|4=pQ7)gnuS~k6v*

Q`%lAXO{Rw-}5>Ez(<64Tli)uw^1t2#*3_bt5 zAM%GL8MG9eu0VCB+XbJFWOnYs%|NJq2A=S?b~xgRUak^SUAK+q5eoILBIK}KnPjDx zxXw|Ou-wd?r>JHj#4rWxf!GTu%wxD1#Te$cr^r88|v{C*RLiS)=)QkO8^B&5)fHss5a!N z;qZi>3rj%%Ku&aGaG)qwu88X92h?PkI0_X;QONvbTzN!@Qy44YD%N5m0NZ{hdEF>% zzlFg~DCxES1_&C)uU7$rk~ki6)D))yTc?$aQHD{?dzjG6_|`d8EA%J`b}&ppw^90G z$8qzW12Sv0TB3jov6~(9Szz#_Q-@Hy^ZU2ofBe&aNdTEh*K(kpCkABAMp;nb2DdwZ zVod>IY%yvI9BGCa0I^22#NR_9T^FH2vC@O6PqJn}>BA{|qpT7Bo z!o|7Mux9NR3Y~Wkz+sn_ zU~t{59B{+>KaYhu0y|?d@|2Sdw=pk{gUAWhf%MhiGs}Q{J>O&_hFY^o2stL+v5&c{ z3G6$oSdG;_jeW?gi;RXU54O%&0poGIzdHMSGy=k2P@X=PwgDcvmKYWQH&Oq-C~i@7 zA|Vo(`ucjX&(8@it=kf(6Dc2UVK@v2te|Yf|2hh`U#391CfiX9AeaRp`k$i5cFoU* zR#RoZ;#;;|4XRyR(;FPcEuNqlNg%Vgrg|x;B)%h}*Rn$2<_MsS5WDNRd*nV9= zQ}&B^fF(D_oCDRDFd6XNC>2=`^$0hn2~mf&**ip|oACighY7!N;E+N{sxJ>D{5gVo z)1Saj?~9_lz<|nlDudZZ4 zb)E!?QXWYqd+|5Kt|Af8*O#jpYHs7$Lf#dYizj1o3DuWS0V#TJci$VgaUpoH+?{?g z=w_5Kt4c*RRMEl>m<%k?Xfan0#gKpR2Sxz4d~)Fab=0)%c_3SsZFJEx{xLvu!s8|s z&&3UBPdY!FmUndZ7s;Ag<|Me1g!gAwLuY)3VCjcm33u0Y77*+e_09b}I^V=CV7FaPw1Akgp(fuYi7FKDw92!i@q z^JVn#OfdZ2{s1U`jB5DjV)1xv(e&~S=9d}|nL^3Fnk*oW@j@;XHc>q`#tvZw1O#cG zk;eU$uL-+(|7y!)-29kp$nc{9mZ;%35se!j%|}KEx61hnqmc%?(T_^BEHdaAdwp-uD|a_@kLz zQB7^Hw6t{H7at#=g0eCx2U4ajOopk2ZkNN-&Z4><1@Ns23=W~d9|G{B)6$qwZi1^w z2cXA^SOrDwFvu(e-L^FDV|gf<^-r4Npc-u3G$qd#j6Ow>lxn>X)pr}_E&v#15PlK2 zgXfrm3XFy+P|fmV0G1@FLpT|WY?>j^W-AeD8HA(8{xk%i zqD(*GqX>mSLtoZFvwdh_UNZtat5*j= zv2EPv6hMA`!_^ra@$1XMX6FP&qncqZ0dHPnFF=DQq6yNWp99wq*f0MFphe3ze-*`5 zEYK|NLkLt#{M}T64FGX+r;tEVI;I_=>#!7d6l?^96{o;XJMsE9sS7BDM9hIn0A@=ZTNF`=77=;~Tnjryl{uAIRd2kUq z;QHbZG3fT$q^-**RfNU%%c7R`uP8$y10}Xxw*~N{{wp#FyBcm=vw))50T2Okws)xi zd4P?LtwCZ8atUuxW}7BE?BC}P#%Ry&BQm^ARR(H!oc7s-gVfb>7mnzmeiF<-y^l{A zMd3MM=gi0&ZO8E=iVQaawMQ&dqJ~7&PkTV>aUV?aKo5TdhW}p0%Z(Zy)nj8Ye6uk$ z3IA(nVX<{kqZ3jsNb;um^Ed^+!p#8M_Frz?&s^9Ux9loL7vzkeLCQtkwkrUG-ZC~s z$^~!YUE~%Jhnl1^PR77bqeL-rac<$^;Raph<>j|^bixG*DYn=!`TEc;thNO$c0FM} zzQ2;uk)auoP4z7*-Y8)&5@HGzn)@&oWlO-64q(u=_`lFVi6T10hHmBWbwm-yGgcra zd*UOw1wh{-n1!N+Zx^bstH^l(us-?PF4d^YhNebMUHFmWoppUdGckG(;X+t^bYFoXB-~UrB$A?Oqyc1~B^zqc53+PSJA;;c z8L6%|!Yc+)#N$%rk*((%sMd(pZ-#GbSFZ8}Nd)QQ3b2fXmloaBvTQ1OTh5_HOa)@J z_wBO z-UUM``lJ6{RAf#QVt@U|H!Ugb3?i(Xhr#v%eSLiiiHWbuCj#zo8Jq(VrO9VK#ePde z*Zfl;O2ZObP~laK(2jCmP2?h2miI^Igc7g?aIY#@%olEd zy#2H1CI}VcK>+>Bpmlw3GNTXx@nsP7IvvM%ZBbZn08>h-Mek5^9+U(>_~gA7 z+;DU?!65xzQg3ecZ_mLJ&#{G}Q6$p22D4-k{U#9jW1bt_u{4xBh8Y5N9cB3OFVv)T z@-Z;Qr&vof9KyixU;>OVZq19V4+m4pp3^5K4>(g97Ts}M0fx(9*u^N1fXdz3`{SNGE+-bLk?ik@|a_u zINj`;-wil+r&dN`07xwp;>N?pwM=MC=_AHcif6PBZW4?*!t=r?Ons1rMwxGzP?5HO zHUjfMAY3rnf&v*+0hs47eB6UVN z^HgHgggU@--nER8C|;tw0ECHGE|0^=4c_!Q&dh@gfpx4YnN$TA}rc zc+`@pBb|;2BAyXQE&j5DN|jx(yoGhK?$@^@^*2RLN3aedQ)s9XMq9`;CA zy&%gkzF@v$2%s#xi^Dvdsne8I@ur|kxacBE0_C8P$Vur=>ba(aHjbmSt6WJO$da_# zI_>mk&sZQ~mM!PD^hC?S&z(;@u7+u_41TSWg5kRf##SZ-yY{Y)*4J6~A93aH7mMG= z$Qq~`@M$|jJtExr<#{u~_jg@vQ&dJ#4iWi|T(U8r)c%WWUE)W`x3_2oNH1gj7+ zH>wN93N&tOm0S5P)Rownll6JuY3$Jv&Hnk=wA>@>CmdVi5ST}ZXd{C`1~h;LU9|WS zqJ#P2por)1Q$rlqMA0;hjIJgEB%8m}t@8kq6u1J+pA4(OEx}A8q&@6Qj$K6;jPj7X zW`c zd<$vnvzfn^doq`%!Sr;`1-QQx*>x*`etY&jk zg8gE|d=!yaVi4-2sAqkI#C9-;2|#sw3XCO~6`IRMzdLsx@J>gK;UCZB6zG4iCtK}h zxos@g#nFIgslrD`tDg?xm74f`nZ|KKjl9)0S#C1d;l`GsKUfHuAK=ytu)Qlxt%Q*H zUgG7(wbfa(iEvZj-MxohThgnG&B{H}&bOWp2c(7wVn|k=%L&BjgReE_`V_Fh?gp~+ z;Lt2022hz92PI(d>GWH$^pOa=&*8hS5ku}_XqP*8b&1k0)+Bq1?&Ccf;5b=Y)EK^P zoryz?Vc$}h;_dMX+(1827dNpYK)(RL-^WB3OOq_{cUt;83ao4qc?E;-_xTKs-b%xq ztXy8mcg<}u4BiXl^;`&!-;w_7XV};td3$?T$PV&sAOnL_;_T01F#>mgB2ed(0zHbJ zYQdUX4M12K zUFaOu5{(=+A22z9=E z666KFmoK(GdN#U0^6Nr4Vc@D$XFw@n1QA>xK}JHK)qh8@W$SVSdxmicn&|vEAbwl~ zZK)^#n73q@DK28sq6-W1_buCqV~5be1b_MUeE__p?3j9h??%U+9bo9uNka>kmTq}u zX89yQd}Z4WYCQZ5*u1`PMEyV#TOvbS4<3?1BR5|3sh8M#s*nK3ggmxb68d)!{%_m^ zY_>X5Oh~x|s(BS$6+e2zQEfLu3qbbGKw^ejYf+3Mng@Y+ZU>BFNe_wU59;b-g~%4e z_atx(z4;+T^JReM`*~+Qp?N35o!goyvCOm1(nw$Q0qccrRrFW_RE3b1#pp9jkSrl4 zFlXjcG#|pgUm^E{wIG6LKOTNPQOw@_zFFOsc;}hu>r-i~6X9JWoEkUPNDg3au3SVTA? zWi)jG3g3@=*3G~+U>55heF|tK;0JD-YLzl%BifcUA%X{qpUp+wL>Y|O#kwKcGVQIN zAmSL2nWLfEMuN^XBTN(=>y2nz&1!(qWIYgiP!S}(rdbPE7Vn|;Mz-El#Pkc5*@rd# zQ0p5J1NVjk+-#9G7-EIG1uNvxi7blXQJI_-PQq$+kwh4BU0tDt;!Y%oiLjXqH86IU z;$h63No7Q3lLNC;VF$NBJn|IIDzH8w&+9wTYLPwCBW)qg#7BPr%?ty z#U%%<)z|g>0<`^^#_5HX>&Woye|!~(-3?afA;QC-+5LLDqHe0ne*9e-jF*ODX3q3&ZeeN2H9MEZ|iU^)>UnIstg3^;4aD6`s z0{1$1{kp(K*0;_Uuz16?IVN1(71Red!y*45OsDms1-m{!gnKeqp8js8uL@dof;a>n zVunHGpTK_5dnn*CZZNzE_lR&}jX6pfM&)e{vTDGu3?Qnq9F_Zb9(b<)yG+U^aO+TF zYyi>Cqd8?bbO2LelU4qML9?;8!$7Qt%lN0T$Kiele!z1t^JTYkIbv5_x9=lFt`vAt zZsxNNf&CI4>BEEz@Vo$L-iJvSn@($W3}|~Zr&;7LSR?+McR1o=0yil-=3Uu(XHLS6 z1DV0E>p>unf-9n%2wwng*w;eMh&#kUU%tT10J2(%vG`$60Q)AtGZoizs~%>50l$mX zq;5dG6E>3ib&D7f#yOAu{cf**#loV z7JFaATpwT)e;<1%0>aC4#r8@37K|YfOi6FoKeK+W@y9U&3+UmrZ9yM#An%3&n6ojS za=?lgVb^yX2WVmajSQg0zS*i$90_bW{Qu)bJ|D?cnl;hJ9SdQU;mh68m`vD*7szdw z_7!uiEdGGx;eCl}0pW4GWeOte{#%0ZmfHqfr~HS*tyxe6{T2vo z{cmu#{xv{PX)5!&xBvI-3eD#TLa>4!4XP$7=HR*VnW=^6&gS;Xj5OJ&jfC{CzY!Ol zOfN_j@DarwF`n9Tw)_@6RTF1^PV6>|4CC_(k1zi`(?Qgc*_UMvv^f@jKY zR+bpYX!r3=ODY9bqJn|1foC_<%5*?=dbbHjA|eYTPIj+v{6<9I^a%^^A86V&`uND)d>q zB8dO06hs1H?gGtGnvNdo56qlDjt*F%@>?*o1W3&&v&!?0SBQn-kxk?#OasjW#9c$i z&<6g|P87caaWE;so{6wz4pe(q{o8~ot>Gz}MM!dym1HO@|iQQ5&3 zX#Ki3K@eHqG-95l^-cFIw#2;h7GB7$en{J9*^zv>W7{oBEpMz6MzHz919*`u){Jx$ z&UM_p$jP_IOF!XRJ{%sLajf00q^&DyZE11vljC-{FlzDp!YDZVAXf%L55rJf4nN<* z{RNZDAKKjDA#{J=-_wcw!_5llT9XP;*styA{8m}9p}Y{-{(}a>dOy>t@Ji3WBX9VE z|6*gqI{7bXL;g`dyc~4UW~`O>j4qT~B!UBS|2%)s8`!>}~UzAvs+<4&uVVfk zE?O6QNW!wh*&akvY`Mav1jbW%8oWok1+>!u&gQis3?K00&_Eayu+N5~8yx!W;jJ6! z5+L5BDLAp0M>4?;8NOJ17%K|G5hhe2_=5@InD6)fkPo7u4n2jU)=`CMJfAq$e}Ttp zs{aEqk9VJ_cQY4Y;}+n*Bt-guGX3XH1&%+EX3fx6uBa8KJqqtWDT|v&ZKyR zT&1}=v9brt<04VOwNY;;5Du<+2!B&OZNSna3s?r|d7pBvsVzxSC~o&C&Dc-WR0PWR%&cy3^A z3_ScC#F&`c{f7~a7(X{Euy=3=E`qWr7Bj^11d@0%XiWBpgm?<_X7ieD$iB_nn`d}WcOd&_n5ZrW=b>(uA+g?W2fQ4-Mu>kzLVi()@v|4aIXSb zord64ctpxNxvC)kl<|!YnG|8m!p~iAy*!6>&!V$R*dfwoNrp83!@Gl|lq!}#T)`1m z2pR}sF$SJ0gyDuW);&{fDzdxu?mrS)aQ9RWf~jP($Jzl&%gLt$?74Fi|Is)L32u{M zecG)Vp*7y%$#uW_BMl{A89AR>KkG-Gk+DBU8dv<;80GT*>Chu5lJB7pI*B9!&cCYy zv5Mm?tg~1?jS->wb7vA}FVw#*IZEltGiD&;e+qZyScDlC6>Fs&h+RNu2lQ&)xo$9r zT*i3YuBy#9oaqRBV^eGw*`OHVhuxlaMnc61woV2ciN2Oz1Gz4$JyaqKSmpK}{`32; z`v-L(&P7V*7r$9Ep9W}56?-iQjeC(g08=JS1FImhoa_N;Kktn98iH(i_*?EeWBz_w zXaxM&s=j}~%l|W==0jl^O62zF6+>ZoP40_-`*Z}unFBKGLhn0rPASKB0~a=@`wt=l zQcJ+LAYc*2@u>om?w};2P~15a|`u`+2)ne|8Ro44v$C=tj$AXTOZ=i zZa@QnV59&OOa|{caG0n7Nz1*LWD`wA4xsQ zaDv@vGJXRWYy^hF-u}h>_q>mTGGsqsLhA5GlxuDYXGxV9U2N_f3kwK0_IEq5D-iJm z^!WK8DGwX#{D(AFWc{dAoDFmUIbtsu{Xa&IGP_&h@!_r;@%Ht}v+!o&S=D=84`q~3 zZ6vdOfY@zZka`sENr(UBUEtvp!Tu8|y5X`;Kft+UT%sG(`sJJox`fQk!*AZai8!%- zU$txx=ibf3rCy*3A5+r++(pAJH&9V|)A{gtklFV8Ew~49L@vXZL+1;wVmCEk1o{0! z%f_=82Ngi+%A5G(;_F|fz@Uk?;Xy9?_yG$VM%3@dW-0ysV&g$jDJJ(U`LRpFd;)D! zJm$KxF3m7Pz#5D4DGckZi!ci+)iHz%h_ab43L6&v3d682QS#E^nr^v(`4u!RYfA&q z!S&x0T!E|b??vDcc?vmN{I!!05pughR5B-@^HK%CuN$smHpkc$BSZvUv0xOf*Q%vDLKvkv4334kb6 zmuZ8w-@f}0?N#o%Qy&dNB>(Q z{1LD(TOQQ;e)TfY<&%) z9l3oDT~o9x-B!)jN6gK5dLQ4v=5t7U`R9GEy@}6dek;Czc&P=uJ(N^mXYBN1SaPSQ zRMH%6m3!aRJy*%@q`5h7`@D@?0OX&&V$&f1Ex zL8Q~&0zy;e?@>kI*|0{so=wTBIg&A>#{Gvof*`JyfXsEho2Pj2(u?-S;tUGSSmYMh z-y{MSUUS`!|LhO`7VmiYNr*Hh5gb|c*%cu^vDb{(st9-C@jnZo1o?G+QAk|A5C{;^+B zYEySA+p<50zrdKg?QHC&Z6=-(eivQy*R;lEJ55fl6+d@zY1Y;#`*yi3PX55h_X?qp zNl)`P&FQ~PCiVVy@v+gd&>A;wgBu6Pc9S)UChEkl4f9v8RXBC@3-wo2@ap|E3Lc)Z zSFiSR_^I697{J?~kvo;MbF&~o0x2Dyr!)cbUph+slles#1G&gVpk9Cg*)KWQXyvR> z#!&`~6VkfQjN&9mIUnUyckZ|28sz_7D@{aT_ls>*&yy|&lOo+v|2&q%h!B|-F;jX} zR~1Xf&yEY7Di=~Rm~|sa=kYz5i9u>hVC!kUP=JZ)>#aBrB2e5WkZ_fL`!O^O`>X5@ z30F%dhKu+CmYh|n3G$z8BQlds=2irP4cPn!!@FL`+us@R)La08MC2Sy?Cy4ay}(alIE-Hv`EavKEd`I|&u2z$ zvsp&-qqmyU4ekqkPY&-b4P?ypkXKQ}UpulU&b5+ymCI=H2G?rph32%OQwx(niKAKB z&CyMNNXX)?jKriqf?OZ8E+Jnz|NOK{Jo zsM(u<$MA$Fc1s@T0*cvTCR0D{(MoUK%E&lzVwqgjhM!Z)4vJ$;bN zZt=+lmfp;2nj}hPD}4s(TvhGVwVA)h`(C-Tc__K)^T>qQEkz_w57QHIbDMfPh`MD9 zd>xsSzV9X-<}j{zmt5YJAieNy@(shAQaKDMl~r6Zjf!r2ozI`;8^6jX={iN|r@Kyt zk59n%cI$Ht>|UodA_fusfGMIAcvTsP^wQZ9oJwdXdqYb4vM9>m%VREn%QDpXXxT3~ z#(jnOESYAY0K-V?VYP)i5{vQewv5_)!iow=zP^g5^mk(PG%+menWTf!EtEN|pX%L; z>3{M+pyQ+#e(UP?rAt(AZO5C=>{{ic>ko8@JHR3@|5W4ZH7QCq5#`XRKf$D%~u$z{4Amw zKGL2f?Ri9ysi~@(fl9;b(`#0x%THC6zw;i@yT@R*SYhz7?$^ErodWx$N*1NWue+`b zzuJB4#&itrx!%BS!@ccF{KltW_A^}7N|Eh9Md8Va$9h)Rw>n@(;N>)CxiPY_JeLd4#9WoX|aP(aG0&W#K-m3?5@S8p^^yZd&}T=sV)UsY;=k zcRTQVl#5CP*SX6pit(#)sWN?^5E9}Vvr(4m&5-=A7#nCOnWA;>*y6931-@>A2F>?; zmr9MMIwIxX(%)d}cyU+2oKs!Mvf=s#{D2fPajay#qyeNp;D7A|Rz3w_nfmyvV|XTw zL28pf^2N0$sDfK|^7IE-KI4AcW+iIf(r*^RjemykoENWGvl z6kNqF$z>cp|K@|GD1Jbgf$Z1&!WxUd$z$JJNBD`%J_QzE+DGF+FODB@>s#_h_4j3% zl1kX}g4_n0&LQ%$S~2lt{z}5#jA^IDG^6J1TCR($j#OXuEZ<11IxZLo7huMSW0aGw z4W0iO`0?GF%I2?i&m)b;emcwPe`W?jl=I4_UG{jjOla}l!0Ky5K@+X+a^))ImwmT^ z`k7VkVQR;B%*Dvj8f5@3xrQBDbvBsk$3zI#ZvYXu6 z1X!h+o-~c(t0_!YsH@gp(5pHvmsPy5uu{TI;QTsI+5CK{wJHa+FrT@9zCx*b7m-=R=-OD>1cjpyP-v~_} zHm(yfB2c{a%p)uCCKgdioLNtt_7Is(oOc1aGb{CqfG7UF!7i*7fSCt1!0P<-ub>Sj zua9N;PnYCemrRN{3>s2D1@Kvy9dWD*$asIfh1J64e#GTT|9JiVt>5A)OXqEiOUvqo zrPgw{hpV|i3WV(&#_w=mOR*YmQJP)ND3Q=M>WB&xXo$`m9{q;E#rPZxmz~M}^EVCk z)OmicAyO}%83SU-@x}ijhAzpv4u6l%aTHh+wXCtT=s&wZJWBo6nUfD#&4Pq1FEeRa z23oR%Xci$qLPE=X(nsCVm+V03$@p#Vk05iYLhz$a&Ia50D9q6WKfKag! z?3PVtrh8$8m^m%aIB3?bq-=5!(izsr8S{?{+9-_0xI{01a`LY_E-k#73&8s;F}(aq z?&%RwjeDP*wXE8sRafn3H^nR7vqz4=s;3&voU(^hs;B(EOGv5%YxUTgkYf=*op(!g zdFB~Vj2}4&m8t(psO&$FXYx7J?pvH8vt>TW6VEG0=YmviM`x+-V{m_jwN@>I{d0?Ow{n$Lx zsIe$tugYFX!ZnGjn-IYqW`G!^lGF9Omk{mtm>d~f?oud2e!Z#9^X2rr4|zMml9G5X zn-jR*Y$rZpp{lD`;aj;2HTzC(s0oE+`^)&M$tT0E%N^hKJnV#~8ZnNeTtyN=`uiAh zmfc(D_+PTFUHY&V#0S$pOqCf0R8zg8J-;>0@m z#pCs)E`lfUSaW|q_^$}?imOVJO-gIqysTvcmAbr0Zb06Zs%raO%WeL8P}uJB&9!VP z#IT$_`h&4Q(Er9{e>vMNpJ=+Gr<6%b(!~XyH2h4|Tq{gjHsh~_=SC^u?fA8oTNZs4 zXCCgRd}YY2@M?L1l`wj2n$fs@(tmk+im54WO)hK|YNSg}FiU-{*C{WDqSX{vS0ZHt zU&XpCv$_~{Fl5b+a1@&@2fOr+SXR9mX-bryHR645_U?;?&Zq8conQVUOQ9I`s=rhB z(<9NjfNx=G{C?<#;;AHEFHk!Y?E-dvlc7cLzlMv^OTS^MHEA|?0?S8p+PZPdt|f?kejG=^7FSU4h@>=;qN6OXEvvVtE06wGm8wNi-z}-4$wsNv zsU%4O*5hM8GSs-%R{hP@)|>`Rd7YQj101S&U-92E$(VjsUXjZmbR~~`+A?GGdF*6~ zr?JJa@%xuwEKPr`vv5u|a+6ujUhtTm=Cp!(+k7S_{bPZlb61S}$3=JbjU-iZ#Z9zk zOqGRGY20lko`wRGQXv_oe&?eRoi;ntcEaVTfM!Kxdvsi^d{eq@k?0dK{8r(TwU^^A z^Hu4zG|NkD1!Ch4-tif%-3}Sf?P=rl1?jS2k{ny~ofIT}H>aF)GdcFSj~c5OTas-@ zvx{c1(Xw$EVu8)l{$N`>BCPAkIN%fxNDH;`$eKC&dVt8x#A%mtOYV)EvFfKCR$EU@ zcDMlY@vlWF@b)Cp7%bSe9bT~RVN0~_py6dMR|?I`E7Q19JAd?m!LJ`49ZD}fxtsgF zwow^h9THu)2v@77Di(&LWZm4o$Y??Qq!MpH9p#vALTG9ywtyKUsX-Y zZME_S_(!kGpD}nqrQhlde}H0ioW^kT%y^44_t5vZ{>2LC-n`(qr9m{s>(e(H9?M<2 z)~YUQ#jj3Y`XjbV&~Ebma<)l|QB!8o9k7GH+ZLZASW2#;#*s98y z=GSkw8uy9WDfdF#97y?RqCYEq>+b1_1XHDFOWdpGdq4iXrFze$!`F!p6x{1-^3kcx ztWUIVp=?^}SD)g28VYD_R7mIQcDTtiMKKVdSXkTkbaZe&)F~D!kx6kGx1VgWUAqjMOHTrByERxC)k6cd7OSGlbJT??cYs#>SXv+ zpI1kCE%+8C226=p9EYY97FoPkg(iyH&I=uqG+%0>;Ewl}C_Y+gDe3AS!C-w1anpWK zfP{}bP=fu>$pEZJ$wEfnxlHBCmpsVwd}e6e@fTNBjb_P*H1V=$bCHMK&tuATd=9*< z8qJg{Se#Q~ec=47i)F!R!cl3iTzSE%h4RFc(+U~6*C+-j%}6p9+=jU9{cXNJA!qDu zQ@XA_Qg}9$q+l1*;d%Y`WN(4iOfNEmPuH#RCcwqfuKo6KvLK2gan>i;W5*@_K3~S2 zh((~smn_lr#YWaA*3h zoqv_=*f+eRgZguW;(?VI5<8t2FG&wX1vt&}TJ#&Iyf=JAb1n1Ip%%6J2g%hwjtm-3 zOAnXd6MuFXQELP@)yrEWHl^N^K}yE=tdh{YS%l7t-*UtgLpA~a3W@n?w$%$1dl&V; z874UR>?~WHy?4dL;$C&)dG=kq9(rx#HfScWo6IPwxcS}jXD{#NMBNXejpM^%8t2DG zF=LMqZ{q#6qOxz%R&at21xXGe-@o{GKApq4Lb*l_uYc6+skmC2-- zCF?+)Y?+=HB<&p+`BF#k@G}fjzfv)LTWR*ratlUq(a7r8nH={o}b@ly2fta$eOfG>&Ei6I-~7&)t(z3DqQSb^D=8|K0EJ9 zYb6@{r*R8~z2mC9;u1$)y@y~(CHW51Dv?>{r~cCGjQ5M%&nZO?I*~}EdFCAHND37U zmL=~zrJzhI#C4*N5`vz)Hqz=X1>|;12 z=oq8_O(CH>PsAYl4%y(32zPop?e(ko zroDM4jgO_XL+{G6$hmjbdH1}xMP{uEu38EEru`xpUuoRY)l?^BVy)^6!hq?9d z+Ew{#F z63rIOl9>L(AdwlG$o$4U?6&8ck9B zD;I3`cec(4_N9l>1Ocl&`f={z?*Jq=q~zxU^?sg$-YBrU z;czJR#9=n_&W5-(C40ek8Rw>i_BUbUbc_?a;uI}BKVs+oTg*w)8cU699y)!kzahP& zt&>|mJhN%&MhZ-)dtBy^*gqyX9QuW-{29@BIRqed4Z0ifWcLF%B#pba z7yqov4fQ{m%WaU_TjkBKPu2EpG{Zc0z63McJiIe*Q9v%_ZMw@*lVZ$Di&QcJkJG+O z+}0_iYEqm^NgEL#`2#h$vhUh_GD%}Lr&dsmO|x8mWfbScV9|3 zVQbNSh$oWyL}A0je?dgGqzLPRzDUM;cFmWhUF!lP%hWYmTZ<&U4mhjNM(c23uKQ}b z|H|C1j3Fj26NXnyBF<2AjxvN3sRJ=loLe}h$nj*SmxXq-Zm)RanJXQG?=LU8TAm_^r)9TywM^T>4;@6UKBW?1%d zP|C>#3K^f=N5g0J^`QG$;q;U(HU1dWPcYDap2?F8qnr`5eX>X4yD*rWp+uJ+?W5&d zO^Y9(&Rw(`?VsNNv}~f}Ijzq%@27{RB61P4Ioobhs$nXzY=XQ*r#~(*6mQ$wx5$>T zW42~iOMJ`v?W%(fY1bo;?wH~G>cgF9?&K!L;sM0Ne1v?|Nxi|5+s%pY;V!7)lnWuLUf`+mJV5#hxk zE7;C|?@rLpGTOV1mu|-F2?&XjG|8~+f5W0w^-A>78fA{pqEw$@9A~=~<%b7Su60ZC z>h8NpRw;f3&2(GFOY|&u(JzZF;#s`fHrGBf_{~(rbjrTo+~8V5CIR!J?+Ez2`o9F7 zY7M(4j~6{#D#hf@?sBY)9E*zzu9Ytmu6entxN@Yg;$@w_XbXSnT(gyBlvBL9WoKcN zCPq`nqONxoYRZ;j^7d&D`KhnbURn4m5%jbV7&DdpG?p=Qo)6jj3ypMYOsj`BN`-V@ z@A~VZN44VzZsVajxgN?Hk2I1+svPxc=kUgR34vO%z@UqP6oWYhl~X`z*L^avl(z1K zVdKmatcb5yt#_Ouf3W!a;kqgBmZ%PslaIub1{O8%>)Mw8?BLe>aI=S2%>4joHyOX} z=nFvyTfO-#lWs1%igUHv7!i7)w>Zh6=G(JIO}zu3wD3CO6s8l)`@#-QT{JlrWt^Ge zHgGw+IGP~+dB4l4wndvN(()_9;zPll;`@-`5}9z#t|=#-q4Yzc)S1Ph=@c%OoMTJiMoh=HA!qrs0dGfne6-5$*Y;%{FI`S@8EJLJ3Q;c+gwEr9*4;{6}%P4 zvm;a0!W#Q%g#x;Kceg3rt4!4J=x4*HXgioGS-$klPFka)UwW1I&ETQEf@5yOrmsu2 zA`Vx7BVa}tew+-m&sjr9SKq=JkHCa2Ko?mGJ|{gse+) z46^VIzWC-UvH0nf-f|DWQL?Mj)s^*EyGzIRZ=YoJYD1pI4;&wOJ?Pb2)aa%y!7$ii z8+GenS|Z`#9CgDZc=+4-npy z9y77hb34f<^L4N-CHUpnE|m`rMb!_bg}fqn3bNXJ#(&T5+jofj&K(JK2H_HL&R0espIpa zR-epA-k+W9&&@gHMo~_{BePl?l9an3*Wvkg&<{KpA(d>AAm`Q6J;A|J6wKu@wm;nh z)Yn{xQYe_D!xrbHGrrxD{J1}S`d76%2X-&Mxx8{EZJ_3gRmrz$v9=ix z*YhTsGFG;E(~ZyD^`=)RM<-2tzbsQp|-J@E)cGH$N$6NTFVWcG6?TK-FYRkA@!Vu zwN|}9{jC?=FC$0@3==HB4SXzCy?fCse&Bp$R_ETMLOcZpM2k)wPG6QTER7U_lqn{s z$E&Iwr)x`5$~)mGc3=Exv(=kj)M@M;zf#xooqf;ixtSl0kZZ3GRPFGezEIQle#Sv; zyn4{RU9S0@si`Ba0k8GYYsaaTMh?4X0&uaG_msFvxmr%yzVTXm&{*c0gcs>pWtVm7imN}*jPW7%0V2zUHvZXH>S{FRLi2Qb`XeC*!)}vpPj!BhEmDSw zX9_df*2j1q^VOPZ4(|0mwq1MSd53?=-B#1V$PR5q;n|g1Vc+-mDJt5XTGgdGKI(6} zj#KdQBa#7jFk-cDN?BS)1sno1XJ%rv&>WrDEqvAg-v@Vqe{lK*}6FnINIsbiHsnntB;2>!fdr2jD#6aP;V+#4g{p z1%V{@MV1F9e!fB`gB>nxcN|PqnODs_Sx2*^k(hMXMJnIw!hz+%obmdXZ0_w-bv}dS zx}X}l2?Ax)dh%EIGD_jMMgu@>c@uZs#)gxm50ih_!%SzqndgnGJM# zyjn%1Fr5+2=P^bq<2*y*(InhFW&ZJcblk#~zgC@Ed(U#{6!-4QJB^&p%1s|4O)$wR zZgaFL8aAY-oC^^#ezlE?jq`#q5@P%ga*Z|Rr++PC)t{zEqUwXPU_0&oHb5=u*q3YX z(cAYqo|pFC3(o1=V~1@!^vCW+T)5w;e(x~$ zhxyj{g5h?X(%Ma}elZQZvC?Cc@?Mm9OQBgSl?yzh7v>vCQoIrW z@T$fh7~*ThF5T6YAYHWS+MV&?SJ8!NGv?cR-;#+Ydo7>q=-(1vdp_%Uyjvu~%TSCw zax61m*Uh2f@$E3tcHvQbe!(ixW>l@agx20)@#AWbQ6}HnVK=PSv)ANZnW+j_>FA8f z*$&6>C)!~3oi2($MK+z>_`lkF>#(Z2Z&6r4MMV@7rNjai0hQP^sDOlkf^-Vf!UpNs zguH@)bV(yA($cj-QIMAI?(W*ezH_aO!uvblcb?yS?(==mx%cQFKAW}HtTDzMHOClJ zu=q-uiv5=@o1V_KswqbF#bwJ}e98%eFCqOKwc3t-7d}!pZC0XcC$%gK`@ZIjI(as^ z&qXb(8KNS>RP<#kfNN}dp@dTVtA8vv8G`(4%cUJ}`xo=NcxSLAAj$gy!5jDfWf$6LR&5{DO`^nll@2sYz*a z7^%|S$5t86<0F_?S)GjsNj;v=wdePkHk<97V)QsIW-1&w$hOLSox%_fQAFvRd<05x0cCJo-T7;pXZs~ zp~#O6F{(D4YWOCYyOyWAOokLP+z1jb#n9mA&b2C>zbztqqFLLX*_raAwP?c!f$$+*;#E7JyWAwd|iyy{KWF6gj+#9DB z47E;&86Mo}2)mA_(GC=Y)9(7$Pmk$Dh~g_Tvm_EhCqAXA!1Ohb0~JJ}D2@Se_+rAN z=?c^pBB_~zoO^_wAh5s+voIERlIzDszrOGr+mWc|t)y9=kA)-(0Tq$6`qRwAbRqo4 zO~frs;ab^z6ZWrL6U{cOxGh@z5GrH=iM_<3b}YUlwwyi_>P^kYO!$XA8zZ@ZFQ9S7 z$8(f-VpgtTNh5u*96v79U>lqRG$R8SYE3j$$QdnqWvcZ=&dkmc1>N>$4R7+js>tA%9^cE=gH%s7HtE_AYQBoFc^*~7a@WAvws}6| zRojf&YjZ}0`*q92xfm4qtW**k{a{Z%F4TlP~Y`}__)RAYB8&leTww; zJew378-=P)Xv+E&J{Lc}^i{=@OUpK2We*cyxCIY#>#Qo3gMKH?C_I3r56(Jk^(PlhAFdeXe0CTS@W5=OW(g2Hf2ipL z9ySu6wQ9+pGGSJ8KjkXxce~hXmVY}rj1iH3&^m>+l^HrLHu7Ctwa&;Bc!RzTD!3lu zbfX2Hb%Dp9U^u4J15sgc>jZo>CA5279(}zO1-!Tu3p%7GQQ@8D0e0M%a#`lDK02Xo z`LI>s4MUy(`xs;cX2)gj9p=?o6@4G0il%;pR>vZ8WG9fg#t!&XWDCs3gA-N7{e(@Q zW=pOtYH@>uAHVOH?86gPP?_H7=Rah%B({IF8rl~q_Df5Py6qt8L)Z{AGi$G{3o_nQ zCTHkm#UZ~p=4xz+0BvtLn^ds9K;`rdHL=L#U{sopZzRp;p<9N^E}5f6+S55BbRoy% zg`dlO*R@ZcT$-FKD11LlHcBVKjd?d7+V(m?=MZ~STN)D4+(UvIX%uDf6S!n|6BA#i zb2hAm@AYy#!k22-m9e02;N-%16D|t+DbvDPwFiRh4x zsTf}$qIW{3EyS$0L%bo^!2r0zxw1?v@A>lf9U8T_U+Mwj6J}SJN>~Cv-IeA92wbcD zJkoc;CBmZD>htWTM|5aG9HV&~K~v-qHXWnS=;?2rJ*7SAORE1?C6)0}QVLMiLPMu- zc6ukM`o@Q)u#{JNTMCVp0yJERT&wR>M`M%nn zClf|fn&?DRs(U3Y?Y8P?5n#UFA@Gp}+r!G3j)5Y@-3;r9DrXW!*XFV0zv?B7B(xn0 zX<{8?+H*yqHN}hT?U^};XG_vMigf9$ake*e{4Fn$2|-DyAm+tRApR|8^;%@>=IQ3nIX8n{btU`-dN=*VeL_!k}}S$pq;M z#-b>PWI2pqirv)x+~!oR!Nv+$S~@_qXmwD-%#0mpsdyMg73 z&y6>zqTKTzc~bfK(Mr5!h`{(hMyssGas8w*u>Epc6{YMd^;TXk`SCL=H{km;2ysu@)TmWX%PxvUaN>U5J~dvHXvVcQ~_z3mMjCuu`eT z>@zltAO;~Ijno#&uE+UBgV9b~-kjN)5V*b{+J*@Js|fi5OaJFUgdpZOXf?MubwiIp z)_s2FsB+HXxst;>qjX4N5aY#KzoM$4veh6P%zB8p^=FL4ijOX^7wu1E-46_3;lpCg z%0$GB76KA3*^4W%>iZ4cNoyr3R#No@7<(UkR0JJ;RD`ZXMSsJYR*_Wd_(?axty&Lw zpWGd04dDUj!W7)*--PsPeYjnMZ#T|=u>QPNfptIhqS99&C%NO)=cI*q^tz8&?Tn1o81i&st#o^{;>M&d+>lASJ6REF)oiPnV7RzZwUnm4PL)3SQ8t4c zks4rhy5IDne2-kK?5KUZkVwFdaK}ol-HZ%HyS-tz8E(k6f1aCW_MW676kgwh-H>prs}PcWZXr2Kn zaQn&ODT!DE$V#Y^zNssd#;H0<{_3>{{b@vQy>j7>_6Bf$HiUOGUmh9Hh|%)n&<;|T z1NpuH|ESgUti)k2-+w&BOZ-lpiGrz`S4TW^-?Z}>ErfkFqH%s1RDFlSR0RFvT z5W)f649-34TmqWvSo`aSc7(;4(dxxTa$V%0O?3SMT@ZkjGRwF#XrkM(aDPb-i-^Hs z>k5j?!|$znWFZm{>wgoUZ+GvL&mmDaB{^zz_jQ6iF7#*5r+FGgv$Bo(1-=F6UgZh; zD73nT)P3&WTX?e{%*BS?k%1g8$BoM0xnBCQ642 zt}*+e*KrrCY}nLb?oFMp6`kOyXeNi*4tXi>%(=1?I9pQU%E>*3!Cb-;3m}C3jpZ zX6)IFGoW7ANuzyPqD&vMG=1q&$=dAUXw=d<)M54Rx2}>4lll}aQ_?RPJAuP@jt`|G z6iI$edJCK=nk-Tz+5+F6_`kTmh16kDGU zc!JDdY)cn$*aYY2Lo<90H$s+UDtULVhw(=OCxLflTgu&}MO7o7SHtQ4#b|!!0)ys^ z)k0$5tB>j&R`N6WE+!B8pxgt_hC_q(0Abhm@`nfn6d0skq!}st_H1 zK--K`4?CNe>%3L4K$@9^p?QG1`a$~Wn8|Z#?L2!`5ZAM87j5Hg+@3;r{-_aVR2W4N zm$tQ7rnN+DX1+-|nP)T_FXI&Qd8aKamMe)`o*6Tt>S907+f>{>M;v9oIY0d~;l*_9 z_`!fKRwSdustt!)li?wbu*0uc4E!`x=?quz{zQGR2F9^mgQZUCY>|seSZLq<9nOa( ztAj#`vW4grLk!mQlgiBbU}miltJ#D|)NM-ZEEcR{pV3E7C53aGCyOi>IIBNJW^6&R zpv?&e|AA0NAwpdW0ECLUlh5;Pmae#PHNcS4x|6I(8eeI~IoI7V^@2w<`HKlb`3ZN3 zdFPNa$Wt3|Of-D`X^lS3 z-9EXs1cgO7bWTJDWfbeE(s7`TdJn916A_H0xW=qFx%4V@G62t{U^d>Xl%J=sSyg-B-dQbfN9&{0nfAH;HgQmwCulj=$xO@vI} zB>nH6?xYpqtnke}1K2gV4h{}0SpEYMB2)tk(SL1i&Xts_Ex}SrN4bJsqs_T?A%z@Xl%Rd#)|f{dLNmv3j*4PbYF^J})L^`!XWY4lD92*Y(0le1y6b zvbExx^(DKe8*35If+~^4{51wN zbYtrE_NOiu?`A<}p{QMQ{|QmD_8LD(W`Yr&sK0&SjcZ zBtyliZ|G~THha}zBiOZ_m+guQH~I`ha{chOBQlb^aBMV?(&OLI(dl>ju}Qjk@1$nH z0SjP?RA1_fIm39wU+K9v_fPxtGszRy+0Hr%jCE;WOSSo9Ql1V8{#at<)n@&fTcOdI zuWYK`*+8cK(YpIxN&cxdBa`rMqB$n*I-x1?la(L?z@;aw4a8)XKRf#+#YU#R^o01b zR|}?ss~#NlU0fa}(d~{(oKYwS$FQdmC+P5IzbA~O9F2J#!*|q3<-6lHZBd4$*7mh96h z>>gQEr~9v*0~gpqeo7;tXc0Z~FoAjD=?BmjZSvPSYQ*ssSP|9beXQ@Dw$*!cC5IcM z1D$e3970RxrF8p>v*jg{2)o>7qe#Ws$EGt!UT=|VakSK_yJCf9++PDbK`}K|p^8ha z&y*FDom)1MV=VrKh)4vSJmNiP;`Z1A3zb|kA=B+ zEM8s$_)2k;BO~=Fn_8ZiO8L^vKToBcuIuKw1%}JIG$^?eB=V#q2hhmJuknF_rpgG~lbF;y5t3Au-4}g4(w-QaTf_CJa zP=8vCnQwGt&0DRz@|GMDw$rAse~ zffB%gDiYMNQ?Ro=3PHQR@qrw+0qG;SRmXyvYU-vCtZX=PAUwA@Le(F+uY)Dd8T z2%H&Cb_)W!@L;*&^-`;IgsYL4fOMB>bL=UxK*h$?0A0mu9a#3zA;)wC)gl{qOcbqJ zBniUmUL+X;Smtj`izKI>Q@le(!H*wC_=6e8NreG5GaQ4-JQfP1+i0dy2Lux;VR||3 zVQ3vp&zrz!5(`}3wbqj@sf=mGY>l5)XbJOt9!Dct3O;XXz5=N$F?5F*Zr`X5N`BQy z-&IiniS-4cu10~)MT9?Vl10;Z)~H&7wq#|4BD{K8=BHX!c^4r)=0WR|*p~{QYsD6iL%esxI-4??mUQ>u9IQq&w+Tg;;!_^9n%Y+%25`(By{keC3d&10 z+|M_wf5pcAoRaE>Oein*P$M?@kwBl!do*)uAHOpX)9rDs3bY1})tb}c)g`f|W8d5v zkJElpvyP~>Ke23Hkj@ZsBYe5Jf9KxwDz?lVo$`up`?Q+yoy2kHK65vFF4TAvqp+WI zZH*K-47x7U=0-`%=n1leh%`IlsDpWsx8$jhGrx3UaAZTi(T>55#vD;mlXS>hiL8}Z z&-c~_(qT{r_ki*of5N+^M zC7~8?q}>*~ZpUrZNFEVeJn)lJt>!s7-!-Ghi*DMxw9Dg4+%>J&F= zz#7Oh!w+6aVr|0q)LBQ_qs&i#DN=Zt)kI25^}%y{Ff?xQNg>VX<$+{Pl`cxd|Q8!PJsqMUnY03I4PY5%CwRQFDqbtbIr>Wbl za$y>+1flt%*qPBxx{LyuD;b`n`PWJXr2GnCnLiEUu(V~}hHwf1oT(rM8I#&|VURbD z&Ia49abi90epy^YvF^#QguYb_Ey=m<+o_%^w^GCJQ zaIG=&J<#Zu#ucrTMUp|Fv!9e`&~3VFLZYON+&(et^`T5N%YhPTbjB zayMSkFL)nV+vyH&T*^q*;$>u%e0;u6S^Z*jdi4;HJBFJBRNCj(+q0}rCkrV$VoM`$49H@aNwi{_tz0;qf?&^})eHT9w|7)CZl1_5PA1w|N#Sj37W zTh}jN+-fFj==V~f1YWNR@sA;~@tmf5mF9M=@(bVf8gkz#oI?pcxD+^l4y)$9V*{+3 z>dqD3(294v&a2BwIpkdCn-+mB>lzytK-MQpbnVJ|L6D!-p4W71Hv@(ma?Z#^BF#uY+tXuK@Yhvdb;DsOv7w6KI{muwFya`AWOG9ApCr_#EblIeD2JpPimtGMx4U z35~_7+8bl*yjoJZGHEwsT)g~D>bVg*OOR*S68-Jg2@0K`=IUvX-nu!)8_}j}D+OGz zh(=Lby|KCOVyREP<|*=#G_sRRN5Dlw)23=WV@t89+$=HPw6tdeT8|%hZ6V|+I}`MB zWmz>qxc9JsOJ8z*`iF#2aDXzYkfAa8{qD6=s}GOKVL0x99d9fKTUFOm;8IewuEH7b_ISfvmy41m~sv^lwI% z4)&LLf;WQw>6IB^dQK>O(raX+2^O5*AzLi79O5c?RNJtqNa7%QOn7Mp$oY$t4=s;g zlTdA#^OpA;b1oXo1u3q~?}zDf+w!E!i&o8>sVIJ0&m4UIHCQzl{|iLLmzHL^3r8@D zbRk&Np6s@28$T_VvcXPv;F`(?VLpMj`9G#@+FS}nBMrTrDXMKU6GTDm?Tfr#Qq+3f zxP=Dh9%jbpo@IL`I4un|=e0vR>U`BsS4UV*gLCmV8m43Cz**KI{!h3>duqsyE1G^Z zrf`?UeISI;UIkeqrmU{)uzpY76bZP@j0 z*BKLpJ-6V#vz_>hu!D5eCIoE}J@Vg^KZ%Tdf`WQHlc-iPM1r>6vdi>Fa}pa*+*Hi- zhYE_gzRdhO5$suB!@krzu0KtF=62{iK+QlgHSEp2ZG4rhR6N!5Oq%J`Pbq7Q8S;UEGd)e)eL3a^ zZ>sK@b-(k@c*x0pWZAaTKci`+{1d{3t9WgwM{_jn;^M_M10Q z_+G7Rz!~m}ro7Rp4q`+~hzs3c@0=_ftM!vLwfGonDAdJ%uW_eqMl^P2d?U@vPFls< z;H|uL9_N)w^*Ios%`(*xUKcUFnZ?x{D-iFp6VouK)4VXDeM!`X%AodBmH#a|OdwUy z2GcWFGyJf-$Qb8p(X@mar9?ahl;0pdqK7PNYQUBudLRt#iRTpI?JCvBimj|uJUet5 zPn>hB{Jkvj#x(KJVUQTsN?wY;;-$AblZ0g553MNW&}rfUIKk~GN~fMOdC>j zUZT9)g3GylT<3DpPJ#5;);x2RKn3q)OGfmUX+8m`NQ_p?a^>fOsifJRNmWlO?kgbu z|Fl^8%DEnT)8T53*F2^gFcl|ThS*@y;8>zQ^I;z>6iJL80jICZA? zS(1qJ1#=MjstGhK3MBR9$AKd!%{hNXejE{g7=gx?@+3YhF4~Z}=F!A}85f1(Z!Xun z0}`K!QoMT(Fl@uRgjNHDOp?aS)>PN=>?yk1&>Vm5P2Njc?ke9_yWf&`d4Qmgyq@+X z=v4ctJa9RF^h-NSrvN1B_LZ`(nr?Jm@+9_o%PZZVw`UCEt!+Wzu;0ML-nVS5oVLSv ztTg#MLvIl&$vx2$kDy%MNVbTV@THBI2pU+c9WyC8k|$pP@#{f_j1bzi9r3*!ac>m> z+*HE9S!sIsVV=+YBto(ct|Uk#9QunnKherBuraH_DH?fu;T-X;B2Im`@hdi+uT`Pr zz5d5KWXn2D`ESO{R?yMzWyF)L{+$-x^iXyqrkq{1;ovc`h;_s7xlky-J38^UTt*>Z z@Qy9mCs2ehbRs~A<L|LK59)> zy{c-P**tC$rIr-h=GMgi>Q#|nsmm<5oKcgYqi6(?={nhB=#%?M{9c+gHixiy`Q5vV zkqZ$q?h7Fw6}QXDBtKc|npAKW%g%HbOWAegsi4=b6Bl|QmGQxe3PX}|S68Yj8EUzy z)j`f5_C+TxkXM(^+o|s?L3yS`^(XwmQRbad@iTeLCJPHi`GTiYXU!+ffGsQ3HyV#L zTMEdm~INLx*@_|+lsqHyc1LbaXnvw zvopLYfYx!ng6kgaZ2;-cmx1zTvI3IAn;J04V~N;!{kjiF zEMwefL=cP37ql?Z3r&LbWIw=p+lzGz4=ZN$G0O02qLG=vRrF}r6R9-El9QCaeK{|E&(W12 zc8XC+o^`xxr@{t+T8NADJmswrF&W7pufIuFRy4KBfroh2oEL!Z(S;&X&5+84bT2p! zxtYLW==T|$z>!#fBL_dZl)4X8X~t@*6D=dBCVDeuOQ~>CX2z!pSBblYr&~bCIrfFl z?TyaRv?}lZWMftokrD{%ytuXjN)J>mUJAU}xBV~@CC`l4Idu=51`G5xhM-^6hDcBL znxz@r=YN`RDW5y1>RZfHX4K!0w_#Rhy)n9(7AF$-DVp36LyAK4r}-_Dw@xm}fg(9R zHnX4fx2PJmpD(XfcKKCQg?TZd1+q;F4I6>$7LUE#4vOdeKE-~rl?oIlxOZk5q_2|* z(Sr~UNqzK1dLXL3CE*~ySs1-~)KMmBE*^(YVxy0W9b&xwV#{EzmpjWB8B_kFJotBy3SXjl8lu-i{Cb!MM$d=z#xD9owy zW(z={40#({Xf*_wN!4lOGh;wN1~6K7LTikF}&Ug%I-7p26?A~97BR{?*EDfxb|pF!p{ z1BXzZJ`5<1A0Q2^vY8eY8qJWbH#ic^gsp1Oc=V!g2Nhj-BfjL(HxSgxnT$+nzLp0< z?})9#H)a*BYuEd_%01rSU_s_zZOS+7%cMZvprDv$p8s&)$%d@0%BXfy@k*r4y`j(* zTjigd33h9-66j;55|ID5e2pIyeUj9cL;v}Y2DYPL+0=|#@WeLjKe590UbtL1I{Kr%u8Of01uK-X!rw6YZQ+-<-4`6nuscD|{SNfqEohobt~9xA zVT&>!m%3-(_}-zcjhL{GeKX9V#A*4jC*ZisBG*n^fJ4?W0+baAEok@K6$@cii6HCdm9pj7KFX1hARbvYFLQs}CjXvnWyKu5(GH&b{Be*MZ3uE* z(tDI>y}Vh*CkiHXwzVv@^HP`9ihH57%?qUns_;ncdk%r%%73FE? zvqXw(WQV-$`ZVNparP8Yh(%`elT=C>3Mjiw7L(nTA0`;94RNl1Pw;5>PaBVKExK3XXH=g&l1Vp_J^at+}M!m}i$dGE54uIsk+! zG;Gz6Rca7yzC{nz3I_wvOrqrq3!a2=0bgPOoATLaqsJ^103Ir+0O9xEMW%dTs1>BM`w^fOy zEn=NKXQlZ~^sh_)z5{#T_4pXNQ1s2Ev_6 zGG7wk5+npJ;H#D)Fx>g5ogpvV@4z=9BRJem?cTN0iH~LvKRr()uAN_{;w1ZWx_?;- zRVW8^5`jLd(O96aVZ2dMgVOh0L7Fh2_{8VAk2osBBzV%pUW3Fe2BcTm*+n)nxrq%q z#MSd-vE!o|1s^`nrPzztc?`?_&iVKH#?qYc9?0NtxXnS>!`$|%M-IfI^+i)kElfse zj*!*$mASTf?yBRN>|$=)M&(=}&1S(t*@y|G{VrV}_~sa1uF~_4fH34BifR;1IMrcY zKIY0pz-1q*jp5P1vf3XMQJZx%xn%{IU{dAcC#~C|gutn~T7kZUx(PbR?Z=zS-VLiH z4FWHliYlFq#>(K_f9{pI2;zR4L)PzVZG|oZ*VW=?4*mVh%QI4OBK|&;h~6v2v${8~ zy9XU}jXxRaWv`uF6S5gG{#x|otNS}daphvUBA_7E@Sr=xQA-^*BL9Kg$0lb*FWGS@ z(mbYQw$DnvKsGgSXMy+JE06S``OAPEjo*v90WfD(QTbVH|DE?t(GEM$@ zy}F(N9bSjERqm&=?ii6w8dZ)K7ISoyZTm1g$)XR+%~Ui#LDDqwOm?|J(LK_1ebmJT zTvs|W$I_#XN9MqOyWgL2rUG*3wTtjHqg9?RADj3YpV^$h6cM$(cq{7D{bR*Q)aU-I z)dy8jbYV0WIr#9-Jw=n&NR-cliE7*rCa1Dr9LY#)Uk? zjSu-?VM2#%yz^LqNBfHyjMz1M^w#A8=DO9_zd42Qp}F7s ztoSjFu?BHNlBF2tXhZhP@U{k|*YU|T<0+YwIoa8PDah&2&54(Aa{czwC+`fk85cvh z_)0U(Dy0XpjdHhJiPbsyU^*qgJzG0yVe8wpmljCjJR!##Q~z|F=|spi7UO1r?+Tlh z8a|L$uL2w;A1J9v#FbQekz$GnUl20Z`7*^e|JdS}X0O-fZ@b-~q+v^+17l7mS5Ht( zpZ-}t0Tt^B^Wr_S{_eFM@08+HfyK1uhLTrVb13^vT$4;$v2S4dMkQlT|gv}4}A%eb#&=R!_`--9onLv z)9kVRZ{F~qkp|g2B9*?^-G>T#*ap72o>^SNKov`5%J}?vR>*3sdpCS(EvT*<#oc!m zWklB)zj7kqUP+VU<)xFw-T;m?Ixs(0^TDb>`cPv^y~q`Xnh+MAS$8!05~vahl~mcv z7&-|R-gz}Rd~`^m31O-0`{)D6v_*HJ{Cr94b_{d|XA4x@$Rf8v(lF~zvZI(-d+~JR z70LJ)9qBy085cy0audJA0%-aHXhLbg)gQ`SMv6@8Soelin-yn6vcP?$|Yl9^JXkW33Ay9_FztQ=Ae>{(|QUmycTGF;FF&B2PLea z0z-c>p)S@z8F%BMr*pS6q*t-oeU?#I^jnv%%X)^rs{9@#(s1Sb0~&V)GwP?H_=QLH z8t|`Aix^YvI@GU%l2VH`*RSrDl+wq;9?Y|SvuN3KsCxAT*6i6ZC?h1h)BaLxtnZ5y zt$6hZf=4y>=ve;eH|;gX#qQ7(UK}DYB{m+B;H_Gvw7+ndXB+A9e5BG(){T_z`8VmW zu3i%yk*SyUiV06pdE0wZ`YmN@GO3G^kv6$BYxq!Wx^P}>B{8G70mf2gAhskhrS%Pw z@{43mm(F*L{$4akQx&#jrrWd2-fHU}UjV@KQvziSf!`;Ne?jtjn}N1U7?t0T1q4X= z4_D}9?YZST7 zT=z{0GFJ1LvdlD8;cG)7XS`pk8jG;B2rd1yns)vDspqj9~grEO$p-U zYaoGrsq#9hGVlNd_$i%;Y>=D-D$qSv`Bu!z#_?iVY4j+^(1x#&J8)JzV5Wq#Hzlt%10uB1XK?-S|h!4b(K^#*^|=kqv+I}FNLH!!utdrj}o z!2Zj<{~U+Uzh4?1`@ED}JW4&4mFm+?pk=zRA+;J@qXC8!2@z20)IW%a!tZZ_EEOdY z30|j1zvnGv3_g(D!dF}0-viY48dPal_@2*k$dKM$t>Ya4bs_=}Dfqz^2s!ExZsA^* z27~YGirC2Zef|PUrwrEe%h*pb5aPWHAe_&3GrjuVHy-GEhzy67H=wJGCkbLOBK)CY z;u0di>}Bo6=7A4x+Tq=SqoMW?HA53Gr6!9vb(EXgjdTmXZ;aV)KL&nGZ50Zf)W=zfP;69{=KvkNpOsvcedof1)hD);W-Ik0f_N^e64IBRZ$-YgMH;2Itv5g zEg(Ag_uj{FQ!;{zPckuj?hC-D4hHZOjqiAI`(F_m3(%vq<9S4RHotV(xM~F8Wzz1%s2aaFb*BqYHHK@{~Fpcl?eb^;&27^71GKNd< z@_hq<7kDgm2sb4*sPJJh>7zY7QhPrJUtDi`dGGu_I)LXTDGPwr9Bw1%`I}KVfUcDY z;Jz||GoRu7WERXtyc;26T3%+d{N0J;S*Ymjcg6$GUNE`&;#UC9K2jYNs!<=wTjEbA z%W$3k0`o2&u6co;E181c!S%3r_eKKfl>OWg+^3@sRP2XXU~-q#9l`e}(%H`LLB#PI zSR6wojsE}+7-|pIdJ4=Wb6(0X{Qwo4t3WBgmtmEcf8mC23-Usgm^`fCM`K375@ySN zlL!Nv+8bIeDXsxr<*A~d*<}wFd=!96Ngw&$m&NrkF9aHUMd|*k@XZB6cgx`uL>+F=$=$9A55Tw0s!2W!ACLs_Km|D0D%=!+#NTGZwe57*B_YK z#h(K?c%A=2B>dN+z~rt$=y$y+{hse27(&3IB60r^(B41F<7f(jN$3d};s=NH+Gt^BoQ*|Byt>Zexe$Zns zz3`l_eE^>evn3usx`%tbP%z7mzXtE%$j=vGBJWzrW9Qeq*op^Dl#cIP!ryk}TSyW9 z6?yIG4@sTt3E}tmZ4xzrsS0p)B)r5)h&frC)V;+mQRol=faLSQi*T*r-2ojT303u9 zVWs~%zV|X%+V$qHGux9e7SiOl0f2|PB_j*4arhb%uOwaeb6}wh``ew zmO6hgO)m)%pnrtjVR%o&@bDf4^NU+QR5}lXLsAm@BFy~ot`XM=G2vyYngjdj;m9pM zdlL+3|AQGzNzju5e34Mk5 z_i<)%SgC(22Nw4BXyPv8)dt_QFAeJK``j1Agyy{n5i8%fbQ}aHp{-hAQvYKghM}-M z9K-t;WeXyX|BQV00Y&IEfQRpkD;MEI{#|%HhwyorECF5}Kd8K?^zE-_xP9rs1ilZm zGX5n}pie5VfiLdW(rDmJm)+%oWl@_!WYv?eJ-mEnX(m18!HfX=k@9QM=cdwJMZ04x_y?bW?!H;>;W$)u}-bbMA z{PlLjBZ!bUAf*${uE`G*vN5D8hDnh0>{B{Q1;CV)zQyU`w(}q)joHF46#S~fcM4Kt zPFq5&8Nqj-Q+od-YfXM(yL+r|qzp1a^Ah9Gj*@RP4L?D*s+f)~|k7Yr2)eyMP z6>3er0`*?ZuKf+yd+cj4*Tg&3@8A=XT||}w5E*O2i28?i2j9PpFJui??`!9Fks4b4 zF39c!pbriHpP@nQsBW6Sixv(3Zk%U+_sd^SPien;9Or-k_^&#CQ$m``T7Ai;e1!9qHeqfUhzF zh{=7>!wFqAN3FnjfV9}I?DxHje-Rz&|7w3=2ztO5>u`YK)r>O@p98qxZRpVdpe{=z z?RWCG=gUq?WR|S;+H`40qR#6+*TI2P&C}t4VI70m0|+b-METUxz>~E1V-QIDSq>gF zO8YPlUkyv0{ty70pgIQr4F2Bv=#hSB`ewGhCr}U6;3`4V0!xkGh#+at5j!x3fNqj> zJco~;cW$y*7;4`Devhw^|GpTP8eHE;x!11k@8SBtAN;NyvfCI5nsGYGV;QnNk7$L1%EZ>i&Eq}&_+LP2Mui*>TsaW z{yzN9@HVwW;oZEpz3WEVe85KLubzi5%;oC`ca`Rm-?t&gO~ObDY;3Xo;=OB6OB2DO z5)@p#z`Xe00p_mNau~jyH1i0U!{?)YxN%?>u?qU?3bnZk_a#S9?VwnUH@ABgCV!61^DbA6U zQl2x#aYiKxz5^D;;TyPd`1*T5&lcoX@O9=mw)YHl&|Dkh4p26Bo}?5+9-!fCUk?L( z9A;<{+Qko8zse1O?92WYxOUW_U6dx-?&YMGr%6gT_AbmjG7MV3vOvB9%S%2>Qkv4d zW(ckHE%+^v+VgX-(;cWGd@sBMUj#q}a*PHiXTeRkd4JJ|`uyhSrCosVcHkR`aaSoB_zi%s;IjcXwIq-V`Q|ucc3c2mF3_=3`-WUx{=;$l5%0z9iwE3Lh)nN{f0zx01ZoIaKhgE>ERW~b`YE*!*UL$jx z#ZeR|pmNT1E|K4)tM(p9`Su4M4}U*_e>?!N{NRpY-Gi<{7l1ASg!g|Nx_e!gk^lnp z79iWZU7YVe-vL=Z6Zo3s6JSG~I8%W8eEJMY>CDpNzRSgh0j7n!n2CPR1^)2^?2M7w z-r>Df1A>Cz{F&b$_`wY0zdQX=OZMmX*>$1U2i+4oc(>-uW(w!f?pb$sY5&e6Aat~Y zXntM!4K8ez1&X(9%@RcO^JHLKv^_B;glWDVFwri@k*BZ(f@Mb;*y&~G^(f#c^Z1Sx z6%{i;Tu)SPZf?#D3=ABi<^HAXvjI(iwy1DHb8jydfc@X|br!zSI2S1QTcq&2{&FxV zxswg$@4e`F2D}x|Iv$DZ%n+#Ag{QLGb_Ey$Y|FA9e0A)23ZU^(UbtD7;etOv#U|CQByl`I*i@e zTcA7OP7G+iNT4G*x&y|_P{0-m-zDA#S}I#upu_g08o0)}`{{kyWO6870mHO)1vBEt zIoJzin@z3{?H(*1gAT-clJmh6BSX+Ke{E9EE_XGu%lGPaTI$M$qsQ zuHi7i;-a}BPP6a^Fc5A3eDSvwK2oI2cVMjkpV>uM015f%BXGog0pOCnM4ezy3$g@v zxQ~tf-`S-dkk2zs61=F8?HDhfPBeCB^Zyei{5MH|0OaxWJ2`x1JWOAuIR^M_C3p}O zCxeZV@?;I(DsO>OD3I1S|GVJ;XgGhVbp7`O_=nnCK!884c^>cGmp9-YAAA7lv{K3{{({L(HUc6Ny1cSaguP>(Ogunmag3$EZTt%9=zt}_IXBt1tu_2G91 z97BP4Gpw4~rw52%2jZ}W!}d6smpW*AH;EOVbeI5`L!j6?Y;NK9crGdEtGAmRmKvpc zVB|?+OJ1BD{Rz~QsV8Q%xW6E2qz`0&Y6h(;@c%jLg4yemvz&z9hN*y#G3Pe+d3g=M zYgPqP*oWcR1g0onNOo!0vp@j=Nm***zsG*Q1MWns8dVR8KLO~sa#%eq|E568)Iv_x zJzrlxWPE>&g4HR$erqty)JzR-96bCvz$%Noew^9kjPam@c*9mD@PsWFwCvtoFoWLS zc>?q_qeQ_gIF1OO%s&9DC;GsJo8)1@A`jCy-N5x!>Ia-3^}j#mqXyUvDzxzf%TtR3 zY&Q;V0j-qpZ+>d1>3k4q=!I*z2vA|giMR{HQwYG|`pb@Yxc(tX^fFL8ENMf8Sb7Z1 zVgdHi#wcnY#G;pjO_dFAzHgip%1EzEDTk~rN7+St`?}6aR z%dQ~o1_c2OAsw)s>@zm7I3!uO2Wk)Rp3~%jBNiZNiwJJ3hAyq=#TFG?Esg5_l;GKT zu{n_tIeOCY0dB9UWdRH=TN6L}H8nmpfE7d1AQuQyQNX7{_mv%o^-lnvpTbP`W;6;$ z8J%h7-+Ka3z()=2;GlF(rhST0FrY0>@d${V95p~M8g}A1+J|;|&x;cf5^#{Y0FXjn zsNl5cJcC|2Lhkg2DHaNN?eG(2@I+aO3f>3N4hK??j9vKs@*n?L2K&Go)w8#cegos* z{UHDd@l@Si98CY+M*HD54m9T#OhNeXZU2vdxB-Y<3Del$>2I+9TR(mR*iWsPasFfQ z{YKweK*9oSI1k)Eo?eVJL5dJrR{B7Stfc?iLSq!L2MKu@RrvC(dztPV3 z6u86wGTC!$|9a7jj(|NgUokqUpb2T08R(H>wS{YQI%cE|rvCh>he;C6b#_-z? z`@-vwz@JD0#?Pd9+G5paOeu>RLjNuPs_`?|frbhqK82)GszX;-wDe=dY_+v`^ z77%|J!ym@*OLP3g82&JZKaAlQKlpvn{zqf@!x;WBhChtq4`cY7qVSs_{#!U7cZdS7 WMb0orBM%+`|AYm^`BNXLz5ZW%q^oBD literal 0 HcmV?d00001