From 373f4753dcd44d1740cb1c352f492862d0292bb6 Mon Sep 17 00:00:00 2001 From: Berkus Decker Date: Sat, 14 Nov 2020 03:54:15 +0200 Subject: [PATCH] Disable alignment checks right on boot Specifically, before we print any numbers - rust core fmt_u64 uses a little optimisation that ldrh/strh to unaligned addresses. --- Cargo.lock | 4 ++-- nucleus/Cargo.toml | 2 +- nucleus/src/arch/aarch64/boot.rs | 25 +++++++++++++------------ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9545f3e..355cd61 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,9 +20,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cortex-a" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda21b8ec67b82099401559fe28cea4508eb1e33217b4dacf60ba22e39b486b1" +checksum = "a389514c1229e12a03c0e8de8b357671b71e1d1bdab3a4f5b591abc94169cba8" dependencies = [ "register", ] diff --git a/nucleus/Cargo.toml b/nucleus/Cargo.toml index 1b2eca7..d369e52 100644 --- a/nucleus/Cargo.toml +++ b/nucleus/Cargo.toml @@ -26,7 +26,7 @@ qemu = ["qemu-exit"] [dependencies] r0 = "1.0" qemu-exit = { version = "1.0", optional = true } -cortex-a = "4.0" +cortex-a = "4.1.0" ux = { version = "0.1.3", default-features = false } usize_conversions = "0.2.0" bit_field = "0.10.0" diff --git a/nucleus/src/arch/aarch64/boot.rs b/nucleus/src/arch/aarch64/boot.rs index 90fea6f..11cd71e 100644 --- a/nucleus/src/arch/aarch64/boot.rs +++ b/nucleus/src/arch/aarch64/boot.rs @@ -77,6 +77,7 @@ fn shared_setup_and_enter_pre() { SCTLR_EL1::I::NonCacheable + SCTLR_EL1::C::NonCacheable + SCTLR_EL1::M::Disable + + SCTLR_EL1::A::Disable, ); // Set Hypervisor Configuration Register (EL2) @@ -142,18 +143,18 @@ fn setup_and_enter_el1_from_el3() -> ! { // Set Secure Configuration Register (EL3) SCR_EL3.write(SCR_EL3::RW::NextELIsAarch64 + SCR_EL3::NS::NonSecure); - // Set Saved Program Status Register (EL3) - // 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_EL3.write( - SPSR_EL3::D::Masked - + SPSR_EL3::A::Masked - + SPSR_EL3::I::Masked - + SPSR_EL3::F::Masked - + SPSR_EL3::M::EL1h, // Use SP_EL1 - ); + // Set Saved Program Status Register (EL3) + // 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_EL3.write( + SPSR_EL3::D::Masked + + SPSR_EL3::A::Masked + + SPSR_EL3::I::Masked + + SPSR_EL3::F::Masked + + SPSR_EL3::M::EL1h, // Use SP_EL1 + ); // Make the Exception Link Register (EL3) point to reset(). ELR_EL3.set(reset as *const () as u64);