Skip to content

Commit 324c3c4

Browse files
committed
include active page table flags in translate() result struct
1 parent 2b9df60 commit 324c3c4

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

src/structures/paging/mapper/mapped_page_table.rs

+18-3
Original file line numberDiff line numberDiff line change
@@ -377,17 +377,27 @@ impl<'a, P: PhysToVirt> MapperAllSizes for MappedPageTable<'a, P> {
377377
Err(PageTableWalkError::NotMapped) => return TranslateResult::PageNotMapped,
378378
Err(PageTableWalkError::MappedToHugePage) => {
379379
let frame = PhysFrame::containing_address(p3[addr.p3_index()].addr());
380+
let flags = p3[addr.p3_index()].flags();
380381
let offset = addr.as_u64() & 0o_777_777_7777;
381-
return TranslateResult::Frame1GiB { frame, offset };
382+
return TranslateResult::Frame1GiB {
383+
frame,
384+
offset,
385+
flags,
386+
};
382387
}
383388
};
384389
let p1 = match self.page_table_walker.next_table(&p2[addr.p2_index()]) {
385390
Ok(page_table) => page_table,
386391
Err(PageTableWalkError::NotMapped) => return TranslateResult::PageNotMapped,
387392
Err(PageTableWalkError::MappedToHugePage) => {
388393
let frame = PhysFrame::containing_address(p2[addr.p2_index()].addr());
394+
let flags = p2[addr.p2_index()].flags();
389395
let offset = addr.as_u64() & 0o_777_7777;
390-
return TranslateResult::Frame2MiB { frame, offset };
396+
return TranslateResult::Frame2MiB {
397+
frame,
398+
offset,
399+
flags,
400+
};
391401
}
392402
};
393403

@@ -402,7 +412,12 @@ impl<'a, P: PhysToVirt> MapperAllSizes for MappedPageTable<'a, P> {
402412
Err(()) => return TranslateResult::InvalidFrameAddress(p1_entry.addr()),
403413
};
404414
let offset = u64::from(addr.page_offset());
405-
TranslateResult::Frame4KiB { frame, offset }
415+
let flags = p1_entry.flags();
416+
TranslateResult::Frame4KiB {
417+
frame,
418+
offset,
419+
flags,
420+
}
406421
}
407422
}
408423

src/structures/paging/mapper/mod.rs

+15-3
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,15 @@ pub trait MapperAllSizes: Mapper<Size4KiB> + Mapper<Size2MiB> + Mapper<Size1GiB>
3636
fn translate_addr(&self, addr: VirtAddr) -> Option<PhysAddr> {
3737
match self.translate(addr) {
3838
TranslateResult::PageNotMapped | TranslateResult::InvalidFrameAddress(_) => None,
39-
TranslateResult::Frame4KiB { frame, offset } => Some(frame.start_address() + offset),
40-
TranslateResult::Frame2MiB { frame, offset } => Some(frame.start_address() + offset),
41-
TranslateResult::Frame1GiB { frame, offset } => Some(frame.start_address() + offset),
39+
TranslateResult::Frame4KiB { frame, offset, .. } => {
40+
Some(frame.start_address() + offset)
41+
}
42+
TranslateResult::Frame2MiB { frame, offset, .. } => {
43+
Some(frame.start_address() + offset)
44+
}
45+
TranslateResult::Frame1GiB { frame, offset, .. } => {
46+
Some(frame.start_address() + offset)
47+
}
4248
}
4349
}
4450
}
@@ -53,20 +59,26 @@ pub enum TranslateResult {
5359
Frame4KiB {
5460
/// The mapped frame.
5561
frame: PhysFrame<Size4KiB>,
62+
/// Flags in the pagetable for this entry
63+
flags: PageTableFlags,
5664
/// The offset whithin the mapped frame.
5765
offset: u64,
5866
},
5967
/// The page is mapped to a physical frame of size 2MiB.
6068
Frame2MiB {
6169
/// The mapped frame.
6270
frame: PhysFrame<Size2MiB>,
71+
/// Flags in the pagetable for this entry
72+
flags: PageTableFlags,
6373
/// The offset whithin the mapped frame.
6474
offset: u64,
6575
},
6676
/// The page is mapped to a physical frame of size 2MiB.
6777
Frame1GiB {
6878
/// The mapped frame.
6979
frame: PhysFrame<Size1GiB>,
80+
/// Flags in the pagetable for this entry
81+
flags: PageTableFlags,
7082
/// The offset whithin the mapped frame.
7183
offset: u64,
7284
},

src/structures/paging/mapper/recursive_page_table.rs

+18-3
Original file line numberDiff line numberDiff line change
@@ -562,8 +562,13 @@ impl<'a> MapperAllSizes for RecursivePageTable<'a> {
562562
}
563563
if p3_entry.flags().contains(PageTableFlags::HUGE_PAGE) {
564564
let frame = PhysFrame::containing_address(p3[addr.p3_index()].addr());
565+
let flags = p3[addr.p3_index()].flags();
565566
let offset = addr.as_u64() & 0o_777_777_7777;
566-
return TranslateResult::Frame1GiB { frame, offset };
567+
return TranslateResult::Frame1GiB {
568+
frame,
569+
offset,
570+
flags,
571+
};
567572
}
568573

569574
let p2 = unsafe { &*(p2_ptr(page, self.recursive_index)) };
@@ -573,8 +578,13 @@ impl<'a> MapperAllSizes for RecursivePageTable<'a> {
573578
}
574579
if p2_entry.flags().contains(PageTableFlags::HUGE_PAGE) {
575580
let frame = PhysFrame::containing_address(p2[addr.p2_index()].addr());
581+
let flags = p2[addr.p2_index()].flags();
576582
let offset = addr.as_u64() & 0o_777_7777;
577-
return TranslateResult::Frame2MiB { frame, offset };
583+
return TranslateResult::Frame2MiB {
584+
frame,
585+
offset,
586+
flags,
587+
};
578588
}
579589

580590
let p1 = unsafe { &*(p1_ptr(page, self.recursive_index)) };
@@ -591,7 +601,12 @@ impl<'a> MapperAllSizes for RecursivePageTable<'a> {
591601
Err(()) => return TranslateResult::InvalidFrameAddress(p1_entry.addr()),
592602
};
593603
let offset = u64::from(addr.page_offset());
594-
TranslateResult::Frame4KiB { frame, offset }
604+
let flags = p1_entry.flags();
605+
TranslateResult::Frame4KiB {
606+
frame,
607+
offset,
608+
flags,
609+
}
595610
}
596611
}
597612

0 commit comments

Comments
 (0)