diff --git a/10_privilege_level/README.md b/10_privilege_level/README.md index 8b656a19..f6f2529e 100644 --- a/10_privilege_level/README.md +++ b/10_privilege_level/README.md @@ -334,22 +334,24 @@ diff -uNr 09_hw_debug_JTAG/src/arch/aarch64.rs 10_privilege_level/src/arch/aarch //-------------------------------------------------------------------------------------------------- // Global instances //-------------------------------------------------------------------------------------------------- -@@ -61,3 +103,37 @@ +@@ -61,3 +103,39 @@ asm::wfe() } } + +/// Information about the HW state. +pub mod state { ++ use crate::arch::PrivilegeLevel; + use cortex_a::regs::*; + + /// The processing element's current privilege level. -+ pub fn current_privilege_level() -> &'static str { ++ pub fn current_privilege_level() -> (PrivilegeLevel, &'static str) { + let el = CurrentEL.read_as_enum(CurrentEL::EL); + match el { -+ Some(CurrentEL::EL::Value::EL2) => "EL2", -+ Some(CurrentEL::EL::Value::EL1) => "EL1", -+ _ => "Unknown", ++ 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"), + } + } + @@ -373,10 +375,28 @@ diff -uNr 09_hw_debug_JTAG/src/arch/aarch64.rs 10_privilege_level/src/arch/aarch + } +} +diff -uNr 09_hw_debug_JTAG/src/arch.rs 10_privilege_level/src/arch.rs +--- 09_hw_debug_JTAG/src/arch.rs ++++ 10_privilege_level/src/arch.rs +@@ -9,3 +9,13 @@ + + #[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] + pub use aarch64::*; ++ ++/// Architectural privilege level. ++#[allow(missing_docs)] ++#[derive(PartialEq)] ++pub enum PrivilegeLevel { ++ User, ++ Kernel, ++ Hypervisor, ++ Unknown, ++} + diff -uNr 09_hw_debug_JTAG/src/main.rs 10_privilege_level/src/main.rs --- 09_hw_debug_JTAG/src/main.rs +++ 10_privilege_level/src/main.rs -@@ -63,9 +63,17 @@ +@@ -63,9 +63,16 @@ /// The main function running after the early init. fn kernel_main() -> ! { use core::time::Duration; @@ -385,17 +405,16 @@ diff -uNr 09_hw_debug_JTAG/src/main.rs 10_privilege_level/src/main.rs info!("Booting on: {}", bsp::board_name()); + -+ info!( -+ "Current privilege level: {}", -+ arch::state::current_privilege_level() -+ ); ++ let (_, privilege_level) = arch::state::current_privilege_level(); ++ info!("Current privilege level: {}", privilege_level); ++ + info!("Exception handling state:"); + arch::state::print_exception_state(); + info!( "Architectural timer resolution: {} ns", arch::timer().resolution().as_nanos() -@@ -76,11 +84,12 @@ +@@ -76,11 +83,12 @@ info!(" {}. {}", i + 1, driver.compatible()); } diff --git a/10_privilege_level/kernel b/10_privilege_level/kernel index 0178ddf0..e7d4ff70 100755 Binary files a/10_privilege_level/kernel and b/10_privilege_level/kernel differ diff --git a/10_privilege_level/kernel8.img b/10_privilege_level/kernel8.img index 6e226f70..c6083a21 100755 Binary files a/10_privilege_level/kernel8.img and b/10_privilege_level/kernel8.img differ diff --git a/10_privilege_level/src/arch.rs b/10_privilege_level/src/arch.rs index ee958823..84a480e0 100644 --- a/10_privilege_level/src/arch.rs +++ b/10_privilege_level/src/arch.rs @@ -9,3 +9,13 @@ mod aarch64; #[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] pub use aarch64::*; + +/// Architectural privilege level. +#[allow(missing_docs)] +#[derive(PartialEq)] +pub enum PrivilegeLevel { + User, + Kernel, + Hypervisor, + Unknown, +} diff --git a/10_privilege_level/src/arch/aarch64.rs b/10_privilege_level/src/arch/aarch64.rs index 91c80d44..34f85162 100644 --- a/10_privilege_level/src/arch/aarch64.rs +++ b/10_privilege_level/src/arch/aarch64.rs @@ -106,15 +106,17 @@ pub fn wait_forever() -> ! { /// Information about the HW state. pub mod state { + use crate::arch::PrivilegeLevel; use cortex_a::regs::*; /// The processing element's current privilege level. - pub fn current_privilege_level() -> &'static str { + pub fn current_privilege_level() -> (PrivilegeLevel, &'static str) { let el = CurrentEL.read_as_enum(CurrentEL::EL); match el { - Some(CurrentEL::EL::Value::EL2) => "EL2", - Some(CurrentEL::EL::Value::EL1) => "EL1", - _ => "Unknown", + 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"), } } diff --git a/10_privilege_level/src/main.rs b/10_privilege_level/src/main.rs index 92a9d0c6..402b0219 100644 --- a/10_privilege_level/src/main.rs +++ b/10_privilege_level/src/main.rs @@ -67,10 +67,9 @@ fn kernel_main() -> ! { info!("Booting on: {}", bsp::board_name()); - info!( - "Current privilege level: {}", - arch::state::current_privilege_level() - ); + let (_, privilege_level) = arch::state::current_privilege_level(); + info!("Current privilege level: {}", privilege_level); + info!("Exception handling state:"); arch::state::print_exception_state(); diff --git a/11_virtual_memory/README.md b/11_virtual_memory/README.md index 304d4387..8f666114 100644 --- a/11_virtual_memory/README.md +++ b/11_virtual_memory/README.md @@ -601,7 +601,7 @@ diff -uNr 10_privilege_level/src/arch/aarch64.rs 11_virtual_memory/src/arch/aarc + /// Information about the HW state. pub mod state { - use cortex_a::regs::*; + use crate::arch::PrivilegeLevel; diff -uNr 10_privilege_level/src/bsp/rpi/link.ld 11_virtual_memory/src/bsp/rpi/link.ld --- 10_privilege_level/src/bsp/rpi/link.ld @@ -843,10 +843,10 @@ diff -uNr 10_privilege_level/src/main.rs 11_virtual_memory/src/main.rs + info!("MMU online. Special regions:"); + bsp::virt_mem_layout().print_layout(); + - info!( - "Current privilege level: {}", - arch::state::current_privilege_level() -@@ -87,6 +103,13 @@ + let (_, privilege_level) = arch::state::current_privilege_level(); + info!("Current privilege level: {}", privilege_level); + +@@ -86,6 +102,13 @@ info!("Timer test, spinning for 1 second"); arch::timer().spin_for(Duration::from_secs(1)); diff --git a/11_virtual_memory/kernel b/11_virtual_memory/kernel index 0927bfc3..c3beb798 100755 Binary files a/11_virtual_memory/kernel and b/11_virtual_memory/kernel differ diff --git a/11_virtual_memory/kernel8.img b/11_virtual_memory/kernel8.img index 4e6eede4..e43670e0 100755 Binary files a/11_virtual_memory/kernel8.img and b/11_virtual_memory/kernel8.img differ diff --git a/11_virtual_memory/src/arch.rs b/11_virtual_memory/src/arch.rs index ee958823..84a480e0 100644 --- a/11_virtual_memory/src/arch.rs +++ b/11_virtual_memory/src/arch.rs @@ -9,3 +9,13 @@ mod aarch64; #[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] pub use aarch64::*; + +/// Architectural privilege level. +#[allow(missing_docs)] +#[derive(PartialEq)] +pub enum PrivilegeLevel { + User, + Kernel, + Hypervisor, + Unknown, +} diff --git a/11_virtual_memory/src/arch/aarch64.rs b/11_virtual_memory/src/arch/aarch64.rs index 32187b04..be509312 100644 --- a/11_virtual_memory/src/arch/aarch64.rs +++ b/11_virtual_memory/src/arch/aarch64.rs @@ -113,15 +113,17 @@ pub fn mmu() -> &'static impl interface::mm::MMU { /// Information about the HW state. pub mod state { + use crate::arch::PrivilegeLevel; use cortex_a::regs::*; /// The processing element's current privilege level. - pub fn current_privilege_level() -> &'static str { + pub fn current_privilege_level() -> (PrivilegeLevel, &'static str) { let el = CurrentEL.read_as_enum(CurrentEL::EL); match el { - Some(CurrentEL::EL::Value::EL2) => "EL2", - Some(CurrentEL::EL::Value::EL1) => "EL1", - _ => "Unknown", + 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"), } } diff --git a/11_virtual_memory/src/main.rs b/11_virtual_memory/src/main.rs index 1bee9b28..c0b890f6 100644 --- a/11_virtual_memory/src/main.rs +++ b/11_virtual_memory/src/main.rs @@ -83,10 +83,9 @@ fn kernel_main() -> ! { info!("MMU online. Special regions:"); bsp::virt_mem_layout().print_layout(); - info!( - "Current privilege level: {}", - arch::state::current_privilege_level() - ); + let (_, privilege_level) = arch::state::current_privilege_level(); + info!("Current privilege level: {}", privilege_level); + info!("Exception handling state:"); arch::state::print_exception_state(); diff --git a/12_cpu_exceptions_part1/README.md b/12_cpu_exceptions_part1/README.md index 8df70dfe..17ce4e61 100644 --- a/12_cpu_exceptions_part1/README.md +++ b/12_cpu_exceptions_part1/README.md @@ -394,7 +394,6 @@ make chainboot [ 5.780890] Booting on: Raspberry Pi 3 [ 5.783142] MMU online. Special regions: [ 5.787050] 0x00080000 - 0x0008ffff | 64 KiB | C RO PX | Kernel code and RO data -[ 5.795298] 0x1fff0000 - 0x1fffffff | 64 KiB | Dev RW PXN | Remapped Device MMIO [ 5.803285] 0x3f000000 - 0x3fffffff | 16 MiB | Dev RW PXN | Device MMIO [ 5.810492] Current privilege level: EL1 [ 5.814399] Exception handling state: @@ -870,6 +869,39 @@ diff -uNr 11_virtual_memory/src/arch/aarch64.rs 12_cpu_exceptions_part1/src/arch pub fn mmu() -> &'static impl interface::mm::MMU { &MMU +diff -uNr 11_virtual_memory/src/bsp/rpi/virt_mem_layout.rs 12_cpu_exceptions_part1/src/bsp/rpi/virt_mem_layout.rs +--- 11_virtual_memory/src/bsp/rpi/virt_mem_layout.rs ++++ 12_cpu_exceptions_part1/src/bsp/rpi/virt_mem_layout.rs +@@ -15,7 +15,7 @@ + // BSP-public + //-------------------------------------------------------------------------------------------------- + +-pub const NUM_MEM_RANGES: usize = 3; ++pub const NUM_MEM_RANGES: usize = 2; + + pub static LAYOUT: KernelVirtualLayout<{ NUM_MEM_RANGES }> = KernelVirtualLayout::new( + memory_map::END_INCLUSIVE, +@@ -54,19 +54,6 @@ + }, + }, + RangeDescriptor { +- name: "Remapped Device MMIO", +- virtual_range: || { +- // The last 64 KiB slot in the first 512 MiB +- RangeInclusive::new(0x1FFF_0000, 0x1FFF_FFFF) +- }, +- translation: Translation::Offset(memory_map::mmio::BASE + 0x20_0000), +- attribute_fields: AttributeFields { +- mem_attributes: MemAttributes::Device, +- acc_perms: AccessPermissions::ReadWrite, +- execute_never: true, +- }, +- }, +- RangeDescriptor { + name: "Device MMIO", + virtual_range: || { + RangeInclusive::new(memory_map::mmio::BASE, memory_map::mmio::END_INCLUSIVE) + diff -uNr 11_virtual_memory/src/bsp.rs 12_cpu_exceptions_part1/src/bsp.rs --- 11_virtual_memory/src/bsp.rs +++ 12_cpu_exceptions_part1/src/bsp.rs @@ -903,7 +935,7 @@ diff -uNr 11_virtual_memory/src/main.rs 12_cpu_exceptions_part1/src/main.rs if let Err(string) = arch::mmu().init() { panic!("MMU: {}", string); } -@@ -103,13 +106,28 @@ +@@ -102,13 +105,28 @@ info!("Timer test, spinning for 1 second"); arch::timer().spin_for(Duration::from_secs(1)); @@ -939,4 +971,16 @@ diff -uNr 11_virtual_memory/src/main.rs 12_cpu_exceptions_part1/src/main.rs loop { let c = bsp::console().read_char(); +diff -uNr 11_virtual_memory/src/memory.rs 12_cpu_exceptions_part1/src/memory.rs +--- 11_virtual_memory/src/memory.rs ++++ 12_cpu_exceptions_part1/src/memory.rs +@@ -6,6 +6,7 @@ + + use core::{fmt, ops::RangeInclusive}; + ++#[allow(dead_code)] + #[derive(Copy, Clone)] + pub enum Translation { + Identity, + ``` diff --git a/12_cpu_exceptions_part1/kernel b/12_cpu_exceptions_part1/kernel index f4dc62bd..c76e4826 100755 Binary files a/12_cpu_exceptions_part1/kernel and b/12_cpu_exceptions_part1/kernel differ diff --git a/12_cpu_exceptions_part1/kernel8.img b/12_cpu_exceptions_part1/kernel8.img index f393029b..15eda3f2 100755 Binary files a/12_cpu_exceptions_part1/kernel8.img and b/12_cpu_exceptions_part1/kernel8.img differ diff --git a/12_cpu_exceptions_part1/src/arch.rs b/12_cpu_exceptions_part1/src/arch.rs index ee958823..84a480e0 100644 --- a/12_cpu_exceptions_part1/src/arch.rs +++ b/12_cpu_exceptions_part1/src/arch.rs @@ -9,3 +9,13 @@ mod aarch64; #[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] pub use aarch64::*; + +/// Architectural privilege level. +#[allow(missing_docs)] +#[derive(PartialEq)] +pub enum PrivilegeLevel { + User, + Kernel, + Hypervisor, + Unknown, +} diff --git a/12_cpu_exceptions_part1/src/arch/aarch64.rs b/12_cpu_exceptions_part1/src/arch/aarch64.rs index 0b13069c..10672b8c 100644 --- a/12_cpu_exceptions_part1/src/arch/aarch64.rs +++ b/12_cpu_exceptions_part1/src/arch/aarch64.rs @@ -122,15 +122,17 @@ pub fn mmu() -> &'static impl interface::mm::MMU { /// Information about the HW state. pub mod state { + use crate::arch::PrivilegeLevel; use cortex_a::regs::*; /// The processing element's current privilege level. - pub fn current_privilege_level() -> &'static str { + pub fn current_privilege_level() -> (PrivilegeLevel, &'static str) { let el = CurrentEL.read_as_enum(CurrentEL::EL); match el { - Some(CurrentEL::EL::Value::EL2) => "EL2", - Some(CurrentEL::EL::Value::EL1) => "EL1", - _ => "Unknown", + 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"), } } diff --git a/12_cpu_exceptions_part1/src/bsp/rpi/virt_mem_layout.rs b/12_cpu_exceptions_part1/src/bsp/rpi/virt_mem_layout.rs index dedebc1d..5286c852 100644 --- a/12_cpu_exceptions_part1/src/bsp/rpi/virt_mem_layout.rs +++ b/12_cpu_exceptions_part1/src/bsp/rpi/virt_mem_layout.rs @@ -15,7 +15,7 @@ use core::ops::RangeInclusive; // BSP-public //-------------------------------------------------------------------------------------------------- -pub const NUM_MEM_RANGES: usize = 3; +pub const NUM_MEM_RANGES: usize = 2; pub static LAYOUT: KernelVirtualLayout<{ NUM_MEM_RANGES }> = KernelVirtualLayout::new( memory_map::END_INCLUSIVE, @@ -53,19 +53,6 @@ pub static LAYOUT: KernelVirtualLayout<{ NUM_MEM_RANGES }> = KernelVirtualLayout execute_never: false, }, }, - RangeDescriptor { - name: "Remapped Device MMIO", - virtual_range: || { - // The last 64 KiB slot in the first 512 MiB - RangeInclusive::new(0x1FFF_0000, 0x1FFF_FFFF) - }, - translation: Translation::Offset(memory_map::mmio::BASE + 0x20_0000), - attribute_fields: AttributeFields { - mem_attributes: MemAttributes::Device, - acc_perms: AccessPermissions::ReadWrite, - execute_never: true, - }, - }, RangeDescriptor { name: "Device MMIO", virtual_range: || { diff --git a/12_cpu_exceptions_part1/src/main.rs b/12_cpu_exceptions_part1/src/main.rs index f053afea..eec16037 100644 --- a/12_cpu_exceptions_part1/src/main.rs +++ b/12_cpu_exceptions_part1/src/main.rs @@ -86,10 +86,9 @@ fn kernel_main() -> ! { info!("MMU online. Special regions:"); bsp::virt_mem_layout().print_layout(); - info!( - "Current privilege level: {}", - arch::state::current_privilege_level() - ); + let (_, privilege_level) = arch::state::current_privilege_level(); + info!("Current privilege level: {}", privilege_level); + info!("Exception handling state:"); arch::state::print_exception_state(); diff --git a/12_cpu_exceptions_part1/src/memory.rs b/12_cpu_exceptions_part1/src/memory.rs index e9c21ab3..2b6637db 100644 --- a/12_cpu_exceptions_part1/src/memory.rs +++ b/12_cpu_exceptions_part1/src/memory.rs @@ -6,6 +6,7 @@ use core::{fmt, ops::RangeInclusive}; +#[allow(dead_code)] #[derive(Copy, Clone)] pub enum Translation { Identity,