Skip to content

Commit c7a50ec

Browse files
committed
page table builder errors, arm fixes
1 parent 90267e8 commit c7a50ec

File tree

9 files changed

+59
-20
lines changed

9 files changed

+59
-20
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5293,6 +5293,7 @@ name = "page_table"
52935293
version = "0.0.0"
52945294
dependencies = [
52955295
"bitfield-struct 0.11.0",
5296+
"thiserror 2.0.16",
52965297
"zerocopy 0.8.25",
52975298
]
52985299

tmk/tmk_vmm/src/load.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use vm_topology::processor::ProcessorTopology;
2222
use vm_topology::processor::aarch64::Aarch64Topology;
2323
use vm_topology::processor::x86::X86Topology;
2424
use zerocopy::FromBytes as _;
25+
use zerocopy::FromZeros;
2526
use zerocopy::IntoBytes;
2627

2728
/// Loads a TMK, returning the initial registers for the BSP.
@@ -38,12 +39,17 @@ pub fn load_x86(
3839
let load_info = load_common(&mut loader, tmk, test)?;
3940

4041
let page_table_base = load_info.next_available_address;
41-
let page_tables = page_table::x64::build_page_tables_64(
42+
let mut page_table_work_buffer: Vec<page_table::x64::PageTable> =
43+
vec![page_table::x64::PageTable::new_zeroed(); page_table::x64::PAGE_TABLE_MAX_COUNT];
44+
let mut page_tables: Vec<u8> = vec![0 as u8; page_table::x64::PAGE_TABLE_MAX_BYTES];
45+
let page_table_builder = page_table::x64::IdentityMapBuilder::new(
4246
page_table_base,
43-
0,
4447
page_table::IdentityMapSize::Size4Gb,
45-
None,
4648
);
49+
let page_tables = page_table_builder.build(
50+
page_table_work_buffer.as_mut_slice(),
51+
page_tables.as_mut_slice(),
52+
)?;
4753
loader
4854
.import_pages(
4955
page_table_base >> 12,

vm/loader/page_table/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ rust-version.workspace = true
88

99
[dependencies]
1010
bitfield-struct.workspace = true
11+
thiserror.workspace = true
1112
zerocopy.workspace = true
1213
[lints]
1314
workspace = true

vm/loader/page_table/src/aarch64.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -673,13 +673,13 @@ impl<'a> Arm64PageTableSpace<'a> {
673673
}
674674

675675
/// Build a set of Aarch64 page tables identity mapping the given region.
676-
pub fn build_identity_page_tables_aarch64<'a>(
676+
pub fn build_identity_page_tables_aarch64(
677677
page_table_gpa: u64,
678678
start_gpa: u64,
679679
size: u64,
680680
memory_attribute_indirection: MemoryAttributeIndirectionEl1,
681-
page_table_space: &'a mut [u8],
682-
) -> &'a [u8] {
681+
page_table_space: &mut [u8],
682+
) -> &[u8] {
683683
// start_gpa and size must be 2MB aligned.
684684
if !aligned(start_gpa, Arm64PageSize::Large) {
685685
panic!("start_gpa not 2mb aligned");
@@ -710,6 +710,8 @@ pub fn build_identity_page_tables_aarch64<'a>(
710710

711711
#[cfg(test)]
712712
mod tests {
713+
extern crate std;
714+
713715
use super::*;
714716

715717
const DUMP_PAGE_TABLES: bool = false;

vm/loader/page_table/src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@
1010
pub mod aarch64;
1111
pub mod x64;
1212

13+
use thiserror::Error;
14+
15+
/// Errors returned by the Page Table Builder
16+
#[derive(Debug, PartialEq, Eq, Error)]
17+
pub enum Error {
18+
/// The page table [u8] buffer does not match the size of the [PageTable] buffer
19+
#[error("bad buffer size")]
20+
BadBufferSize,
21+
}
22+
1323
/// Size of the initial identity map
1424
#[derive(Debug, Copy, Clone)]
1525
pub enum IdentityMapSize {

vm/loader/page_table/src/x64.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
//! Methods to construct page tables on x64.
55
6+
use crate::Error;
67
use crate::IdentityMapSize;
78
use zerocopy::FromBytes;
89
use zerocopy::Immutable;
@@ -345,8 +346,10 @@ impl PageTableBuilder {
345346
self,
346347
page_table: &mut [PageTable],
347348
flattened_page_table: &'a mut [u8],
348-
) -> &'a [u8] {
349-
assert!(flattened_page_table.len() == (page_table.len() * PAGE_TABLE_SIZE));
349+
) -> Result<&'a [u8], Error> {
350+
if flattened_page_table.len() != (page_table.len() * PAGE_TABLE_SIZE) {
351+
return Err(Error::BadBufferSize);
352+
}
350353

351354
const SIZE_512_GB: u64 = 0x8000000000;
352355

@@ -488,7 +491,11 @@ impl PageTableBuilder {
488491
}
489492

490493
// Flatten page table vec into u8 vec
491-
flatten_page_table(page_table, flattened_page_table, page_table_index + 1)
494+
Ok(flatten_page_table(
495+
page_table,
496+
flattened_page_table,
497+
page_table_index + 1,
498+
))
492499
}
493500
}
494501

@@ -537,8 +544,10 @@ impl IdentityMapBuilder {
537544
self,
538545
page_table: &mut [PageTable],
539546
flattened_page_table: &'a mut [u8],
540-
) -> &'a [u8] {
541-
assert!(flattened_page_table.len() == (page_table.len() * PAGE_TABLE_SIZE));
547+
) -> Result<&'a [u8], Error> {
548+
if flattened_page_table.len() != (page_table.len() * PAGE_TABLE_SIZE) {
549+
return Err(Error::BadBufferSize);
550+
}
542551
// Allocate page tables. There are up to 6 total page tables:
543552
// 1 PML4E (Level 4) (omitted if the address bias is non-zero)
544553
// 1 PDPTE (Level 3)
@@ -615,7 +624,11 @@ impl IdentityMapBuilder {
615624
}
616625

617626
// Flatten page table vec into u8 vec
618-
flatten_page_table(page_table, flattened_page_table, page_table_count)
627+
Ok(flatten_page_table(
628+
page_table,
629+
flattened_page_table,
630+
page_table_count,
631+
))
619632
}
620633
}
621634

vm/loader/src/linux.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ pub enum Error {
129129
UnalignedAddress(u64),
130130
#[error("importer error")]
131131
Importer(#[source] anyhow::Error),
132+
#[error("PageTableBuilder: {0}")]
133+
PageTableBuilder(#[from] page_table::Error),
132134
}
133135

134136
pub struct AcpiConfig<'a> {
@@ -338,11 +340,11 @@ pub fn load_config(
338340
IdentityMapBuilder::new(registers.page_table_address, IdentityMapSize::Size4Gb);
339341
let mut page_table_work_buffer: Vec<PageTable> =
340342
vec![PageTable::new_zeroed(); PAGE_TABLE_MAX_COUNT];
341-
let mut page_table: Vec<u8> = vec![0 as u8; PAGE_TABLE_MAX_BYTES];
343+
let mut page_table: Vec<u8> = vec![0; PAGE_TABLE_MAX_BYTES];
342344
let page_table = page_table_builder.build(
343345
page_table_work_buffer.as_mut_slice(),
344346
page_table.as_mut_slice(),
345-
);
347+
)?;
346348
assert!((page_table.len() as u64).is_multiple_of(HV_PAGE_SIZE));
347349
importer
348350
.import_pages(

vm/loader/src/paravisor.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ pub enum Error {
8686
NotEnoughMemory(u64),
8787
#[error("importer error")]
8888
Importer(#[from] anyhow::Error),
89+
#[error("PageTableBuilder: {0}")]
90+
PageTableBuilder(#[from] page_table::Error),
8991
}
9092

9193
/// Kernel Command line type.
@@ -458,12 +460,12 @@ where
458460

459461
let mut page_table_work_buffer: Vec<PageTable> =
460462
vec![PageTable::new_zeroed(); PAGE_TABLE_MAX_COUNT];
461-
let mut page_table: Vec<u8> = vec![0 as u8; PAGE_TABLE_MAX_BYTES];
463+
let mut page_table: Vec<u8> = vec![0; PAGE_TABLE_MAX_BYTES];
462464

463465
let page_table = page_table_builder.build(
464466
page_table_work_buffer.as_mut_slice(),
465467
page_table.as_mut_slice(),
466-
);
468+
)?;
467469

468470
assert!((page_table.len() as u64).is_multiple_of(HV_PAGE_SIZE));
469471
let page_table_page_base = page_table_region_start / HV_PAGE_SIZE;

vm/loader/src/uefi/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,8 @@ pub enum Error {
334334
InvalidConfigType(String),
335335
#[error("Importer error")]
336336
Importer(#[source] anyhow::Error),
337+
#[error("PageTableBuilder: {0}")]
338+
PageTableBuilder(#[from] page_table::Error),
337339
}
338340

339341
#[derive(Debug)]
@@ -410,7 +412,7 @@ pub mod x86_64 {
410412

411413
let mut page_table_work_buffer: Vec<PageTable> =
412414
vec![PageTable::new_zeroed(); PAGE_TABLE_MAX_COUNT];
413-
let mut page_tables: Vec<u8> = vec![0 as u8; PAGE_TABLE_MAX_BYTES];
415+
let mut page_tables: Vec<u8> = vec![0; PAGE_TABLE_MAX_BYTES];
414416
let page_table_builder =
415417
IdentityMapBuilder::new(PAGE_TABLE_GPA_BASE, IdentityMapSize::Size4Gb);
416418
let mut shared_vis_page_table_work_buffer: Vec<PageTable> = Vec::new();
@@ -442,21 +444,21 @@ pub mod x86_64 {
442444
let shared_vis_page_tables = shared_vis_builder.build(
443445
shared_vis_page_table_work_buffer.as_mut_slice(),
444446
shared_vis_page_tables.as_mut_slice(),
445-
);
447+
)?;
446448

447449
let page_tables = page_table_builder
448450
.with_pml4e_link((shared_vis_page_table_gpa, shared_gpa_boundary))
449451
.build(
450452
page_table_work_buffer.as_mut_slice(),
451453
page_tables.as_mut_slice(),
452-
);
454+
)?;
453455

454456
(page_tables, Some(shared_vis_page_tables))
455457
} else {
456458
let page_tables = page_table_builder.build(
457459
page_table_work_buffer.as_mut_slice(),
458460
page_tables.as_mut_slice(),
459-
);
461+
)?;
460462
(page_tables, None)
461463
};
462464

0 commit comments

Comments
 (0)