Abstract CPU privilege level

pull/41/head
Andre Richter 5 years ago
parent a732ee399a
commit d43f70f92a
No known key found for this signature in database
GPG Key ID: 2116C1AB102F615E

@ -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());
}

Binary file not shown.

Binary file not shown.

@ -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,
}

@ -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"),
}
}

@ -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();

@ -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));

Binary file not shown.

Binary file not shown.

@ -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,
}

@ -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"),
}
}

@ -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();

@ -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,
```

Binary file not shown.

@ -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,
}

@ -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"),
}
}

@ -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: || {

@ -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();

@ -6,6 +6,7 @@
use core::{fmt, ops::RangeInclusive};
#[allow(dead_code)]
#[derive(Copy, Clone)]
pub enum Translation {
Identity,

Loading…
Cancel
Save