Skip to content

Commit da5e9e7

Browse files
committed
feat(paging): Also return flags for MapperAllSizes::translate()
Extend `TranslateResult` returned by `MapperAllSizes::translate()` with the page flags. This way, there is a method to get the flags for the page of a `VirtAddr`.
1 parent e824cf6 commit da5e9e7

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
@@ -539,7 +539,12 @@ impl<'a, P: PhysToVirt> MapperAllSizes for MappedPageTable<'a, P> {
539539
Err(PageTableWalkError::MappedToHugePage) => {
540540
let frame = PhysFrame::containing_address(p3[addr.p3_index()].addr());
541541
let offset = addr.as_u64() & 0o_777_777_7777;
542-
return TranslateResult::Frame1GiB { frame, offset };
542+
let flags = p3[addr.p3_index()].flags();
543+
return TranslateResult::Frame1GiB {
544+
frame,
545+
offset,
546+
flags,
547+
};
543548
}
544549
};
545550
let p1 = match self.page_table_walker.next_table(&p2[addr.p2_index()]) {
@@ -548,7 +553,12 @@ impl<'a, P: PhysToVirt> MapperAllSizes for MappedPageTable<'a, P> {
548553
Err(PageTableWalkError::MappedToHugePage) => {
549554
let frame = PhysFrame::containing_address(p2[addr.p2_index()].addr());
550555
let offset = addr.as_u64() & 0o_777_7777;
551-
return TranslateResult::Frame2MiB { frame, offset };
556+
let flags = p2[addr.p2_index()].flags();
557+
return TranslateResult::Frame2MiB {
558+
frame,
559+
offset,
560+
flags,
561+
};
552562
}
553563
};
554564

@@ -563,7 +573,12 @@ impl<'a, P: PhysToVirt> MapperAllSizes for MappedPageTable<'a, P> {
563573
Err(()) => return TranslateResult::InvalidFrameAddress(p1_entry.addr()),
564574
};
565575
let offset = u64::from(addr.page_offset());
566-
TranslateResult::Frame4KiB { frame, offset }
576+
let flags = p1_entry.flags();
577+
TranslateResult::Frame4KiB {
578+
frame,
579+
offset,
580+
flags,
581+
}
567582
}
568583
}
569584

src/structures/paging/mapper/mod.rs

+15-3
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,15 @@ pub trait MapperAllSizes: Mapper<Size4KiB> + Mapper<Size2MiB> + Mapper<Size1GiB>
3939
fn translate_addr(&self, addr: VirtAddr) -> Option<PhysAddr> {
4040
match self.translate(addr) {
4141
TranslateResult::PageNotMapped | TranslateResult::InvalidFrameAddress(_) => None,
42-
TranslateResult::Frame4KiB { frame, offset } => Some(frame.start_address() + offset),
43-
TranslateResult::Frame2MiB { frame, offset } => Some(frame.start_address() + offset),
44-
TranslateResult::Frame1GiB { frame, offset } => Some(frame.start_address() + offset),
42+
TranslateResult::Frame4KiB { frame, offset, .. } => {
43+
Some(frame.start_address() + offset)
44+
}
45+
TranslateResult::Frame2MiB { frame, offset, .. } => {
46+
Some(frame.start_address() + offset)
47+
}
48+
TranslateResult::Frame1GiB { frame, offset, .. } => {
49+
Some(frame.start_address() + offset)
50+
}
4551
}
4652
}
4753
}
@@ -58,20 +64,26 @@ pub enum TranslateResult {
5864
frame: PhysFrame<Size4KiB>,
5965
/// The offset whithin the mapped frame.
6066
offset: u64,
67+
/// The flags for the frame.
68+
flags: PageTableFlags,
6169
},
6270
/// The page is mapped to a physical frame of size 2MiB.
6371
Frame2MiB {
6472
/// The mapped frame.
6573
frame: PhysFrame<Size2MiB>,
6674
/// The offset whithin the mapped frame.
6775
offset: u64,
76+
/// The flags for the frame.
77+
flags: PageTableFlags,
6878
},
6979
/// The page is mapped to a physical frame of size 2MiB.
7080
Frame1GiB {
7181
/// The mapped frame.
7282
frame: PhysFrame<Size1GiB>,
7383
/// The offset whithin the mapped frame.
7484
offset: u64,
85+
/// The flags for the frame.
86+
flags: PageTableFlags,
7587
},
7688
/// The given page is not mapped to a physical frame.
7789
PageNotMapped,

src/structures/paging/mapper/recursive_page_table.rs

+18-3
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,12 @@ impl<'a> MapperAllSizes for RecursivePageTable<'a> {
778778
if p3_entry.flags().contains(PageTableFlags::HUGE_PAGE) {
779779
let frame = PhysFrame::containing_address(p3[addr.p3_index()].addr());
780780
let offset = addr.as_u64() & 0o_777_777_7777;
781-
return TranslateResult::Frame1GiB { frame, offset };
781+
let flags = p3[addr.p3_index()].flags();
782+
return TranslateResult::Frame1GiB {
783+
frame,
784+
offset,
785+
flags,
786+
};
782787
}
783788

784789
let p2 = unsafe { &*(p2_ptr(page, self.recursive_index)) };
@@ -789,7 +794,12 @@ impl<'a> MapperAllSizes for RecursivePageTable<'a> {
789794
if p2_entry.flags().contains(PageTableFlags::HUGE_PAGE) {
790795
let frame = PhysFrame::containing_address(p2[addr.p2_index()].addr());
791796
let offset = addr.as_u64() & 0o_777_7777;
792-
return TranslateResult::Frame2MiB { frame, offset };
797+
let flags = p2[addr.p2_index()].flags();
798+
return TranslateResult::Frame2MiB {
799+
frame,
800+
offset,
801+
flags,
802+
};
793803
}
794804

795805
let p1 = unsafe { &*(p1_ptr(page, self.recursive_index)) };
@@ -806,7 +816,12 @@ impl<'a> MapperAllSizes for RecursivePageTable<'a> {
806816
Err(()) => return TranslateResult::InvalidFrameAddress(p1_entry.addr()),
807817
};
808818
let offset = u64::from(addr.page_offset());
809-
TranslateResult::Frame4KiB { frame, offset }
819+
let flags = p1_entry.flags();
820+
TranslateResult::Frame4KiB {
821+
frame,
822+
offset,
823+
flags,
824+
}
810825
}
811826
}
812827

0 commit comments

Comments
 (0)