vmbase: Explicitly map valid memory ranges
The new version of aarch64-paging crate introduces a breaking change in
'Mapping::map_range' API. Unless 'Attributes::VALID' is explicitly
passed to 'map_range', the VALID bit is no longer set in leaf page table
entries (blocks and pages).
This change explicitly sets the VALID bit in all places where `map_range`
is called.
Bug: 245267332
Test: atest MicrodroidTestApp
Change-Id: Ide81433f2b719f35cdf7a80b7694b63e79a0275e
diff --git a/pvmfw/src/mmu.rs b/pvmfw/src/mmu.rs
index e33dcba..da8c4b5 100644
--- a/pvmfw/src/mmu.rs
+++ b/pvmfw/src/mmu.rs
@@ -26,8 +26,10 @@
// We assume that:
// - MAIR_EL1.Attr0 = "Device-nGnRE memory" (0b0000_0100)
// - MAIR_EL1.Attr1 = "Normal memory, Outer & Inner WB Non-transient, R/W-Allocate" (0b1111_1111)
-const MEMORY: Attributes = Attributes::NORMAL.union(Attributes::NON_GLOBAL);
-const DEVICE: Attributes = Attributes::DEVICE_NGNRE.union(Attributes::EXECUTE_NEVER);
+const MEMORY: Attributes =
+ Attributes::NORMAL.union(Attributes::NON_GLOBAL).union(Attributes::VALID);
+const DEVICE: Attributes =
+ Attributes::DEVICE_NGNRE.union(Attributes::EXECUTE_NEVER).union(Attributes::VALID);
const CODE: Attributes = MEMORY.union(Attributes::READ_ONLY);
const DATA: Attributes = MEMORY.union(Attributes::EXECUTE_NEVER);
const RODATA: Attributes = DATA.union(Attributes::READ_ONLY);
diff --git a/rialto/src/main.rs b/rialto/src/main.rs
index 03fa107..0f92d3f 100644
--- a/rialto/src/main.rs
+++ b/rialto/src/main.rs
@@ -44,21 +44,21 @@
const PT_ROOT_LEVEL: usize = 1;
const PT_ASID: usize = 1;
-const PROT_DEV: Attributes = Attributes::from_bits_truncate(
- Attributes::DEVICE_NGNRE.bits() | Attributes::EXECUTE_NEVER.bits(),
-);
-const PROT_RX: Attributes = Attributes::from_bits_truncate(
- Attributes::NORMAL.bits() | Attributes::NON_GLOBAL.bits() | Attributes::READ_ONLY.bits(),
-);
-const PROT_RO: Attributes = Attributes::from_bits_truncate(
- Attributes::NORMAL.bits()
- | Attributes::NON_GLOBAL.bits()
- | Attributes::READ_ONLY.bits()
- | Attributes::EXECUTE_NEVER.bits(),
-);
-const PROT_RW: Attributes = Attributes::from_bits_truncate(
- Attributes::NORMAL.bits() | Attributes::NON_GLOBAL.bits() | Attributes::EXECUTE_NEVER.bits(),
-);
+const PROT_DEV: Attributes =
+ Attributes::DEVICE_NGNRE.union(Attributes::EXECUTE_NEVER).union(Attributes::VALID);
+const PROT_RX: Attributes = Attributes::NORMAL
+ .union(Attributes::NON_GLOBAL)
+ .union(Attributes::READ_ONLY)
+ .union(Attributes::VALID);
+const PROT_RO: Attributes = Attributes::NORMAL
+ .union(Attributes::NON_GLOBAL)
+ .union(Attributes::READ_ONLY)
+ .union(Attributes::EXECUTE_NEVER)
+ .union(Attributes::VALID);
+const PROT_RW: Attributes = Attributes::NORMAL
+ .union(Attributes::NON_GLOBAL)
+ .union(Attributes::EXECUTE_NEVER)
+ .union(Attributes::VALID);
#[global_allocator]
static HEAP_ALLOCATOR: LockedHeap<32> = LockedHeap::<32>::new();
diff --git a/vmbase/example/src/main.rs b/vmbase/example/src/main.rs
index 3bf850c..90a0ec2 100644
--- a/vmbase/example/src/main.rs
+++ b/vmbase/example/src/main.rs
@@ -82,17 +82,23 @@
check_alloc();
let mut idmap = IdMap::new(ASID, ROOT_LEVEL);
- idmap.map_range(&DEVICE_REGION, Attributes::DEVICE_NGNRE | Attributes::EXECUTE_NEVER).unwrap();
+ idmap
+ .map_range(
+ &DEVICE_REGION,
+ Attributes::VALID | Attributes::DEVICE_NGNRE | Attributes::EXECUTE_NEVER,
+ )
+ .unwrap();
idmap
.map_range(
&text_range().into(),
- Attributes::NORMAL | Attributes::NON_GLOBAL | Attributes::READ_ONLY,
+ Attributes::VALID | Attributes::NORMAL | Attributes::NON_GLOBAL | Attributes::READ_ONLY,
)
.unwrap();
idmap
.map_range(
&rodata_range().into(),
- Attributes::NORMAL
+ Attributes::VALID
+ | Attributes::NORMAL
| Attributes::NON_GLOBAL
| Attributes::READ_ONLY
| Attributes::EXECUTE_NEVER,
@@ -101,26 +107,36 @@
idmap
.map_range(
&scratch_range().into(),
- Attributes::NORMAL | Attributes::NON_GLOBAL | Attributes::EXECUTE_NEVER,
+ Attributes::VALID
+ | Attributes::NORMAL
+ | Attributes::NON_GLOBAL
+ | Attributes::EXECUTE_NEVER,
)
.unwrap();
idmap
.map_range(
&boot_stack_range().into(),
- Attributes::NORMAL | Attributes::NON_GLOBAL | Attributes::EXECUTE_NEVER,
+ Attributes::VALID
+ | Attributes::NORMAL
+ | Attributes::NON_GLOBAL
+ | Attributes::EXECUTE_NEVER,
)
.unwrap();
idmap
.map_range(
&dtb_range().into(),
- Attributes::NORMAL
+ Attributes::VALID
+ | Attributes::NORMAL
| Attributes::NON_GLOBAL
| Attributes::READ_ONLY
| Attributes::EXECUTE_NEVER,
)
.unwrap();
idmap
- .map_range(&get_bar_region(&pci_info), Attributes::DEVICE_NGNRE | Attributes::EXECUTE_NEVER)
+ .map_range(
+ &get_bar_region(&pci_info),
+ Attributes::VALID | Attributes::DEVICE_NGNRE | Attributes::EXECUTE_NEVER,
+ )
.unwrap();
info!("Activating IdMap...");